guoshuai hace 5 días
padre
commit
2b20c8b4f2

+ 2 - 1
src/main/java/com/qmrb/system/controller/VirtualParkingSlotController.java

@@ -109,9 +109,10 @@ public class VirtualParkingSlotController{
     public Result<VirtualParkingSlotForm> validParingSlot(
             @RequestParam String slotNumber,
             @RequestParam String plateNumber,
+            @RequestParam Integer parkDays,
             @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date currentDate
             ) {
-        Result<VirtualParkingSlotForm> result = virtualParkingSlotService.validParingSlot(slotNumber,plateNumber,currentDate);
+        Result<VirtualParkingSlotForm> result = virtualParkingSlotService.validParingSlot(slotNumber,plateNumber,parkDays,currentDate);
         return result;
     }
 }

+ 17 - 1
src/main/java/com/qmrb/system/pojo/entity/ContractPlaceNumberRel.java

@@ -70,7 +70,23 @@ public class ContractPlaceNumberRel extends BaseEntity {
      * 协议ID
      */
     @TableField("contract_id")
-    private Long contractId;
+    private Long contractId;    
+    /**
+     * 协议ID
+     */
+    @TableField("park_days")
+    private Long parkDays;    
+    /**
+     * 协议ID
+     */
+    @TableField("car_weight")
+    private Double carWeight;    
+    /**
+     * 协议ID
+     */
+    @TableField("virtual_slot_number")
+    private String  virtualSlotNumber;    
+
 
 
 }

+ 15 - 1
src/main/java/com/qmrb/system/pojo/vo/ContractPlaceNumberRelVO.java

@@ -117,7 +117,21 @@ public class ContractPlaceNumberRelVO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime updateTime;
 
-
+    /**
+     * 停车天数
+     */
+    @Schema(description = "停车天数",type="Long")
+    private Long parkDays;
+    /**
+     * 车辆重量
+     */
+    @Schema(description = "车辆重量",type="Double")
+    private Double carWeight;
+    /**
+     * 虚拟车位号
+     */
+    @Schema(description = "虚拟车位号",type="String")
+    private String  virtualSlotNumber;
 
 
 

+ 11 - 0
src/main/java/com/qmrb/system/service/IContractPlaceNumberRelService.java

@@ -9,7 +9,9 @@ import com.qmrb.system.pojo.query.ContractPlaceNumberRelQuery;
 import com.qmrb.system.pojo.vo.ContractPlaceNumberRelVO;
 import jakarta.validation.Valid;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -51,4 +53,13 @@ public interface IContractPlaceNumberRelService extends IService<ContractPlaceNu
 	Map<String,Object> getDenomination(Long recordId);
 
 	public List<ContractPlaceNumberRel> findValidRegistrations(String plateNumber, LocalDateTime entryTime);
+
+
+	/**
+	 * 根据协议的虚拟车位生成当天的车牌记录
+	 * @param contractId 协议id
+	 * @param currentDate 
+	 * @return
+	 */
+	public List<ContractPlaceNumberRel> initContractRelByVirtual(Long contractId, LocalDateTime currentDate);
 }

+ 9 - 8
src/main/java/com/qmrb/system/service/IVirtualParkingSlotService.java

@@ -51,12 +51,13 @@ public interface IVirtualParkingSlotService extends IService<VirtualParkingSlot>
 	public VirtualParkingSlotForm assignParkingSpot(ContractPlaceNumberRel contractPlaceNumberRel);
 
 	/**
-	 * 校验虚拟车位
-	 *
-	 * @param slotNumber
-	 * @param plateNumber
-	 * @param currentDate
-	 * @return
-	 */
-	Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Date currentDate);
+     * 校验虚拟车位
+     *
+     * @param slotNumber
+     * @param plateNumber
+     * @param parkDays
+     * @param currentDate
+     * @return
+     */
+	Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Integer parkDays, Date currentDate);
 }

+ 61 - 6
src/main/java/com/qmrb/system/service/impl/ContractPlaceNumberRelServiceImpl.java

