Ver Fonte

pms 瑞都日报 定时任务生成日报

zhangcl há 1 semana atrás
pai
commit
03308e94e1

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

@@ -88,4 +88,7 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "搜索关键字")
     private String searchKey;
 
+    @Schema(description = "公司id")
+    private Long companyId;
+
 }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttask/IotProjectTaskMapper.java

@@ -108,6 +108,7 @@ public interface IotProjectTaskMapper extends BaseMapperX<IotProjectTaskDO> {
      */
     default LambdaQueryWrapperX<IotProjectTaskDO> buildCommonQuery(IotProjectTaskPageReqVO reqVO) {
         return new LambdaQueryWrapperX<IotProjectTaskDO>()
+                .eqIfPresent(IotProjectTaskDO::getDeptId, reqVO.getCompanyId())
                 .eqIfPresent(IotProjectTaskDO::getProjectId, reqVO.getProjectId())
                 .likeIfPresent(IotProjectTaskDO::getWellName, reqVO.getWellName())
                 .eqIfPresent(IotProjectTaskDO::getWellType, reqVO.getWellType())

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

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDai
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * 瑞都日报 Mapper
  *
@@ -59,4 +61,46 @@ public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO>
                 .orderByDesc(IotRdDailyReportDO::getId));
     }
 
+    default List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotRdDailyReportDO>()
+                .eqIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskId())
+                .eqIfPresent(IotRdDailyReportDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotRdDailyReportDO::getTechniqueIds, reqVO.getTechniqueIds())
+                .eqIfPresent(IotRdDailyReportDO::getDeviceIds, reqVO.getDeviceIds())
+                .betweenIfPresent(IotRdDailyReportDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(IotRdDailyReportDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(IotRdDailyReportDO::getCumulativeWorkingWell, reqVO.getCumulativeWorkingWell())
+                .eqIfPresent(IotRdDailyReportDO::getCumulativeWorkingLayers, reqVO.getCumulativeWorkingLayers())
+                .eqIfPresent(IotRdDailyReportDO::getDailyPumpTrips, reqVO.getDailyPumpTrips())
+                .eqIfPresent(IotRdDailyReportDO::getDailyToolsSand, reqVO.getDailyToolsSand())
+                .eqIfPresent(IotRdDailyReportDO::getRunCount, reqVO.getRunCount())
+                .eqIfPresent(IotRdDailyReportDO::getBridgePlug, reqVO.getBridgePlug())
+                .eqIfPresent(IotRdDailyReportDO::getWaterVolume, reqVO.getWaterVolume())
+                .eqIfPresent(IotRdDailyReportDO::getHourCount, reqVO.getHourCount())
+                .eqIfPresent(IotRdDailyReportDO::getDailyFuel, reqVO.getDailyFuel())
+                .eqIfPresent(IotRdDailyReportDO::getDailyPowerUsage, reqVO.getDailyPowerUsage())
+                .betweenIfPresent(IotRdDailyReportDO::getProductionTime, reqVO.getProductionTime())
+                .betweenIfPresent(IotRdDailyReportDO::getNonProductionTime, reqVO.getNonProductionTime())
+                .eqIfPresent(IotRdDailyReportDO::getRdNptReason, reqVO.getRdNptReason())
+                .betweenIfPresent(IotRdDailyReportDO::getConstructionStartDate, reqVO.getConstructionStartDate())
+                .betweenIfPresent(IotRdDailyReportDO::getConstructionEndDate, reqVO.getConstructionEndDate())
+                .eqIfPresent(IotRdDailyReportDO::getProductionStatus, reqVO.getProductionStatus())
+                .eqIfPresent(IotRdDailyReportDO::getExternalRental, reqVO.getExternalRental())
+                .eqIfPresent(IotRdDailyReportDO::getNextPlan, reqVO.getNextPlan())
+                .eqIfPresent(IotRdDailyReportDO::getRdStatus, reqVO.getRdStatus())
+                .eqIfPresent(IotRdDailyReportDO::getMalfunction, reqVO.getMalfunction())
+                .betweenIfPresent(IotRdDailyReportDO::getFaultDowntime, reqVO.getFaultDowntime())
+                .eqIfPresent(IotRdDailyReportDO::getPersonnel, reqVO.getPersonnel())
+                .eqIfPresent(IotRdDailyReportDO::getTotalStaffNum, reqVO.getTotalStaffNum())
+                .eqIfPresent(IotRdDailyReportDO::getLeaveStaffNum, reqVO.getLeaveStaffNum())
+                .eqIfPresent(IotRdDailyReportDO::getExtProperty, reqVO.getExtProperty())
+                .eqIfPresent(IotRdDailyReportDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotRdDailyReportDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotRdDailyReportDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotRdDailyReportDO::getProcessInstanceId, reqVO.getProcessInstanceId())
+                .eqIfPresent(IotRdDailyReportDO::getAuditStatus, reqVO.getAuditStatus())
+                .betweenIfPresent(IotRdDailyReportDO::getCreateTime, reqVO.getCreateTime()));
+    }
 }

