Просмотр исходного кода

pms 保养计划生成保养工单 站内信 钉钉消息

zhangcl 2 месяцев назад
Родитель
Сommit
ec469a6487

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/constant/PmsConstants.java

@@ -15,4 +15,7 @@ public interface PmsConstants {
 
     String GENERATE_OPERATION = "generateOperation";
     String GENERATE_OPERATION_TEMPLATE = "generate-operation";
+
+    // 物料领用单
+    String MATERIAL_REQUISITION = "material-requisition";
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaterialrequisition/IotMaterialRequisitionController.java

@@ -47,7 +47,7 @@ public class IotMaterialRequisitionController {
     @PutMapping("/addMaterialRequisition")
     @Operation(summary = "新增物料领用")
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order:create')")
-    public CommonResult<Boolean> addWorkOrder(@Valid @RequestBody IotMaterialRequisitionSaveVO saveVO) {
+    public CommonResult<Boolean> addMaterialRequisition(@Valid @RequestBody IotMaterialRequisitionSaveVO saveVO) {
         iotMaterialRequisitionService.addMaterialRequisition(saveVO);
         return success(true);
     }

+ 15 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmaterialrequisition/IotMaterialRequisitionMapper.java

@@ -1,11 +1,16 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotmaterialrequisition;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialrequisition.vo.IotMaterialRequisitionPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterialrequisition.IotMaterialRequisitionDO;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 物料领用 Mapper
@@ -36,4 +41,14 @@ public interface IotMaterialRequisitionMapper extends BaseMapperX<IotMaterialReq
                 .orderByDesc(IotMaterialRequisitionDO::getId));
     }
 
+    /**
+     * 查询指定角色 指定部门的人员 (需要过滤掉数据权限)
+     *
+     * @param roleCode
+     * @param deptId
+     * @return
+     */
+    @DataPermission(enable = false)
+    List<AdminUserRespDTO> msgReceiveUsers(@Param("roleCode") String roleCode, @Param("deptId") Long deptId);
+
 }

+ 44 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/mainworkorder/CreateMainWorkOrderJob.java

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
 import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
+import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomPageReqVO;
@@ -19,6 +20,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOr
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
+import cn.iocoder.yudao.module.pms.message.PmsMessage;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
 import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
@@ -26,8 +28,11 @@ import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomSe
 import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderBomService;
 import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 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;
@@ -35,11 +40,14 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
 
 @Component
 @Slf4j
@@ -59,6 +67,12 @@ public class CreateMainWorkOrderJob implements JobHandler {
     private IotMainWorkOrderBomService iotMainWorkOrderBomService;
     @Resource
     private IotDeviceService iotDeviceService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
+    @Resource
+    private PmsMessage pmsMessage;
 
     @Override
     @TenantJob
@@ -328,6 +342,36 @@ public class CreateMainWorkOrderJob implements JobHandler {
             if (CollUtil.isNotEmpty(finalWorkOrderBomS)) {
                 iotMainWorkOrderBomService.batchAddOrderBOMs(finalWorkOrderBomS);
             }
+            // 向工单责任人发送 站内信及 钉钉消息
+            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(order.getResponsiblePerson())) {
+                        AdminUserRespDTO user = users.get(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);
+                                System.out.println("保养工单消息:" + order.getId() + "-" + mobile);
+                            }
+                        } finally {
+                            latch.countDown();
+                        }
+                    });
+                });
+            }
         }
         return "创建成功";
     }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/sap/SyncSapPickingListJob.java

