Pārlūkot izejas kodu

feat(risk-workReport): 作业上报新增工期字段及联动计算

需求:
- 新增/编辑时录入工期+施工开始时间 → 自动算出施工结束时间
- 修改施工开始/结束时间 → 工期同步重新计算

实现:
- DB: risk_work_report 加 duration_days INT 字段(单位:天)
  - 新增独立升级脚本 sql/risk_work_report_duration.sql(幂等)
  - 同步更新 sql/risk_tables.sql(参考建表)和 sql/risk_control_platform.sql(实际部署)
- Java: Do/Bo/Vo 加 durationDays 字段,Bo @Min(1) 校验
- ServiceImpl: 加 syncWorkPeriod() 联动方法,优先级如下
  1) 开始时间+工期 → 自动重算结束时间
  2) 开始时间+结束时间 → 自动反算工期(向上取整,避免0天)
  3) 工期+结束时间 → 自动反算开始时间
  4) 三者均无 → 抛异常提示至少填两个
- 前端 types.ts: Bo/Vo 加 durationDays
- 前端 index.vue: 新增工期输入框(el-input-number)+ 三个 @change 联动处理函数
  - 列表表格新增'工期(天)'列
  - 查看详情新增'工期(天)'行
  - 工期字段提示'录入工期+开始时间自动算结束时间'
yangjingjing 2 dienas atpakaļ
vecāks
revīzija
cbf38a10e8

+ 5 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/RiskWorkReport.java

