From 2f07589b54d56085af77b50d580890cd4130b444 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期一, 19 十月 2026 15:19:53 +0800
Subject: [PATCH] 设备模块后端业务规则、计划接口与日期联动

---
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java |  127 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 125 insertions(+), 2 deletions(-)

diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
index 9bf98af..e92fdec 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
@@ -22,6 +22,8 @@
 import com.ruoyi.device.excel.upload.DeviceCalibrationPlanDetailUpload;
 import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
 import com.ruoyi.device.mapper.DeviceCalibrationPlanMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
 import com.ruoyi.device.pojo.DeviceCalibrationPlan;
 import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
 import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
@@ -71,6 +73,8 @@
     private InformationNotificationService informationNotificationService;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
 
 
     /**
@@ -238,14 +242,133 @@
      * @return
      */
     @Override
-    public IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
+    public IPage<DeviceCalibrationPlanDetailDto> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
         if (deviceCalibrationPlanDetails.getPlanId() == null) {
-            return new Page();
+            return new Page<>();
         }
         return deviceCalibrationPlanDetailMapper.pageDeviceCalibrationPlanDetail(page, QueryWrappers.queryWrappers(deviceCalibrationPlanDetails));
     }
 
     /**
+     * 鎸夊勾浠芥煡璇㈣澶囨牎鍑嗚鍒掞紙涓嶅瓨鍦ㄥ垯鑷姩鍒涘缓锛夛紝骞惰嚜鍔ㄨˉ鍏ㄥ凡鍒扮偣鐨勮澶囨槑缁�
+     * @param planYear 骞翠唤
+     * @return
+     */
+    @Override
+    public DeviceCalibrationPlanDto getOrCreatePlanByYear(String planYear) {
+        if (StringUtils.isBlank(planYear)) {
+            planYear = String.valueOf(LocalDate.now().getYear());
+        }
+        DeviceCalibrationPlan plan = getOrCreatePlanEntity(planYear);
+        ensureCalibrationDetails(plan);
+        DeviceCalibrationPlanDto planDto = new DeviceCalibrationPlanDto();
+        BeanUtils.copyProperties(plan, planDto);
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        planDto.setWriteTimeStr(plan.getWriteTime() == null ? null : plan.getWriteTime().format(dateFormatter));
+        planDto.setRatifyTimeStr(plan.getRatifyTime() == null ? null : plan.getRatifyTime().format(dateFormatter));
+        if (plan.getWriteUserId() != null) {
+            User writeUser = userMapper.selectById(plan.getWriteUserId());
+            if (writeUser != null) {
+                planDto.setWriteName(writeUser.getName());
+            }
+        }
+        if (plan.getRatifyUserId() != null) {
+            User ratifyUser = userMapper.selectById(plan.getRatifyUserId());
+            if (ratifyUser != null) {
+                planDto.setRatifyName(ratifyUser.getName());
+            }
+        }
+        return planDto;
+    }
+
+    /**
+     * 璁惧妗f鍙樻洿鍚庯紝鎶婅澶囧悓姝ュ埌瀵瑰簲骞翠唤鐨勮澶囨牎鍑嗚鍒掓槑缁嗭紙浠呭綋宸茶繘鍏ユ彁閱掓湡/宸茶繃鏈熸椂鐢熸垚锛�
+     * @param device 璁惧
+     */
+    @Override
+    public void syncDeviceCalibrationDetail(Device device) {
+        LocalDate remind = calcCalibrationRemindDate(device);
+        if (remind == null || remind.isAfter(LocalDate.now())) {
+            return;
+        }
+        DeviceCalibrationPlan plan = getOrCreatePlanEntity(String.valueOf(remind.getYear()));
+        fillCalibrationDetailIfAbsent(plan, device);
+    }
+
+    /**
+     * 鏌ヨ骞翠唤瀵瑰簲鐨勮鍒掞紝涓嶅瓨鍦ㄥ垯鍒涘缓
+     */
+    private DeviceCalibrationPlan getOrCreatePlanEntity(String planYear) {
+        DeviceCalibrationPlan plan = baseMapper.selectOne(Wrappers.<DeviceCalibrationPlan>lambdaQuery()
+                .eq(DeviceCalibrationPlan::getPlanYear, planYear)
+                .orderByDesc(DeviceCalibrationPlan::getPlanId)
+                .last("limit 1"));
+        if (plan == null) {
+            plan = new DeviceCalibrationPlan();
+            plan.setPlanName(planYear + "骞村害璁惧鏍″噯璁″垝");
+            plan.setPlanYear(planYear);
+            plan.setWriteUserId(SecurityUtils.getUserId().intValue());
+            plan.setWriteTime(LocalDateTime.now());
+            baseMapper.insert(plan);
+        }
+        return plan;
+    }
+
+    /**
+     * 鎵弿鎵�鏈夎澶囷紝鎶婂凡鍒扮偣锛堜笅娆℃牎鍑嗘棩鏈熷墠1涓湀璧凤紝鍚凡杩囨湡锛夌殑璁惧琛ヨ繘鏈勾搴﹁鍒�
+     */
+    private void ensureCalibrationDetails(DeviceCalibrationPlan plan) {
+        List<Device> devices = deviceMapper.selectList(null);
+        for (Device device : devices) {
+            fillCalibrationDetailIfAbsent(plan, device);
+        }
+    }
+
+    /**
+     * 璁惧鐨勬彁閱掕捣鐐规棩鏈燂細涓嬫鏍″噯鏃ユ湡鍓�1涓湀锛堝彇涓嶅埌涓嬫鏃ユ湡鏃剁敤鏍″噯鏈夋晥鏈熷墠1涓湀鍏滃簳锛�
+     */
+    private LocalDate calcCalibrationRemindDate(Device device) {
+        LocalDateTime base = device.getNextCalibrationDate() != null ? device.getNextCalibrationDate() : device.getActivationDate();
+        return base == null ? null : base.toLocalDate().minusMonths(1);
+    }
+
+    /**
+     * 宸插埌鐐逛笖璁″垝涓皻鏃犺璁惧鏈疆鏄庣粏鏃讹紝鑷姩琛ヤ竴鏉�
+     */
+    private void fillCalibrationDetailIfAbsent(DeviceCalibrationPlan plan, Device device) {
+        LocalDate remind = calcCalibrationRemindDate(device);
+        // 鏈埌鐐逛笉鐢熸垚锛涙湭鏉ュ勾浠界殑鎻愰啋涓嶈ˉ杩涘綋鍓嶈鍒�
+        if (remind == null || remind.isAfter(LocalDate.now())) {
+            return;
+        }
+        if (plan.getPlanYear() != null && String.valueOf(remind.getYear()).compareTo(plan.getPlanYear()) > 0) {
+            return;
+        }
+        Long exist = deviceCalibrationPlanDetailMapper.selectCount(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery()
+                .eq(DeviceCalibrationPlanDetail::getPlanId, plan.getPlanId())
+                .eq(DeviceCalibrationPlanDetail::getDeviceId, device.getId())
+                .eq(DeviceCalibrationPlanDetail::getPlanDate, remind));
+        if (exist != null && exist > 0) {
+            return;
+        }
+        DeviceCalibrationPlanDetail detail = new DeviceCalibrationPlanDetail();
+        detail.setPlanId(plan.getPlanId());
+        detail.setDeviceId(device.getId());
+        String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+        if (StringUtils.isNotBlank(device.getSpecificationModel())) {
+            deviceName = deviceName + " " + device.getSpecificationModel();
+        }
+        detail.setDeviceName(deviceName);
+        detail.setDeviceAmount("1");
+        detail.setDeviceNumber(device.getManagementNumber());
+        detail.setVerificationUnit(device.getCalibrationServices());
+        detail.setVerificationCycles(device.getCalibrationDate());
+        detail.setLastDate(device.getLastCalibrationDate() == null ? null : device.getLastCalibrationDate().toLocalDate());
+        detail.setPlanDate(remind);
+        deviceCalibrationPlanDetailMapper.insert(detail);
+    }
+
+    /**
      * 瀵煎嚭璁惧鏍″噯璁″垝
      * @param deviceCalibrationPlanId
      * @param response

--
Gitblit v1.9.3