瀏覽代碼

包租登记车牌

guoshuai 1 月之前
父節點
當前提交
030bc14fbe

+ 34 - 2
src/main/java/com/qmrb/system/controller/ContractPlaceNumberRelController.java

@@ -3,17 +3,23 @@ package com.qmrb.system.controller;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qmrb.system.framework.security.util.SecurityUtils;
 import com.qmrb.system.pojo.entity.Contract;
 import com.qmrb.system.pojo.entity.ContractPlaceNumberRel;
 import com.qmrb.system.pojo.entity.ContractPlaceNumberRelHis;
+import com.qmrb.system.pojo.entity.VirtualParkingSlot;
 import com.qmrb.system.service.IContractPlaceNumberRelHisService;
 import com.qmrb.system.service.IContractService;
+import com.qmrb.system.service.IVirtualParkingSlotService;
 import com.qmrb.system.utils.DateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springdoc.core.annotations.ParameterObject;
@@ -68,6 +74,9 @@ public class ContractPlaceNumberRelController {
     IContractPlaceNumberRelHisService contractPlaceNumberRelHisService;
     
     @Autowired
+    IVirtualParkingSlotService virtualParkingSlotService;
+    
+    @Autowired
     IContractService contractService;
 
     @Operation(summary = "协议车牌历史记录分页列表", security = {@SecurityRequirement(name = "Authorization")})
@@ -139,17 +148,40 @@ public class ContractPlaceNumberRelController {
         // 逻辑删除
         List<Long> idList = Arrays.asList(ids.split(",")).stream()
                 .map(idStr -> Long.parseLong(idStr)).collect(Collectors.toList());
-        boolean result = contractPlaceNumberRelService.removeByIds(idList);
         List<ContractPlaceNumberRel> contractPlaceNumberRels = contractPlaceNumberRelService.listByIds(idList);
-        if (result) {
+        if (CollectionUtil.isNotEmpty(idList)) {
+            ArrayList<String > virtualSlotNumbers = new ArrayList<>();
             for (ContractPlaceNumberRel contractPlaceNumberRel : contractPlaceNumberRels) {
                 // 更新历史记录表
                 ContractPlaceNumberRelHis contractPlaceNumberRelHis = new ContractPlaceNumberRelHis();
                 BeanUtils.copyProperties(contractPlaceNumberRel, contractPlaceNumberRelHis, "id");
                 contractPlaceNumberRelHis.setStatus("4");// 0停用1启用 2到期 3新增 4删除 5修改
                 contractPlaceNumberRelHisService.save(contractPlaceNumberRelHis);
+                virtualSlotNumbers.add(contractPlaceNumberRel.getVirtualSlotNumber());
+
             }
+
+            // 释放虚拟车位
+            boolean update = virtualParkingSlotService.update(
+                    new LambdaUpdateWrapper<VirtualParkingSlot>()
+                            .in(VirtualParkingSlot::getVirtualSlotNumber, virtualSlotNumbers)
+                            .eq(VirtualParkingSlot::getContractId, contractPlaceNumberRels.get(0).getContractId())
+                            .set(VirtualParkingSlot::getStatus, "0")
+            );
+
         }
+        
+        // boolean result = contractPlaceNumberRelService.removeByIds(idList);
+        boolean result = contractPlaceNumberRelService.update(
+                new LambdaUpdateWrapper<ContractPlaceNumberRel>()
+                        .in(ContractPlaceNumberRel::getId, idList)
+                        .set(ContractPlaceNumberRel::getPhone, null)
+                        .set(ContractPlaceNumberRel::getPlateNumber, null)
+                        .set(ContractPlaceNumberRel::getStatus, null)
+                        .set(ContractPlaceNumberRel::getParkDays, null)
+                        .set(ContractPlaceNumberRel::getCarWeight, null)
+        );
+
         return Result.judge(result);
     }
 

+ 6 - 0
src/main/java/com/qmrb/system/mapper/ContractPlaceNumberRelMapper.java

@@ -7,6 +7,10 @@ import com.qmrb.system.pojo.entity.SysUser;
 import com.qmrb.system.pojo.query.ContractPlaceNumberRelQuery;
 import com.qmrb.system.pojo.vo.ContractPlaceNumberRelVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * <p>
@@ -20,4 +24,6 @@ import org.apache.ibatis.annotations.Mapper;
 public interface ContractPlaceNumberRelMapper extends BaseMapper<ContractPlaceNumberRel> {
 
     Page<ContractPlaceNumberRelVO> getAdminPage(Page<Object> objectPage, String role, SysUser sysUser, ContractPlaceNumberRelQuery queryParams);
+
+    List<ContractPlaceNumberRel> getCurrentPlaceNumberRel(@Param("contractId") Long contractId,@Param("startTime") Date startTime,@Param("endOfDay") Date endOfDay);
 }

+ 2 - 0
src/main/java/com/qmrb/system/pojo/query/ContractPlaceNumberRelQuery.java

@@ -23,6 +23,8 @@ public class ContractPlaceNumberRelQuery extends BasePageQuery{
     private String startTimeEnd;
     private String endTimeBegin;
     private String endTimeEnd;
+    
+    private String currentTime;
     /**
      * 协议名称
      */

+ 30 - 8
src/main/java/com/qmrb/system/service/impl/ContractPlaceNumberRelServiceImpl.java

@@ -201,8 +201,20 @@ public class ContractPlaceNumberRelServiceImpl extends ServiceImpl<ContractPlace
      */
     @Override
     public boolean updateForm(Long id, ContractPlaceNumberRelForm form) {
-        VirtualParkingSlot virtualParkingSlot = virtualParkingSlotService.getOne(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getVirtualSlotNumber, form.getVirtualSlotNumber()).eq(VirtualParkingSlot::getStatus,"0"));
-        Assert.isTrue(virtualParkingSlot != null ,"车位已被占用");
+        LambdaQueryWrapper<VirtualParkingSlot> queryWrapper = new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getVirtualSlotNumber, form.getVirtualSlotNumber());
+        // 非管理员不能编辑
+        if(!SecurityUtils.getRoles().contains("ADMIN")){
+            queryWrapper.eq(VirtualParkingSlot::getStatus, "0");
+        }else{
+            queryWrapper.in(VirtualParkingSlot::getStatus, "0","1");
+        }
+            
+        VirtualParkingSlot virtualParkingSlot = virtualParkingSlotService.getOne(queryWrapper);
+        // 非管理员不能编辑
+        if(!SecurityUtils.getRoles().contains("ADMIN")){
+            Assert.isTrue(virtualParkingSlot != null ,"车位已被占用");
+        }
+        
         virtualParkingSlot.setStatus("1");//占用
         virtualParkingSlot.setSlotType(StrUtil.equals("1",form.getCarType())? "small" : "large");
         virtualParkingSlot.setCurrentPlateNumber(form.getPlateNumber());
@@ -210,6 +222,12 @@ public class ContractPlaceNumberRelServiceImpl extends ServiceImpl<ContractPlace
         virtualParkingSlot.setLastReleasedTime(form.getEndTime());
         virtualParkingSlotService.updateById(virtualParkingSlot);
         ContractPlaceNumberRel entity = converter.form2Entity(form);
+
+        ContractPlaceNumberRel contractPlaceNumberRel = this.getById(id);
+        log.info("更新后初始化车牌记录!!!!======》{}----:{}",form.getEndTime().before(contractPlaceNumberRel.getStartTime()),DateUtil.format(form.getStartTime(), "yyyy-MM-dd").compareTo(DateUtil.format(contractPlaceNumberRel.getStartTime(), "yyyy-MM-dd")));
+        if(form.getEndTime().before(contractPlaceNumberRel.getStartTime()) || DateUtil.format(form.getStartTime(), "yyyy-MM-dd").compareTo(DateUtil.format(contractPlaceNumberRel.getStartTime(), "yyyy-MM-dd")) > 0){
+            this.initContractRelByVirtual(contractPlaceNumberRel.getContractId(),LocalDateTimeUtil.of(contractPlaceNumberRel.getStartTime()));
+        }
         entity.setId(id);
         boolean result = this.updateById(entity);
         if (result) {
@@ -369,12 +387,16 @@ public class ContractPlaceNumberRelServiceImpl extends ServiceImpl<ContractPlace
 
         LocalDateTime endDateTime = LocalDateTimeUtil.beginOfDay(currentDate).plusDays(1).withHour(14).withMinute(0).withSecond(0);
         Date endTime = Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant());//隔天14:00:00
-        // 获取有效期包含当天的车牌登记记录
-        List<ContractPlaceNumberRel> contractPlaceNumberRels = this.list(
-                new LambdaQueryWrapper<ContractPlaceNumberRel>()
-                        .eq(ContractPlaceNumberRel::getContractId, contractId)
-                        .le(ContractPlaceNumberRel::getStartTime, endOfDay)
-                        .ge(ContractPlaceNumberRel::getStartTime, startTime)
+        // // 获取有效期包含当天的车牌登记记录
+        // List<ContractPlaceNumberRel> contractPlaceNumberRels = this.list(
+        //         new LambdaQueryWrapper<ContractPlaceNumberRel>()
+        //                 .eq(ContractPlaceNumberRel::getContractId, contractId)
+        //                 .ge(ContractPlaceNumberRel::getEndTime, startTime)
+        //                 .le(ContractPlaceNumberRel::getStartTime, endOfDay)
+        // );
+        // 获取当天创建的或有效期包含当天的车牌登记记录
+        List<ContractPlaceNumberRel> contractPlaceNumberRels = baseMapper.getCurrentPlaceNumberRel(
+                contractId,startTime,endOfDay
         );
         
         // 当天车位已初始化

+ 16 - 7
src/main/java/com/qmrb/system/service/impl/VirtualParkingSlotServiceImpl.java

@@ -9,6 +9,7 @@ import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.qmrb.system.common.result.Result;
+import com.qmrb.system.framework.security.util.SecurityUtils;
 import com.qmrb.system.pojo.entity.Contract;
 import com.qmrb.system.pojo.entity.ContractPlaceNumberRel;
 import com.qmrb.system.service.IContractPlaceNumberRelHisService;
@@ -232,12 +233,16 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 			return Result.failed("虚拟车位不存在!");
 		}
 
-		// 申请的登记日期不能已登记的时间之内 
-		if(virtualParkingSlot.getLastReleasedTime() != null && currentDate.after(DateUtil.offset(virtualParkingSlot.getLastReleasedTime(), DateField.DAY_OF_MONTH, -1)) && currentDate.before(virtualParkingSlot.getLastReleasedTime())){
-			log.info("{}====>{}",DateUtil.offset(virtualParkingSlot.getLastReleasedTime(), DateField.DAY_OF_MONTH, -1),virtualParkingSlot.getLastReleasedTime());
-			return Result.failed("该车位当天已有登记记录!");
+		// 非管理员不能编辑
+		if(!SecurityUtils.getRoles().contains("ADMIN")){
+			// 申请的登记日期不能已登记的时间之内 
+			if(virtualParkingSlot.getLastReleasedTime() != null && currentDate.after(DateUtil.offset(virtualParkingSlot.getLastReleasedTime(), DateField.DAY_OF_MONTH, -1)) && currentDate.before(virtualParkingSlot.getLastReleasedTime())){
+				log.info("{}====>{}",DateUtil.offset(virtualParkingSlot.getLastReleasedTime(), DateField.DAY_OF_MONTH, -1),virtualParkingSlot.getLastReleasedTime());
+				return Result.failed("该车位当天已有登记记录!");
+			}
 		}
 		
+		
 		Date lastOccupiedTime = null;//开始时间
 		Date lastReleasedTime = virtualParkingSlot.getLastReleasedTime();//结束时间
 		if(StrUtil.equals(plateNumber,virtualParkingSlot.getCurrentPlateNumber()) && lastReleasedTime != null ){
@@ -259,9 +264,13 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		// 登记时间段(开始时间→结束时间)不得与该虚拟车位有效的历史记录重叠
 		if(virtualParkingSlot.getLastOccupiedTime() != null && virtualParkingSlot.getLastReleasedTime() != null){
 
-			if(this.isOverlap(virtualParkingSlot.getLastOccupiedTime(),virtualParkingSlot.getLastReleasedTime(),lastOccupiedTime,lastReleasedTime)){
-				return Result.failed("车位启用时间或到期时间有误!");
+			// 非管理员不能编辑
+			if(!SecurityUtils.getRoles().contains("ADMIN")){
+				if(this.isOverlap(virtualParkingSlot.getLastOccupiedTime(),virtualParkingSlot.getLastReleasedTime(),lastOccupiedTime,lastReleasedTime)){
+					return Result.failed("车位启用时间或到期时间有误!");
+				}
 			}
+			
 		}
 		String hour = DateUtil.format(lastReleasedTime, "HH");
 		if(!StrUtil.equals(hour,"14")){
@@ -300,7 +309,7 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		Date now = new Date();
 		List<VirtualParkingSlot> releasedList = new ArrayList<>();
 		for (VirtualParkingSlot virtualParkingSlot : list) {
-			if(now.after(virtualParkingSlot.getLastReleasedTime())){
+			if(virtualParkingSlot.getLastReleasedTime()!= null && now.after(virtualParkingSlot.getLastReleasedTime())){
 				releasedList.add(virtualParkingSlot);
 			}
 		}

+ 24 - 1
src/main/resources/mapper/ContractPlaceNumberRelMapper.xml

@@ -10,8 +10,12 @@
         contract_place_number_rel cpnr
         LEFT JOIN
         contract c ON cpnr.contract_id = c.id
+        left outer join virtual_parking_slot vps 
+            on vps.virtual_slot_number COLLATE utf8mb4_0900_ai_ci = cpnr.virtual_slot_number COLLATE utf8mb4_0900_ai_ci 
+            and vps.contract_id =cpnr.contract_id
         <where>
             1=1
+            and (vps.status = 1 or vps.status = 2) 
             <if test="role == 'ADMIN'">
                 <!-- 当role为ADMIN时,不添加额外条件,查询所有 -->
 
@@ -26,10 +30,29 @@
                 AND cpnr.start_time &lt;= #{queryParams.startTimeEnd}
                 AND cpnr.end_time &gt;= #{queryParams.endTime}
             </if>
+
+            <!--<if test="queryParams.currentTime != null and queryParams.currentTime != ''">-->
+            <!--    AND cpnr.start_time &lt;= #{queryParams.currentTime}-->
+            <!--    AND cpnr.end_time &gt;= #{queryParams.currentTime}-->
+            <!--</if>-->
             <if test="queryParams.endTimeBegin != null and queryParams.endTimeBegin != '' and queryParams.endTimeEnd != null and queryParams.endTimeEnd != ''">
                 AND cpnr.create_time between #{queryParams.endTimeBegin} and #{queryParams.endTimeEnd}
             </if>
         </where>
-        order by cpnr.update_time desc
+        order by cpnr.virtual_slot_number desc
+    </select>
+    <select id="getCurrentPlaceNumberRel" resultType="com.qmrb.system.pojo.entity.ContractPlaceNumberRel">
+        SELECT 
+            * 
+        FROM contract_place_number_rel 
+        WHERE contract_id = #{contractId} 
+        and(
+        -- 开始时间和结束时间都在指定时间段内
+        start_time &lt;= #{startTime}
+        AND end_time &gt;= #{endOfDay}
+        ) OR (
+        -- 开始时间为查询时间开始的当天
+        DATE(start_time) = DATE_FORMAT(#{startTime}, '%Y-%m-%d')
+        )
     </select>
 </mapper>