Browse Source

虚拟车位规则

guoshuai 1 month ago
parent
commit
226035053f

+ 31 - 0
src/main/java/com/qmrb/system/controller/ContractPlaceNumberRelController.java

@@ -1,13 +1,21 @@
 package com.qmrb.system.controller;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
 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.service.IContractPlaceNumberRelHisService;
+import com.qmrb.system.service.IContractService;
+import com.qmrb.system.utils.DateUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,12 +59,16 @@ import lombok.RequiredArgsConstructor;
 @RestController
 @RequestMapping("/api/v1/contract_place_number_rel")
 @RequiredArgsConstructor
+@Slf4j
 public class ContractPlaceNumberRelController {
 
     private final IContractPlaceNumberRelService contractPlaceNumberRelService;
 
     @Autowired
     IContractPlaceNumberRelHisService contractPlaceNumberRelHisService;
+    
+    @Autowired
+    IContractService contractService;
 
     @Operation(summary = "协议车牌历史记录分页列表", security = {@SecurityRequirement(name = "Authorization")})
     @GetMapping("/getHistoryPage")
@@ -80,6 +92,15 @@ public class ContractPlaceNumberRelController {
     @Operation(summary = "新增协议(客商)车牌关系", security = {@SecurityRequirement(name = "Authorization")})
     @PostMapping
     public Result<ContractPlaceNumberRelForm> saveForm(@RequestBody @Valid ContractPlaceNumberRelForm form) {
+        Contract contract = contractService.getById(form.getContractId());
+        Date startOfDay = DateUtils.getStartOfDay(contract.getStartDate());
+        Date endOfDay = DateUtils.getEndOfDay(contract.getEndDate());
+        if(form.getStartTime().before(startOfDay) || form.getStartTime().after(endOfDay)){
+            return Result.failed("启用时间在包租协议有效期外");
+        }
+        if(form.getEndTime().before(startOfDay) || form.getEndTime().after(endOfDay)){
+            return Result.failed("到期时间在包租协议有效期外");
+        }
         ContractPlaceNumberRelForm result = contractPlaceNumberRelService.saveForm(form);
         return Result.success(result);
     }
@@ -95,6 +116,16 @@ public class ContractPlaceNumberRelController {
     @PutMapping(value = "/{id}")
     public Result<?> updateForm(@Parameter(description = "协议(客商)车牌关系ID") @PathVariable Long id, @RequestBody @Validated ContractPlaceNumberRelForm form) {
 
+        Contract contract = contractService.getById(form.getContractId());
+        Date startOfDay = DateUtils.getStartOfDay(contract.getStartDate());
+        Date endOfDay = DateUtils.getEndOfDay(contract.getEndDate());
+        log.info("修改协议(客商)车牌关系:====>{}--{}",startOfDay,endOfDay);
+        if(form.getStartTime().before(startOfDay) || form.getStartTime().after(endOfDay)){
+            return Result.failed("启用时间在包租协议有效期外");
+        }
+        if(form.getEndTime().before(startOfDay) || form.getEndTime().after(endOfDay)){
+            return Result.failed("到期时间在包租协议有效期外");
+        }
         boolean result = contractPlaceNumberRelService.updateForm(id, form);
         return Result.judge(result);
     }

+ 19 - 9
src/main/java/com/qmrb/system/controller/VirtualParkingSlotController.java

@@ -1,21 +1,16 @@
 package com.qmrb.system.controller;
 
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -32,7 +27,6 @@ import com.qmrb.system.pojo.query.VirtualParkingSlotQuery;
 import com.qmrb.system.pojo.vo.Option;
 
 import cn.hutool.core.util.StrUtil;
-import org.springframework.web.bind.annotation.RestController;
 import jakarta.validation.Valid;
 
 /**
@@ -104,4 +98,20 @@ public class VirtualParkingSlotController{
         boolean result = virtualParkingSlotService.removeByIds(idList);
         return Result.judge(result);
     }
+
+    /**
+     * 校验虚拟车位
+     * @param slotNumber
+     * @return
+     */
+    @Operation(summary = "校验虚拟车位", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/validParingSlot")
+    public Result<VirtualParkingSlotForm> validParingSlot(
+            @RequestParam String slotNumber,
+            @RequestParam String plateNumber,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date currentDate
+            ) {
+        Result<VirtualParkingSlotForm> result = virtualParkingSlotService.validParingSlot(slotNumber,plateNumber,currentDate);
+        return result;
+    }
 }

+ 6 - 8
src/main/java/com/qmrb/system/pojo/entity/VirtualParkingSlot.java

@@ -1,11 +1,9 @@
 package com.qmrb.system.pojo.entity;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.*;
 import com.qmrb.system.common.base.BaseEntity;
 import java.util.Date;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableField;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -39,7 +37,7 @@ public class VirtualParkingSlot extends BaseEntity {
     /**
      * 车位类型
      */
-    @TableField("slot_type")
+    @TableField(value = "slot_type",updateStrategy = FieldStrategy.IGNORED)
     private String slotType;
 
     /**
@@ -57,19 +55,19 @@ public class VirtualParkingSlot extends BaseEntity {
     /**
      * 当前停放车牌
      */
-    @TableField("current_plate_number")
+    @TableField(value = "current_plate_number",updateStrategy = FieldStrategy.IGNORED)
     private String currentPlateNumber;
 
     /**
      * 最近占用开始时间
      */
-    @TableField("last_occupied_time")
+    @TableField(value = "last_occupied_time",updateStrategy = FieldStrategy.IGNORED)
     private Date lastOccupiedTime;
 
     /**
      * 最近释放时间
      */
-    @TableField("last_released_time")
+    @TableField(value = "last_released_time",updateStrategy = FieldStrategy.IGNORED)
     private Date lastReleasedTime;
 
     /**

+ 3 - 0
src/main/java/com/qmrb/system/pojo/form/ContractForm.java

@@ -1,5 +1,6 @@
 package com.qmrb.system.pojo.form;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -37,11 +38,13 @@ public class ContractForm {
      * 开始日期
      */
 	@Schema(description = "开始日期",type="Date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date startDate;
     /**
      * 结束日期
      */
 	@Schema(description = "结束日期",type="Date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date endDate;
     /**
      * 联系人姓名

+ 18 - 3
src/main/java/com/qmrb/system/service/IVirtualParkingSlotService.java

@@ -1,17 +1,18 @@
 package com.qmrb.system.service;
 
-import java.util.List;
-
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.common.result.Result;
 import com.qmrb.system.pojo.entity.Contract;
+import com.qmrb.system.pojo.entity.ContractPlaceNumberRel;
 import com.qmrb.system.pojo.entity.VirtualParkingSlot;
 import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
 import com.qmrb.system.pojo.vo.VirtualParkingSlotVO;
 import com.qmrb.system.pojo.query.VirtualParkingSlotQuery;
-import com.qmrb.system.pojo.vo.Option;
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.validation.Valid;
 
+import java.util.Date;
+
 /**
  * <p>
  * 虚拟车位表 服务类
@@ -44,4 +45,18 @@ public interface IVirtualParkingSlotService extends IService<VirtualParkingSlot>
 	 * */
 	public VirtualParkingSlotForm getFormData(Long id);
 	
+	/**
+	 * 根据包租协议虚拟车位登记记录分配虚拟车位
+	 * */
+	public VirtualParkingSlotForm assignParkingSpot(ContractPlaceNumberRel contractPlaceNumberRel);
+
+	/**
+	 * 校验虚拟车位
+	 *
+	 * @param slotNumber
+	 * @param plateNumber
+	 * @param currentDate
+	 * @return
+	 */
+	Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Date currentDate);
 }

+ 1 - 4
src/main/java/com/qmrb/system/service/impl/ContractPlaceNumberRelServiceImpl.java

@@ -17,10 +17,7 @@ import com.qmrb.system.pojo.entity.*;
 import com.qmrb.system.pojo.form.ContractPlaceNumberRelForm;
 import com.qmrb.system.pojo.query.ContractPlaceNumberRelQuery;
 import com.qmrb.system.pojo.vo.ContractPlaceNumberRelVO;
-import com.qmrb.system.service.IContractPlaceNumberRelHisService;
-import com.qmrb.system.service.IContractPlaceNumberRelService;
-import com.qmrb.system.service.IContractService;
-import com.qmrb.system.service.SysUserService;
+import com.qmrb.system.service.*;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 1
src/main/java/com/qmrb/system/service/impl/CouponServiceImpl.java

@@ -126,7 +126,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
 
             // 校验协议用户是否还有优惠券
             Long count = this.count(new LambdaQueryWrapper<Coupon>().eq(Coupon::getContractId, form.getContractId()));
-            Assert.isTrue(count != null && count < contract.getMaxCouponCount(), "优惠券已领完");
+            Assert.isTrue(count != null && contract.getMaxCouponCount() != null && count < contract.getMaxCouponCount() , "优惠券已领完");
 
             SysUser user = userService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getContractId, form.getContractId()));
             Assert.isTrue(user != null, "关联协议用户数据不存在");

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

@@ -1,18 +1,22 @@
 package com.qmrb.system.service.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
+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.pojo.entity.Contract;
+import com.qmrb.system.pojo.entity.ContractPlaceNumberRel;
+import com.qmrb.system.service.IContractPlaceNumberRelHisService;
+import com.qmrb.system.utils.DateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.qmrb.system.common.enums.StatusEnum;
-import com.qmrb.system.pojo.vo.Option;
 import com.qmrb.system.converter.VirtualParkingSlotConverter;
 import com.qmrb.system.pojo.entity.VirtualParkingSlot;
 import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
@@ -42,6 +46,9 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 
 	@Autowired
 	private VirtualParkingSlotConverter converter;
+	
+	@Autowired
+	private IContractPlaceNumberRelHisService contractPlaceNumberRelHisService; 
 
 	/**分页查询
 	 * */
@@ -86,6 +93,7 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 	 */
 	@Override
 	public void createFormsByContract(Contract contract) {
+		VirtualParkingSlot lastOne = this.getOne(new LambdaQueryWrapper<VirtualParkingSlot>().orderByDesc(VirtualParkingSlot::getId).last("limit 1"));
 		// 1 判断该包租协议是否已创建虚拟车位
 		List<VirtualParkingSlot> list = this.list(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getContractId, contract.getId())
 				.ne(VirtualParkingSlot::getStatus,"2").orderByAsc(VirtualParkingSlot::getId));
@@ -125,7 +133,8 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 				}).collect(Collectors.toList());
 				
 				// 增加虚拟车位