+ 177 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/dailyreport/CreateRdDailyReportOrderJob.java

@@ -0,0 +1,177 @@
+package cn.iocoder.yudao.module.pms.job.dailyreport;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
+import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
+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.message.PmsMessage;
+import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
+import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomService;
+import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderBomService;
+import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
+import cn.iocoder.yudao.module.pms.service.iotrddailyreport.IotRdDailyReportService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
+
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
+
+@Component
+@Slf4j
+public class CreateRdDailyReportOrderJob implements JobHandler {
+    @Resource
+    private IotDevicePersonService iotDevicePersonService;
+    @Resource
+    private IotMaintenanceBomService iotMaintenanceBomService;
+    @Autowired
+    private IotRdDailyReportService iotRdDailyReportService;
+
+    @Resource
+    private IotProjectTaskService iotProjectTaskService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private IotMainWorkOrderBomService iotMainWorkOrderBomService;
+
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
+    @Resource
+    private PmsMessage pmsMessage;
+    @Resource
+    private DeptService deptService;
+
+    @Override
+    @TenantIgnore
+    public String execute(String param) throws Exception {
+
+        // 查询 SAP同步领料单 开始时间 结束时间 数据字典
+        String createTime = DictFrameworkUtils.parseDictDataValue("rq_iot_rd_daily_report_createtime", "生成时间");
+
+        // 查询所有瑞都的项目任务 以‘井号-时间’ 为唯一键 当天创建时间 内没有生成过日报 就自动生成
+        IotRdDailyReportPageReqVO pageReqVO = new IotRdDailyReportPageReqVO();
+        List<IotRdDailyReportDO> dailyReports = iotRdDailyReportService.dailyReports(pageReqVO);
+        LocalDateTime currentDate = LocalDateTime.now();
+        String currentFormatDateStr = LocalDateTimeUtil.format(currentDate, "yyyy-MM-dd");
+        // 前一天的日期
+        LocalDateTime yesterday = currentDate.minusDays(1);
+        // 需要生成日报的 任务集合
+        Set<Long> taskIds = new HashSet<>();
+        if (CollUtil.isNotEmpty(dailyReports)) {
+            dailyReports.forEach(report -> {
+                // 查询 创建时间 不包含当天的日报
+                LocalDateTime createDate = report.getCreateTime();
+                String formatDateStr = LocalDateTimeUtil.format(createDate, "yyyy-MM-dd");
+                if (!formatDateStr.equals(currentFormatDateStr)) {
+                    taskIds.add(report.getTaskId());
+                }
+            });
+        }
+        // 查询瑞都相关的项目任务 根据每个任务的填报人进行工单生成和推送
+        IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
+        taskReqVO.setCompanyId(163l);
+        List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(taskReqVO);
+        Set<Long> userIds = new HashSet<>();
+        List<IotRdDailyReportDO> reports = new ArrayList<>();
+        Map<Long, Long> taskSubmitterPair = new HashMap<>();
+        if (CollUtil.isNotEmpty(tasks)) {
+            tasks.forEach(task -> {
+                // 查询当前任务的 工单填报人
+                Set<Long> submitterIds = task.getSubmitter();
+                if (CollUtil.isNotEmpty(submitterIds)) {
+                    // 查询工单填报人所在部门
+                    userIds.addAll(submitterIds);
+                    taskSubmitterPair.put(task.getId(), new ArrayList<>(submitterIds).get(0));
+                }
+            });
+            // 查询所有任务配置的工单填报人的信息
+            Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(userIds);
+            Set<Long> deptIds = new HashSet<>();
+            if (CollUtil.isNotEmpty(users)) {
+                // 统一查询所有用户所属的部门信息
+                users.forEach((userId, user) -> {
+                    deptIds.add(user.getDeptId());
+                });
+            }
+            Map<Long, DeptDO> deptPair = deptService.getDeptMap(deptIds);
+            // 以任务为维度 生成瑞都日报 部门为任务配置的工单填报人对应的部门
+            tasks.forEach(task -> {
+                if (taskIds.contains(task.getId()) && CollUtil.isNotEmpty(task.getSubmitter())) {
+                    // 生成当天的日报
+                    IotRdDailyReportDO report = new IotRdDailyReportDO();
+                    if (taskSubmitterPair.containsKey(task.getId())) {
+                        Long userId = taskSubmitterPair.get(task.getId());
+                        if (users.containsKey(userId)) {
+                            AdminUserRespDTO user = users.get(userId);
+                            report.setDeptId(user.getDeptId());
+                            // 根据用户部门名称 生成日报标题
+                            if (deptPair.containsKey(user.getDeptId())) {
+                                DeptDO dept = deptPair.get(user.getDeptId());
+                                String deptName = dept.getName();
+                                String[] multiLangDeptNames = deptName.split("~~");
+                                report.setReportName(multiLangDeptNames[0] + "/" + currentFormatDateStr + "日报填报" );
+                            }
+                        }
+                    }
+                    report.setProjectId(task.getProjectId());
+                    report.setTaskId(task.getId());
+                    report.setDeviceIds(task.getDeviceIds());
+                    report.setStartTime(LocalTime.of(8, 0, 0));
+                    report.setEndTime(LocalTime.of(8, 0, 0));
+                    report.setConstructionStartDate(yesterday);
+                    report.setConstructionEndDate(currentDate);
+                    report.setCreateTime(LocalDateTime.now());
+                    reports.add(report);
+                }
+            });
+        }
+        if (CollUtil.isNotEmpty(reports)) {
+            iotRdDailyReportService.batchAddDailyReports(reports);
+        }
+
+        // 向工单责任人发送 站内信及 钉钉消息
+        /* if (CollUtil.isNotEmpty(workOrders)) {
+            // 先查询所有工单责任人的手机号
+            Set<Long> personIds = new HashSet<>(convertList(workOrders, order -> Long.valueOf(order.getResponsiblePerson())));
+            Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(personIds);
+            // 建立保养工单与 用户手机号的 对应关系
+            Map<Long, String> orderMobilePair = new HashMap<>();
+            workOrders.forEach(order -> {
+                if (users.containsKey(Long.valueOf(order.getResponsiblePerson()))) {
+                    AdminUserRespDTO user = users.get(Long.valueOf(order.getResponsiblePerson()));
+                    orderMobilePair.put(order.getId(), user.getMobile());
+                }
+            });
+            // 异步多线程发送 站内信 钉钉 消息
+            workOrders.forEach(order -> {
+                CountDownLatch latch = new CountDownLatch(workOrders.size());
+                pmsThreadPoolTaskExecutor.execute(() -> {
+                    try {
+                        if (orderMobilePair.containsKey(order.getId())) {
+                            String mobile = orderMobilePair.get(order.getId());
+                            pmsMessage.sendMessage(order.getId(), order.getName(), PmsConstants.GENERATE_MAINTENANCE,
+                                    Long.valueOf(order.getResponsiblePerson()), mobile);
+                        }
+                    } finally {
+                        latch.countDown();
+                    }
+                });
+            });
+        } */
+        return "创建成功";
+    }
+}

+ 16 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportService.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDai
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 瑞都日报 Service 接口
@@ -52,4 +53,19 @@ public interface IotRdDailyReportService {
      */
     PageResult<IotRdDailyReportDO> getIotRdDailyReportPage(IotRdDailyReportPageReqVO pageReqVO);
 
+    /**
+     * 获得瑞都日报列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 瑞都日报列表
+     */
+    List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO pageReqVO);
+
+
+    /**
+     * 批量 新增日报工单
+     *
+     * @param
+     */
+    void batchAddDailyReports(List<IotRdDailyReportDO> reports);
 }

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

@@ -11,6 +11,8 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RD_DAILY_REPORT_NOT_EXISTS;
 
@@ -68,4 +70,14 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         return iotRdDailyReportMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO pageReqVO) {
+        return iotRdDailyReportMapper.dailyReports(pageReqVO);
+    }
+
+    @Override
+    public void batchAddDailyReports(List<IotRdDailyReportDO> reports) {
+        iotRdDailyReportMapper.insertBatch(reports);
+    }
+
 }