Pārlūkot izejas kodu

pms 瑞都无工作量日报 唯一性校验

zhangcl 4 dienas atpakaļ
vecāks
revīzija
f0227ee592

+ 1 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -102,4 +102,5 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_AUTHENTICATION_NOT_EXISTS = new ErrorCode(277, "认证不存在");
     ErrorCode IOT_RD_DAILY_REPORT_DETAIL_NOT_EXISTS = new ErrorCode(278, "瑞都日报明细(生产动态拆分)不存在");
     ErrorCode IOT_RY_DAILY_REPORT_DETAIL_NOT_EXISTS = new ErrorCode(279, "瑞鹰日报明细(生产动态拆分)不存在");
+    ErrorCode IOT_RD_NO_WORK_DAILY_REPORT_EXISTS = new ErrorCode(280, "无工作量日报已经存在");
 }

+ 26 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreport/IotRdDailyReportMapper.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreport;
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -131,6 +132,31 @@ public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO>
                 .orderByDesc(IotRdDailyReportDO::getId);
     }
 
+    /**
+     * 根据条件查询 瑞都 日报记录
+     *
+     * @param deptId     施工队伍 id
+     * @param taskId     任务ID,可选参数,用于筛选任务ID匹配的记录
+     * @param dateTimeStr   日报日期
+     * @return 返回符合条件的 瑞都 日报记录
+     */
+    default IotRdDailyReportDO selectExistReport(Long deptId, Long taskId, String dateTimeStr) {
+        LambdaQueryWrapperX<IotRdDailyReportDO> wrapper = new LambdaQueryWrapperX<>();
+
+        // 施工队伍条件
+        wrapper.eqIfPresent(IotRdDailyReportDO::getDeptId, deptId);
+        // 任务相关条件:若 taskId 非空,则按 taskId 匹配;否则查询 project_id 和 task_id 均为 null 的记录
+
+        wrapper.isNull(IotRdDailyReportDO::getProjectId)
+                .isNull(IotRdDailyReportDO::getTaskId);
+        // 日期条件
+        if (StrUtil.isNotBlank(dateTimeStr)) {
+            wrapper.apply("DATE(create_time) = {0}", dateTimeStr);
+        }
+        wrapper.last("limit 1");
+        return selectOne(wrapper);
+    }
+
     /**
      * 瑞都日报 关联的任务进度
      * @param reqVO 查询条件

+ 14 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

@@ -78,8 +78,7 @@ import java.util.stream.Stream;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_NOT_EXISTS;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RD_DAILY_REPORT_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.*;
 import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
 
 /**
@@ -126,6 +125,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
 
     @Override
     public Long createIotRdDailyReport(IotRdDailyReportSaveReqVO createReqVO) {
+
+
         // 插入
         IotRdDailyReportDO iotRdDailyReport = BeanUtils.toBean(createReqVO, IotRdDailyReportDO.class);
         // 如果没有传递 deptId 则默认使用当前登录人的 部门
@@ -143,6 +144,17 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
             if (ObjUtil.isNotEmpty(dept)) {
                 String todayDateStr = LocalDateTimeUtil.format(tempDateTime, DatePattern.NORM_DATE_PATTERN);
                 iotRdDailyReport.setReportName(dept.getName() + "/" + todayDateStr + "日报");
+
+                // 唯一性校验 每个施工队伍 每天只能有1份无工作量日报
+                if (ObjUtil.isEmpty(createReqVO.getProjectId()) || ObjUtil.isEmpty(createReqVO.getTaskId())) {
+                    // 查询瑞都日报列表中 当前施工队伍 当前日期todayDateStr 是否存在记录
+                    IotRdDailyReportDO existedReport = iotRdDailyReportMapper.selectExistReport(createReqVO.getDeptId(), null, todayDateStr);
+                    if (ObjUtil.isNotEmpty(existedReport) && ObjUtil.isEmpty(existedReport.getProjectId())
+                            && ObjUtil.isEmpty(existedReport.getTaskId()) ) {
+                        // 施工队伍 指定日期 已经存在了无工作量的日报
+                        throw exception(IOT_RD_NO_WORK_DAILY_REPORT_EXISTS);
+                    }
+                }
             }
         }
         // 临时新建的日报 审批状态 默认为 审批通过 status 赋值为1 填写完成