-				Integer index = allVirtuals.size() + 1;;
+				// Integer index = allVirtuals.size() + 1;;
+				Long index = lastOne.getId() + 1;
 				List<VirtualParkingSlot> newVirtuals = new ArrayList<>();
 				for(int i = contract.getMaxParkingLotNum(); i > allVirtuals.size();i--){
 					VirtualParkingSlot virtualParkingSlot = new VirtualParkingSlot();
@@ -142,7 +151,8 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
 		}else{
 			// 首次创建包租协议,初始化虚拟车位
 			list = new ArrayList<>();
-			Integer index = 1;
+			// Integer index = 1;
+			Long index = lastOne != null ? lastOne.getId() + 1 : 1L; 
 			for(int i = contract.getMaxParkingLotNum(); i > 0;i--){
 				VirtualParkingSlot virtualParkingSlot = new VirtualParkingSlot();
 				virtualParkingSlot.setContractId(contract.getId());
@@ -177,5 +187,133 @@ public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlo
         VirtualParkingSlotForm form = converter.entity2Form(entity);
         return form;
 	}
-	
+
+	/**
+	 * 根据包租协议虚拟车位登记记录分配虚拟车位
+	 * @param contractPlaceNumberRel
+	 * @return
+	 */
+	@Override
+	public VirtualParkingSlotForm assignParkingSpot(ContractPlaceNumberRel contractPlaceNumberRel) {
+		VirtualParkingSlot virtualParkingSlot = null;
+		// 判断该车牌是否已占用车位
+		List<VirtualParkingSlot> occupyVirtualParkingSlots = this.list(new LambdaQueryWrapper<VirtualParkingSlot>()
+				.eq(VirtualParkingSlot::getStatus, "1")//已占用
+				.eq(VirtualParkingSlot::getContractId, contractPlaceNumberRel.getContractId())
+				.eq(VirtualParkingSlot::getCurrentPlateNumber, contractPlaceNumberRel.getPlateNumber())
+				.orderByAsc(VirtualParkingSlot::getContractId));
+		if(CollectionUtil.isNotEmpty(occupyVirtualParkingSlots)){
+			virtualParkingSlot = occupyVirtualParkingSlots.get(0);
+			virtualParkingSlot.setLastOccupiedTime(contractPlaceNumberRel.getStartTime());
+			this.updateById(virtualParkingSlot);
+		}else{
+			// 判断该包租协议下是否有空闲虚拟车位
+			List<VirtualParkingSlot> freeVirtualParkingSlots = this.list(new LambdaQueryWrapper<VirtualParkingSlot>()
+					.eq(VirtualParkingSlot::getStatus, "0")//空闲
+					.eq(VirtualParkingSlot::getContractId, contractPlaceNumberRel.getContractId())
+					.orderByAsc(VirtualParkingSlot::getContractId));
+			Assert.isTrue(CollectionUtil.isNotEmpty(freeVirtualParkingSlots),"无可用车位");
+			virtualParkingSlot = freeVirtualParkingSlots.get(0);
+			virtualParkingSlot.setStatus("1");//占用
+			virtualParkingSlot.setSlotType(StrUtil.equals("1",contractPlaceNumberRel.getCarType())? "small" : "large");
+			virtualParkingSlot.setCurrentPlateNumber(contractPlaceNumberRel.getPlateNumber());
+			virtualParkingSlot.setLastOccupiedTime(contractPlaceNumberRel.getStartTime());
+			virtualParkingSlot.setLastReleasedTime(contractPlaceNumberRel.getEndTime());
+			this.updateById(virtualParkingSlot);
+		}
+		
+		return converter.entity2Form(virtualParkingSlot);
+	}
+
+	@Override
+	public Result<VirtualParkingSlotForm> validParingSlot(String slotNumber, String plateNumber, Date currentDate) {
+		VirtualParkingSlot virtualParkingSlot = this.getOne(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getVirtualSlotNumber, slotNumber));
+		if(virtualParkingSlot == null){
+			return Result.failed("虚拟车位不存在!");
+		}
+		Date lastOccupiedTime = null;//开始时间
+		Date lastReleasedTime = virtualParkingSlot.getLastReleasedTime();//结束时间
+		if(StrUtil.equals(plateNumber,virtualParkingSlot.getCurrentPlateNumber()) && lastReleasedTime != null ){
+			// 获取n-2天零时零分零秒
+			Date beforeYesterday = DateUtils.getStartOfDay(DateUtil.offset(currentDate, DateField.DAY_OF_MONTH, -2));
+			
+			if(lastReleasedTime.after(beforeYesterday)){
+				lastOccupiedTime = virtualParkingSlot.getLastReleasedTime();//2025-04-17 14:00:00
+			}else{
+				lastOccupiedTime = currentDate;
+			}
+		}else{
+			lastOccupiedTime = currentDate;
+		}
+
+		// 结束时间固定为次日(N+1)14:00
+		Date endTime = DateUtil.parse(DateUtil.format(DateUtil.offset(currentDate, DateField.DAY_OF_MONTH, 1), "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时!");
+		}
+
+
+		virtualParkingSlot.setLastOccupiedTime(lastOccupiedTime);
+		virtualParkingSlot.setLastReleasedTime(lastReleasedTime);
+		virtualParkingSlot.setCurrentPlateNumber(plateNumber);
+		return Result.success(converter.entity2Form(virtualParkingSlot));
+	}
+
+	public static boolean isOverlap(Date start1, Date end1, Date start2, Date end2) {
+		// 1. 校验参数非空
+		if (start1 == null || end1 == null || start2 == null || end2 == null) {
+			throw new IllegalArgumentException("时间参数不能为null");
+		}
+
+		// 2. 校验时间段有效性(开始时间 <= 结束时间)
+		if (start1.after(end1) || start2.after(end2)) {
+			throw new IllegalArgumentException("开始时间不能晚于结束时间");
+		}
+
+		// 3. 核心逻辑:判断是否有重叠(左闭右开区间)
+		return start1.before(end2) && start2.before(end1);
+	}
+
+	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"));
+		if(CollectionUtil.isEmpty(list)){
+			return;
+		}
+		Date now = new Date();
+		List<VirtualParkingSlot> releasedList = new ArrayList<>();
+		for (VirtualParkingSlot virtualParkingSlot : list) {
+			if(now.after(virtualParkingSlot.getLastReleasedTime())){
+				releasedList.add(virtualParkingSlot);
+			}
+		}
+
+		if(CollectionUtil.isEmpty(releasedList)){
+			return;
+		}
+		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");
+			return iter;
+		}).collect(Collectors.toList());
+		this.updateBatchById(releasedList);
+		log.info("定时释放虚拟车位:结束:" +  LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+	}
+
 }

+ 20 - 0
src/main/java/com/qmrb/system/utils/DateUtils.java

@@ -0,0 +1,20 @@
+package com.qmrb.system.utils;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+public class DateUtils {
+    public static Date getStartOfDay(Date date) {
+        LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDateTime startOfDay = localDate.atStartOfDay();
+        return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    public static Date getEndOfDay(Date date) {
+        LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDateTime endOfDay = localDate.atTime(23, 59, 59, 999_000_000);
+        return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+    }
+}