Browse Source

包租协议虚拟车位

guoshuai 1 month ago
parent
commit
ef1dd28a23

+ 15 - 0
src/main/java/com/qmrb/system/pojo/form/ContractPlaceNumberRelForm.java

@@ -68,5 +68,20 @@ public class ContractPlaceNumberRelForm {
 	@Schema(description = "协议ID",type="Long")
     private Long contractId;
 
+    /**
+     * 停车天数
+     */
+    @Schema(description = "停车天数",type="Long")
+    private Long parkDays;
+    /**
+     * 车辆重量
+     */
+    @Schema(description = "车辆重量",type="Double")
+    private Double carWeight;
+    /**
+     * 虚拟车位号
+     */
+    @Schema(description = "虚拟车位号",type="String")
+    private String  virtualSlotNumber;
 
 }

+ 2 - 0
src/main/java/com/qmrb/system/service/IVirtualParkingSlotService.java

@@ -60,4 +60,6 @@ public interface IVirtualParkingSlotService extends IService<VirtualParkingSlot>
      * @return
      */
 	Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Integer parkDays, Date currentDate);
+	
+	public void releaseVirtualParking();
 }

+ 12 - 0
src/main/java/com/qmrb/system/service/impl/ContractPlaceNumberRelServiceImpl.java

@@ -14,9 +14,11 @@ import com.qmrb.system.mapper.BarnRecordMapper;
 import com.qmrb.system.mapper.ContractPlaceNumberRelMapper;
 import com.qmrb.system.pojo.entity.*;
 import com.qmrb.system.pojo.form.ContractPlaceNumberRelForm;
+import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
 import com.qmrb.system.pojo.query.ContractPlaceNumberRelQuery;
 import com.qmrb.system.pojo.vo.ContractPlaceNumberRelVO;
 import com.qmrb.system.service.*;
+import groovy.time.BaseDuration;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -66,6 +68,8 @@ public class ContractPlaceNumberRelServiceImpl extends ServiceImpl<ContractPlace
      */
     @Override
     public Page<ContractPlaceNumberRelVO> getPage(ContractPlaceNumberRelQuery queryParams) {
+        // 释放已到期的虚拟车位
+        virtualParkingSlotService.releaseVirtualParking();
         Page<ContractPlaceNumberRelVO> pageResult = new Page<>();
         // 查询参数
         int pageNum = queryParams.getPageNum();
@@ -197,6 +201,14 @@ 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 ,"车位已被占用");
+        virtualParkingSlot.setStatus("1");//占用
+        virtualParkingSlot.setSlotType(StrUtil.equals("1",form.getCarType())? "small" : "large");
+        virtualParkingSlot.setCurrentPlateNumber(form.getPlateNumber());
+        virtualParkingSlot.setLastOccupiedTime(form.getStartTime());
+        virtualParkingSlot.setLastReleasedTime(form.getEndTime());
+        virtualParkingSlotService.updateById(virtualParkingSlot);
         ContractPlaceNumberRel entity = converter.form2Entity(form);
         entity.setId(id);
         boolean result = this.updateById(entity);

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

@@ -211,7 +211,7 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 			List<VirtualParkingSlot> freeVirtualParkingSlots = this.list(new LambdaQueryWrapper<VirtualParkingSlot>()
 					.eq(VirtualParkingSlot::getStatus, "0")//空闲
 					.eq(VirtualParkingSlot::getContractId, contractPlaceNumberRel.getContractId())
-					.orderByAsc(VirtualParkingSlot::getContractId));
+					.orderByDesc(VirtualParkingSlot::getLastReleasedTime));
 			Assert.isTrue(CollectionUtil.isNotEmpty(freeVirtualParkingSlots),"无可用车位");
 			virtualParkingSlot = freeVirtualParkingSlots.get(0);
 			virtualParkingSlot.setStatus("1");//占用
@@ -256,17 +256,14 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		// 结束时间固定为次日(N+1)14:00
 		Date endTime = DateUtil.parse(DateUtil.format(DateUtil.offset(currentDate, DateField.DAY_OF_MONTH, parkDays), "yyyy-MM-dd") + " 14:00:00");
 		lastReleasedTime = endTime;
-		log.info("开始时间:{}→结束时间:{} ===>{}",lastOccupiedTime,lastReleasedTime, JSON.toJSON(virtualParkingSlot));
 		// 登记时间段(开始时间→结束时间)不得与该虚拟车位有效的历史记录重叠
 		if(virtualParkingSlot.getLastOccupiedTime() != null && virtualParkingSlot.getLastReleasedTime() != null){
 
-			log.info("222222:{}→结束时间:{}",virtualParkingSlot.getLastOccupiedTime(),virtualParkingSlot.getLastReleasedTime());
 			if(this.isOverlap(virtualParkingSlot.getLastOccupiedTime(),virtualParkingSlot.getLastReleasedTime(),lastOccupiedTime,lastReleasedTime)){
 				return Result.failed("车位启用时间或到期时间有误!");
 			}
 		}
 		String hour = DateUtil.format(lastReleasedTime, "HH");
-		log.info("hour:{}",hour);
 		if(!StrUtil.equals(hour,"14")){
 			return Result.failed("到期时间必须为次日14时!");
 		}
@@ -292,7 +289,8 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		// 3. 核心逻辑:判断是否有重叠(左闭右开区间)
 		return start1.before(end2) && start2.before(end1);
 	}
-
+	
+	@Override
 	public void releaseVirtualParking(){
 		log.info("定时释放虚拟车位:开始:" +  LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
 		List<VirtualParkingSlot> list = this.list(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getStatus, "1"));
@@ -312,8 +310,6 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		}
 		log.info("定时释放虚拟车位数:" + releasedList.size() +  LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
 		releasedList = releasedList.stream().map(iter->{
-			iter.setLastReleasedTime(null);
-			iter.setLastOccupiedTime(null);
 			iter.setCurrentPlateNumber(null);
 			iter.setSlotType("small");
 			iter.setStatus("0");