Эх сурвалжийг харах

pms 瑞都 基于任务井号手工推送指定日期的日报

zhangcl 5 өдөр өмнө
parent
commit
8a3bdeb9fd

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

@@ -93,6 +93,7 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_RY_DAILY_REPORT_CURRENT_DEPTH_NOT_EXISTS = new ErrorCode(268, "未传递运行记录当前井深");
     ErrorCode IOT_SAP_STOCK_LOG_NOT_EXISTS = new ErrorCode(269, "PMS SAP 库存(sap同步的原始数据日志)不存在");
     ErrorCode IOT_RD_DAILY_REPORT_NOT_EXISTS = new ErrorCode(270, "瑞都日报不存在");
+    ErrorCode IOT_RD_DAILY_REPORT_EXISTS = new ErrorCode(283, "瑞都日报已经存在");
     ErrorCode IOT_RD_DAILY_REPORT_ITEM_NOT_EXISTS = new ErrorCode(271, "瑞都日报 (工作量)明细不存在");
     ErrorCode IOT_DAILY_REPORT_TIME_NOT_EXISTS = new ErrorCode(272, "未传递创建时间查询参数");
     ErrorCode IOT_DAILY_REPORT_DEPT_NOT_EXISTS = new ErrorCode(273, "未选择项目部");

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/IotProjectTaskController.java

@@ -106,6 +106,14 @@ public class IotProjectTaskController {
         return success(BeanUtils.toBean(iotProjectTask, IotProjectTaskRespVO.class));
     }
 
+    @PostMapping("/generateReport")
+    @Operation(summary = "基于新建的任务井号 生成指定日期的日报 (默认生成当天的日报)")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task:query')")
+    public CommonResult<Long> generateReport(@RequestBody IotProjectTaskPageReqVO reqVO) {
+        Long newTaskId = iotProjectTaskService.generateReport(reqVO);
+        return success(newTaskId);
+    }
+
     @GetMapping("/page")
     @Operation(summary = "获得项目信息任务拆分分页")
     @PreAuthorize("@ss.hasPermission('rq:iot-project-task:query')")

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPageReqVO.java

@@ -109,4 +109,7 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "部门名称 模糊搜索")
     private String deptName;
 
+    @Schema(description = "日报日期 yyyy-MM-dd")
+    private LocalDateTime reportDate;
+
 }

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

@@ -157,6 +157,30 @@ public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO>
         return selectOne(wrapper);
     }
 
+    /**
+     * 根据条件查询 瑞都 指定施工队伍 指定日期 日报记录
+     *
+     * @param deptId     施工队伍 id
+     * @param taskId     任务ID,可选参数,用于筛选任务ID匹配的记录
+     * @param dateTimeStr   日报日期
+     * @return 返回符合条件的 瑞都 日报记录
+     */
+    default IotRdDailyReportDO selectExistTaskReport(Long deptId, Long taskId, String dateTimeStr) {
+        LambdaQueryWrapperX<IotRdDailyReportDO> wrapper = new LambdaQueryWrapperX<>();
+
+        // 施工队伍条件
+        wrapper.eqIfPresent(IotRdDailyReportDO::getDeptId, deptId);
+        // 任务相关条件:若 taskId 非空,则按 taskId 匹配;否则查询 project_id 和 task_id 均为 null 的记录
+
+        wrapper.eqIfPresent(IotRdDailyReportDO::getTaskId, taskId);
+        // 日期条件
+        if (StrUtil.isNotBlank(dateTimeStr)) {
+            wrapper.apply("DATE(create_time) = {0}", dateTimeStr);
+        }
+        wrapper.last("limit 1");
+        return selectOne(wrapper);
+    }
+
     /**
      * 瑞都日报 关联的任务进度
      * @param reqVO 查询条件

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskService.java

@@ -87,4 +87,12 @@ public interface IotProjectTaskService {
      * @return 项目信息任务列表
      */
     List<IotProjectTaskDO> taskWellNames(IotProjectTaskPageReqVO pageReqVO);
+
+    /**
+     * 基于新建的任务井号 生成指定日期的日报 (默认生成当天的日报)
+     *
+     * @param reqVO 请求参数 任务井id 日报日期
+     * @return 生成日报数量
+     */
+    Long generateReport(IotProjectTaskPageReqVO reqVO);
 }

+ 67 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java

@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.pms.service.iotprojecttask;
 
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -13,16 +15,18 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProject
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotattachment.IotAttachmentMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojectinfo.IotProjectInfoMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreport.IotRdDailyReportMapper;
 import cn.iocoder.yudao.module.pms.enums.AttachmentCategoryEnum;
 import cn.iocoder.yudao.module.pms.enums.AttachmentTypeEnum;
 import cn.iocoder.yudao.module.pms.service.iotprojectinfo.IotProjectInfoService;
-import cn.iocoder.yudao.module.supplier.service.product.SupplierService;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -30,6 +34,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
@@ -38,6 +44,7 @@ import java.util.stream.Collectors;
 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_EXISTS;
 
 /**
  * 项目信息任务拆分 Service 实现类
@@ -54,13 +61,15 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
     private IotProjectInfoService iotProjectInfoService;
 
     @Resource
-    private SupplierService iotSupplierService;
+    private IotRdDailyReportMapper iotRdDailyReportMapper;
     @Resource
     private IotProjectInfoMapper iotProjectInfoMapper;
     @Resource
     private DeptMapper deptMapper;
     @Resource
     private IotAttachmentMapper attachmentMapper;
+    @Resource
+    private DeptService deptService;
 
     @Override
     public Long createIotProjectTask(IotProjectTaskSaveReqVO createReqVO) {
@@ -450,4 +459,60 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
         return tasks;
     }
 
+    @Override
+    public Long generateReport(IotProjectTaskPageReqVO reqVO) {
+        // 根据当前任务井id 生成对应施工队伍 指定日期的日报
+        if (ObjUtil.isEmpty(reqVO.getId()) || ObjUtil.isEmpty(reqVO.getReportDate())) {
+            throw exception(IOT_PROJECT_TASK_NOT_EXISTS);
+        }
+        IotProjectTaskDO task = iotProjectTaskMapper.selectById(reqVO.getId());
+        if (ObjUtil.isEmpty(task)) {
+            throw exception(IOT_PROJECT_TASK_NOT_EXISTS);
+        }
+        LocalDateTime reportDate = reqVO.getReportDate();
+        Set<Long> deptIds = task.getDeptIds();
+        if (CollUtil.isEmpty(deptIds)) {
+            throw exception(IOT_PROJECT_TASK_NOT_EXISTS);
+        }
+        List<Long> deptIdList = new ArrayList<>(deptIds);
+        Long deptId = deptIdList.get(0);
+
+        // 查询部门信息
+        DeptDO dept = deptService.getDept(deptId);
+        if (ObjUtil.isEmpty(dept)) {
+            throw exception(IOT_PROJECT_TASK_NOT_EXISTS);
+        }
+        String reportDateStr = LocalDateTimeUtil.format(reportDate, DatePattern.NORM_DATE_PATTERN);
+        // 校验:指定日期 相同施工队伍 相同任务井号 只能有1份日报
+        IotRdDailyReportDO existReport = iotRdDailyReportMapper.selectExistTaskReport(deptId, task.getId(), reportDateStr);
+        if (ObjUtil.isNotEmpty(existReport)) {
+            throw exception(IOT_RD_DAILY_REPORT_EXISTS);
+        }
+        // 生成指定日期、施工队伍、任务井号的日报
+        IotRdDailyReportDO tobeGeneratedReport = new IotRdDailyReportDO();
+        tobeGeneratedReport.setDeptId(deptId);
+        tobeGeneratedReport.setReportName(dept.getName()+"/"+reportDateStr+"手工推送日报");
+        tobeGeneratedReport.setProjectId(task.getProjectId());
+        tobeGeneratedReport.setTaskId(task.getId());
+        Set<Long> techniqueIds = new HashSet<>();
+        techniqueIds.add(Long.valueOf(task.getTechnique()));
+        tobeGeneratedReport.setTechniqueIds(techniqueIds);
+        tobeGeneratedReport.setDeviceIds(task.getDeviceIds());
+        tobeGeneratedReport.setStartTime(LocalTime.of(8, 0, 0));
+        tobeGeneratedReport.setEndTime(LocalTime.of(8, 0, 0));
+        tobeGeneratedReport.setStatus(0);
+        tobeGeneratedReport.setAuditStatus(0);
+        tobeGeneratedReport.setCreateTime(reportDate);
+        Set<Long> userIds = task.getSubmitter();
+        if (CollUtil.isNotEmpty(userIds)) {
+            List<Long> userIdList = new ArrayList<>(userIds);
+            tobeGeneratedReport.setCreator(String.valueOf(userIdList.get(0)));
+        }
+        LocalDateTime nextDate = reportDate.plusDays(1);
+        tobeGeneratedReport.setConstructionStartDate(reportDate);
+        tobeGeneratedReport.setConstructionEndDate(nextDate);
+        int num = iotRdDailyReportMapper.insert(tobeGeneratedReport);
+        return tobeGeneratedReport.getId();
+    }
+
 }