@@ -58,7 +58,7 @@ public class SyncSapPickingListJob implements JobHandler {
             return "No startTime or endTime";
         }
         factoryCodes.forEach(factory -> {
-            CountDownLatch latch = new CountDownLatch(factoryCodes.size());;
+            CountDownLatch latch = new CountDownLatch(factoryCodes.size());
             pmsThreadPoolTaskExecutor.execute(() -> {
                 try {
                     JCoDestination destination = sapConnector.getDestination();

+ 14 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.pms.message;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.system.api.dingtalk.DingtalkSendApi;
 import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
@@ -26,10 +27,18 @@ public class PmsMessage {
         templateParams.put("businessType", businessType);
         templateParams.put("businessId", businessId);
         notifyMessageSendApi.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO()
-                .setUserId(userId).setTemplateCode(PmsConstants.GENERATE_INSPECT_TEMPLATE).setTemplateParams(templateParams));
-        //发送钉钉消息
-        String msg = "您有新的巡检工单待处理,请审批。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
-        String url="https://iot.deepoil.cc/dingding?id="+businessId+"&type="+businessType;
-        dingtalkSendApi.send(mobile, msg,"link", url);
+                .setUserId(userId).setTemplateCode(businessType).setTemplateParams(templateParams));
+        if (StrUtil.isNotBlank(mobile)) {
+            //发送钉钉消息
+            String msg = "您有新的巡检工单待处理,请审批。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+            if (PmsConstants.MATERIAL_REQUISITION.equals(businessType)) {
+                msg = "物料领用单 " + name + " 已生成,请知悉。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+            }
+            if (PmsConstants.GENERATE_MAINTENANCE.equals(businessType)) {
+                msg = "您有新的保养工单 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+            }
+            String url="https://iot.deepoil.cc/dingding?id="+businessId+"&type="+businessType;
+            dingtalkSendApi.send(mobile, msg,"link", url);
+        }
     }
 }

+ 46 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmaterialrequisition/IotMaterialRequisitionServiceImpl.java

@@ -1,9 +1,13 @@
 package cn.iocoder.yudao.module.pms.service.iotmaterialrequisition;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialrequisition.vo.IotMaterialRequisitionPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialrequisition.vo.IotMaterialRequisitionSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialrequisition.vo.IotMaterialRequisitionSaveVO;
@@ -13,15 +17,23 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterialrequisitiondetail.I
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmaterialrequisition.IotMaterialRequisitionMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmaterialrequisitiondetail.IotMaterialRequisitionDetailMapper;
 import cn.iocoder.yudao.module.pms.dal.redis.BizNoRedisDAO;
+import cn.iocoder.yudao.module.pms.message.PmsMessage;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MATERIAL_REQUISITION_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
 
 /**
  * 物料领用 Service 实现类
@@ -38,6 +50,14 @@ public class IotMaterialRequisitionServiceImpl implements IotMaterialRequisition
     private IotMaterialRequisitionDetailMapper iotMaterialRequisitionDetailMapper;
     @Resource
     private BizNoRedisDAO bizNoRedisDAO;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private DeptApi deptApi;
+    @Resource
+    private PmsMessage pmsMessage;
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
 
     @Override
     public Long createIotMaterialRequisition(IotMaterialRequisitionSaveReqVO createReqVO) {
@@ -110,7 +130,32 @@ public class IotMaterialRequisitionServiceImpl implements IotMaterialRequisition
         }
         // 记录物料出库
         // 向当前登录人的上级 发送钉钉 站内信 消息
-
+        // 查询当前便当人的上级部门 合并 指定角色 关联查询
+        List<String> receiveRoles = DictFrameworkUtils.getDictDataLabelList("iot_material_req_msg_receive_role");
+        // 查询当前登录人的上级部门
+        Long userId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO user = adminUserApi.getUser(userId);
+        Long deptId = user.getDeptId();
+        DeptRespDTO dept = deptApi.getDept(deptId);
+        Long parentDeptId = dept.getParentId();
+        // 结合上级部门id 和 角色id 筛选出消息接收人
+        if (CollUtil.isNotEmpty(receiveRoles) && ObjUtil.isNotEmpty(parentDeptId)) {
+            List<AdminUserRespDTO> receiveUsers = iotMaterialRequisitionMapper.msgReceiveUsers(receiveRoles.get(0), parentDeptId);
+            // 发送 站内信 和 钉钉消息
+            if (CollUtil.isNotEmpty(receiveUsers)) {
+                receiveUsers.forEach(ru -> {
+                    CountDownLatch latch = new CountDownLatch(receiveUsers.size());
+                    pmsThreadPoolTaskExecutor.execute(() -> {
+                        try {
+                            pmsMessage.sendMessage(requisition.getId(), requisition.getName(), PmsConstants.MATERIAL_REQUISITION, ru.getId(), ru.getMobile());
+                            System.out.println("领料消息:" + requisition.getId() + "-" + ru.getMobile());
+                        }  finally {
+                            latch.countDown();
+                        }
+                    });
+                });
+            }
+        }
     }
 
     @Override

+ 30 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMaterialRequisitionMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.pms.dal.mysql.iotmaterialrequisition.IotMaterialRequisitionMapper">
+
+    <!-- 查询指定部门 指定角色的人员列表 -->
+    <select id="msgReceiveUsers" resultType="cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO">
+        SELECT
+            u.id AS id,
+            u.username AS username,
+            u.nickname AS nickname,
+            u.mobile AS mobile
+        FROM system_users u
+         INNER JOIN system_user_role ur
+                    ON u.id = ur.user_id
+                        AND ur.deleted = 0
+         INNER JOIN system_role r
+                    ON ur.role_id = r.id
+                        AND r.deleted = 0
+                        <if test="roleCode != null and roleCode != ''">
+                            AND r.code = #{roleCode}
+                        </if>
+        WHERE
+            u.deleted = 0
+        <if test="deptId != null and deptId != ''">
+            AND u.dept_id = #{deptId}
+        </if>
+        GROUP BY u.id;
+    </select>
+
+</mapper>

+ 4 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserRespDTO.java

@@ -17,6 +17,10 @@ public class AdminUserRespDTO {
      * 用户ID
      */
     private Long id;
+    /**
+     * 用户名
+     */
+    private String username;
     /**
      * 用户昵称
      */