@@ -2,8 +2,7 @@ package com.qmrb.system.service.impl;
 
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUnit;
-import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.*;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -27,10 +26,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
-import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 
 /**
@@ -83,6 +81,16 @@ public class ContractPlaceNumberRelServiceImpl extends ServiceImpl<ContractPlace
         if (roles.contains("ADMIN")) {
             role = "ADMIN";
         }
+        // 初始化当天车牌登记记录
+        if(StrUtil.isNotBlank(queryParams.getStartTimeBegin()) && sysUser.getContractId() != null){
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            this.initContractRelByVirtual(sysUser.getContractId(), LocalDateTime.parse(queryParams.getStartTimeBegin(), formatter));
+        }
+        if(StrUtil.isNotBlank(queryParams.getStartTimeBegin())){
+            DateTime endTime = DateUtil.offset(DateUtil.parse(queryParams.getStartTimeBegin(), "yyyy-MM-dd HH:mm:ss"), DateField.DAY_OF_MONTH, 1);
+            queryParams.setEndTime(endTime); 
+        }
+        
         pageResult = baseMapper.getAdminPage(new Page<>(pageNum, pageSize), role, sysUser, queryParams);
         // 管理员查看所有车牌登记情况
         if (StringUtils.isNotBlank(role)) {
@@ -336,4 +344,51 @@ public class ContractPlaceNumberRelServiceImpl extends ServiceImpl<ContractPlace
         return this.list(queryWrapper);
     }
 
+    @Override
+    public List<ContractPlaceNumberRel> initContractRelByVirtual(Long contractId, LocalDateTime currentDate) {
+        List<VirtualParkingSlot> list = virtualParkingSlotService.list(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getContractId, contractId).orderByAsc(VirtualParkingSlot::getId));
+        if(CollectionUtil.isEmpty(list)){
+            return null;
+        }
+        ZonedDateTime zonedDateTime = LocalDateTimeUtil.beginOfDay(currentDate).atZone(ZoneId.systemDefault());
+        Date startTime = Date.from(zonedDateTime.toInstant());//00:00:00
+        ZonedDateTime zonedDateTime2 = LocalDateTimeUtil.endOfDay(currentDate).atZone(ZoneId.systemDefault());
+        Date endOfDay = Date.from(zonedDateTime2.toInstant());//23:59:59
+
+        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)
+        );
+        
+        // 当天车位已初始化
+        if(CollectionUtil.isNotEmpty(contractPlaceNumberRels) && contractPlaceNumberRels.size() == list.size()){
+            return null;
+        }
+        ArrayList<String> virtualSlotMumbers = new ArrayList<>();
+        List<ContractPlaceNumberRel> currentDayContractPlaceNumberRels = new ArrayList<>();
+        if(CollectionUtil.isNotEmpty(contractPlaceNumberRels)){
+            contractPlaceNumberRels.forEach(iter->{
+                virtualSlotMumbers.add(iter.getVirtualSlotNumber());
+            });
+        }
+        
+        list.stream().forEach(iter->{
+            if(!virtualSlotMumbers.contains(iter.getVirtualSlotNumber())){
+                ContractPlaceNumberRel contractPlaceNumberRel = new ContractPlaceNumberRel();
+                contractPlaceNumberRel.setVirtualSlotNumber(iter.getVirtualSlotNumber());
+                contractPlaceNumberRel.setStartTime(startTime);
+                contractPlaceNumberRel.setEndTime(endTime);
+                contractPlaceNumberRel.setContractId(contractId);
+                currentDayContractPlaceNumberRels.add(contractPlaceNumberRel);
+            }
+        });
+        this.saveBatch(currentDayContractPlaceNumberRels);
+        return currentDayContractPlaceNumberRels;
+    }
+
 }

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

@@ -226,7 +226,7 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 	}
 
 	@Override
-	public Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Date currentDate) {
+	public Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Integer parkDays, Date currentDate) {
 		VirtualParkingSlot virtualParkingSlot = this.getOne(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getVirtualSlotNumber, slotNumber));
 		if(virtualParkingSlot == null){
 			return Result.failed("虚拟车位不存在!");
@@ -254,7 +254,7 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		}
 
 		// 结束时间固定为次日(N+1)14:00
-		Date endTime = DateUtil.parse(DateUtil.format(DateUtil.offset(currentDate, DateField.DAY_OF_MONTH, 1), "yyyy-MM-dd") + " 14:00: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));
 		// 登记时间段(开始时间→结束时间)不得与该虚拟车位有效的历史记录重叠

+ 2 - 2
src/main/resources/mapper/ContractPlaceNumberRelMapper.xml

@@ -23,8 +23,8 @@
                 AND c.contract_name like concat('%', #{queryParams.contractName}, '%')
             </if>
             <if test="queryParams.startTimeBegin != null and queryParams.startTimeBegin != '' and queryParams.startTimeEnd != null and queryParams.startTimeEnd != ''">
-                AND cpnr.start_time &lt;= #{queryParams.startTimeBegin}
-                AND cpnr.end_time &gt;= #{queryParams.startTimeEnd}
+                AND cpnr.start_time &lt;= #{queryParams.startTimeEnd}
+                AND cpnr.end_time &gt;= #{queryParams.endTime}
             </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}