@@ -75,6 +75,11 @@ public class RiskWorkReport extends TenantEntity {
      */
     private Date workEndTime;
 
+    /**
+     * 工期(单位:天,与开始/结束时间联动计算)
+     */
+    private Integer durationDays;
+
     /**
      * 上报人ID
      */

+ 9 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/bo/RiskWorkReportBo.java

@@ -1,6 +1,7 @@
 package org.dromara.risk.domain.bo;
 
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.Min;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
@@ -79,6 +80,14 @@ public class RiskWorkReportBo extends BaseEntity {
      */
     private Date workEndTime;
 
+    /**
+     * 工期(单位:天,与开始/结束时间联动计算)
+     * - 录入工期+开始时间 → 自动计算结束时间
+     * - 修改开始/结束时间 → 自动重新计算工期
+     */
+    @Min(value = 1, message = "工期必须大于等于1天")
+    private Integer durationDays;
+
     /**
      * 上报人ID
      */

+ 6 - 0
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/domain/vo/RiskWorkReportVo.java

@@ -88,6 +88,12 @@ public class RiskWorkReportVo implements Serializable {
     @ExcelProperty(value = "作业结束时间")
     private Date workEndTime;
 
+    /**
+     * 工期(单位:天)
+     */
+    @ExcelProperty(value = "工期(天)")
+    private Integer durationDays;
+
     /**
      * 上报人ID
      */

+ 53 - 1
ruoyi-modules/ruoyi-risk/src/main/java/org/dromara/risk/service/impl/RiskWorkReportServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -17,6 +18,7 @@ import org.dromara.risk.mapper.RiskWorkReportMapper;
 import org.dromara.risk.service.IRiskWorkReportService;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -96,9 +98,11 @@ public class RiskWorkReportServiceImpl implements IRiskWorkReportService {
         }
         // 上报时间前端不传时取当前时间
         if (bo.getReportTime() == null) {
-            bo.setReportTime(new java.util.Date());
+            bo.setReportTime(new Date());
         }
         RiskWorkReport add = MapstructUtils.convert(bo, RiskWorkReport.class);
+        // 联动计算:工期 + 开始时间 → 结束时间 / 开始时间 + 结束时间 → 工期
+        syncWorkPeriod(add);
         int row = baseMapper.insert(add);
         bo.setId(add.getId());
         return row;
@@ -119,9 +123,57 @@ public class RiskWorkReportServiceImpl implements IRiskWorkReportService {
     @Override
     public int updateByBo(RiskWorkReportBo bo) {
         RiskWorkReport update = MapstructUtils.convert(bo, RiskWorkReport.class);
+        // 联动计算:同上
+        syncWorkPeriod(update);
         return baseMapper.updateById(update);
     }
 
+    /**
+     * 工期 ↔ 开始/结束时间 联动计算
+     * <p>
+     * 优先级(三个字段可能部分为 null):
+     * <ol>
+     *   <li>开始时间 + 工期 → 自动重算结束时间(覆盖原有 workEndTime)</li>
+     *   <li>开始时间 + 结束时间 → 自动反算工期(覆盖原有 durationDays)</li>
+     *   <li>工期 + 结束时间 → 自动反算开始时间(覆盖原有 workStartTime)</li>
+     *   <li>三者均不完整 → 抛异常</li>
+     * </ol>
+     * 工期计算口径:向上取整天(1天 = 24h,差额不足1天按1天计,避免工期为0)
+     */
+    private void syncWorkPeriod(RiskWorkReport report) {
+        Date start = report.getWorkStartTime();
+        Date end = report.getWorkEndTime();
+        Integer days = report.getDurationDays();
+        long oneDayMs = 24L * 60L * 60L * 1000L;
+
+        // 优先级1:开始时间 + 工期 → 重算结束时间
+        if (start != null && days != null && days > 0) {
+            report.setWorkEndTime(new Date(start.getTime() + (long) days * oneDayMs));
+            return;
+        }
+        // 优先级2:开始时间 + 结束时间 → 反算工期
+        if (start != null && end != null) {
+            long diffMs = end.getTime() - start.getTime();
+            if (diffMs <= 0) {
+                throw new ServiceException("施工结束时间必须晚于开始时间");
+            }
+            // 向上取整天: 1ms-1天 都算1天
+            int computed = (int) ((diffMs + oneDayMs - 1) / oneDayMs);
+            report.setDurationDays(computed);
+            return;
+        }
+        // 优先级3:工期 + 结束时间 → 反算开始时间
+        if (days != null && days > 0 && end != null) {
+            report.setWorkStartTime(new Date(end.getTime() - (long) days * oneDayMs));
+            return;
+        }
+        // 三者均不完整(完全没填):提示用户补齐
+        if (start == null && end == null && days == null) {
+            throw new ServiceException("施工开始时间、施工结束时间、工期至少需要填写其中两个");
+        }
+        // 仅有一个字段:无法联动,容忍(交给数据库 NOT NULL 约束兜底 workStartTime/workEndTime)
+    }
+
     /**
      * 校验并批量删除作业上报
      */

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 2 - 1
sql/risk_control_platform.sql


+ 1 - 0
sql/risk_tables.sql

@@ -93,6 +93,7 @@ CREATE TABLE `risk_work_report` (
   `work_location` VARCHAR(200) COMMENT '作业位置',
   `work_start_time` DATETIME NOT NULL COMMENT '作业开始时间',
   `work_end_time` DATETIME NOT NULL COMMENT '作业结束时间',
+  `duration_days` INT DEFAULT NULL COMMENT '工期(单位:天,与开始/结束时间联动计算)',
   `reporter_id` BIGINT COMMENT '上报人ID',
   `reporter_name` VARCHAR(50) COMMENT '上报人',
   `report_time` DATETIME NOT NULL COMMENT '上报时间',

+ 39 - 0
sql/risk_work_report_duration.sql

@@ -0,0 +1,39 @@
+-- =============================================================
+-- 风控平台 数据库增量脚本  作业上报-工期字段
+-- 适用版本: 风控平台 2026-07-07 之前的部署
+--
+-- 需求:
+--   作业上报新增"工期"字段(单位:天),与开始/结束时间形成联动:
+--   - 录入工期 + 开始时间 → 自动计算结束时间
+--   - 修改开始/结束时间 → 自动重新计算工期
+--
+-- 本脚本特征:
+--   - 全部 SQL 幂等,可重复执行(基于 INFORMATION_SCHEMA 判断)
+--   - 新环境用 risk_control_platform.sql 部署;已有环境用本脚本增量升级
+--   - 不修改业务表已有数据,仅追加字段
+-- =============================================================
+
+SET NAMES utf8mb4;
+
+-- =============================================================
+-- 1. 作业上报表 risk_work_report 加 duration_days 字段
+-- =============================================================
+
+SET @sql = (SELECT IF(
+  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+     WHERE TABLE_SCHEMA = DATABASE()
+       AND TABLE_NAME   = 'risk_work_report'
+       AND COLUMN_NAME  = 'duration_days') = 0,
+  'ALTER TABLE `risk_work_report` ADD COLUMN `duration_days` INT DEFAULT NULL COMMENT ''工期(单位:天,与开始/结束时间联动计算)'' AFTER `work_end_time`',
+  'SELECT 1'));
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+
+-- =============================================================
+-- 2. 验证清单(可手动 SELECT 确认)
+-- =============================================================
+-- SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
+--   FROM INFORMATION_SCHEMA.COLUMNS
+--  WHERE TABLE_SCHEMA = DATABASE()
+--    AND TABLE_NAME = 'risk_work_report'
+--    AND COLUMN_NAME = 'duration_days';

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels