Browse Source

pms 设备bom关联维修保养

zhangcl 2 months ago
parent
commit
cb3a316d02

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

@@ -316,7 +316,7 @@ public class IotDeviceController {
     @Operation(summary = "获得设备-bom关联关系列表")
     @PreAuthorize("@ss.hasPermission('rq:iot-device:query')")
     public CommonResult<List<IotDeviceRespVO>> deviceAssociateBomList(IotDevicePageReqVO pageReqVO) {
-        List<IotDeviceRespVO> devices = iotDeviceService.deviceAssociateBomList(pageReqVO.getDeviceIds());
+        List<IotDeviceRespVO> devices = iotDeviceService.deviceAssociateBomList(pageReqVO);
         if (CollUtil.isEmpty(devices)) {
             return success(new ArrayList<>());
         }

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

@@ -119,6 +119,9 @@ public class IotDevicePageReqVO extends PageParam {
     @Schema(description = "设备分类BOM同步状态 1已同步 0未同步")
     private Integer bomSyncStatus;
 
+    @Schema(description = "查询相关的BOM分类标识 w维修 b保养")
+    private String bomFlag;
+
     /**
      * 自定义请求参数
      */

+ 4 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/IotDeviceMapper.java

@@ -150,8 +150,10 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
     IPage<IotDeviceRespVO> deviceAssociateBomPage(IPage<IotDeviceRespVO> page,
                                                   @Param("reqVO") IotDevicePageReqVO reqVO, @Param("deptIds") Collection<Long> deptIds);
 
-    List<IotDeviceRespVO> deviceAssociateBomList(@Param("deviceIds") Collection<Long> deviceIds);
-    IPage<IotDeviceRespVO> deviceAssociateBomListPage(IPage<IotDeviceRespVO> page, @Param("deviceIds") Collection<Long> deviceIds);
+    List<IotDeviceRespVO> deviceAssociateBomList(@Param("deviceIds") Collection<Long> deviceIds, @Param("bomFlag") String bomFlag);
+
+    IPage<IotDeviceRespVO> deviceAssociateBomListPage(IPage<IotDeviceRespVO> page,
+                                                      @Param("deviceIds") Collection<Long> deviceIds, @Param("bomFlag") String bomFlag);
     default Long selectCountByTimeAndStatus(IotDevicePageReqVO reqVO) {
         return selectCount(new LambdaQueryWrapperX<IotDeviceDO>()
                 .eqIfPresent(IotDeviceDO::getDeviceStatus, reqVO.getDeviceStatus())

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

@@ -55,6 +55,7 @@ public interface IotMainWorkOrderMapper extends BaseMapperX<IotMainWorkOrderDO>
                 .eqIfPresent(IotMainWorkOrderDO::getOrderNumber, reqVO.getOrderNumber())
                 .likeIfPresent(IotMainWorkOrderDO::getName, reqVO.getName())
                 .eqIfPresent(IotMainWorkOrderDO::getType, reqVO.getType())
+                .eqIfPresent(IotMainWorkOrderDO::getOrderGroupId, reqVO.getOrderGroupId())
                 .eqIfPresent(IotMainWorkOrderDO::getResponsiblePerson, reqVO.getResponsiblePerson())
                 .likeIfPresent(IotMainWorkOrderDO::getResponsiblePersonName, reqVO.getResponsiblePersonName())
                 .eqIfPresent(IotMainWorkOrderDO::getCost, reqVO.getCost())

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

@@ -2,6 +2,9 @@ package cn.iocoder.yudao.module.pms.job.mainworkorder;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+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.controller.admin.iotdeviceperson.vo.IotDevicePersonPageReqVO;
@@ -9,12 +12,14 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDevice
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdeviceperson.IotDevicePersonDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
 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.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
 import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
 import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomService;
@@ -28,6 +33,7 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -51,6 +57,8 @@ public class CreateMainWorkOrderJob implements JobHandler {
     private IotMainWorkOrderService iotMainWorkOrderService;
     @Resource
     private IotMainWorkOrderBomService iotMainWorkOrderBomService;
+    @Resource
+    private IotDeviceService iotDeviceService;
 
     @Override
     @TenantJob
@@ -91,6 +99,8 @@ public class CreateMainWorkOrderJob implements JobHandler {
                             )
                     ));
         }
+        // 查询所有设备名称 设备编码集合
+        Map<Long, IotDeviceRespVO> devices = iotDeviceService.getDeviceMap(deviceIds);
         // 查询保养计划明细中所有设备的累计运行里程、累计运行时间
         Map<Long, IotDeviceRunLogRespVO> deviceRunLogMap = iotDeviceRunLogService.getDeviceRunLogMap(convertListByFlatMap(mainBomList,
                 bom -> Stream.of(bom.getDeviceId())));
@@ -207,13 +217,13 @@ public class CreateMainWorkOrderJob implements JobHandler {
             });
             // 以保养计划id对待保养工单分组 分组后便于生成 保养工单主表记录
             // key保养计划id value待保养工单明细集合
-            Map<Long, List<IotMainWorkOrderBomDO>> workOrderBomPair = new HashMap<>();
+            // Map<Long, List<IotMainWorkOrderBomDO>> workOrderBomPair = new HashMap<>();
             // 以设备为维度 统计每种设备对应的 保养项集合 key保养计划id+设备id value设备对应的保养项集合
             Map<String, List<IotMainWorkOrderBomDO>> deviceBomPair = new HashMap<>();
             // 最终使用的保养工单明细 设置了保养工单主表id
             List<IotMainWorkOrderBomDO> finalWorkOrderBomS = new ArrayList<>();
             if (CollUtil.isNotEmpty(workOrderBOMs)) {
-                workOrderBOMs.forEach(workOrderBom -> {
+                /* workOrderBOMs.forEach(workOrderBom -> {
                     if (workOrderBomPair.containsKey(workOrderBom.getWorkOrderId())) {
                         List<IotMainWorkOrderBomDO> tempOrderBomS = workOrderBomPair.get(workOrderBom.getWorkOrderId());
                         tempOrderBomS.add(workOrderBom);
@@ -223,7 +233,7 @@ public class CreateMainWorkOrderJob implements JobHandler {
                         tempOrderBomS.add(workOrderBom);
                         workOrderBomPair.put(workOrderBom.getWorkOrderId(), tempOrderBomS);
                     }
-                });
+                }); */
                 // 组装设备及对应的 保养项集合 map
                 workOrderBOMs.forEach(bom -> {
                     String uniqueKey = bom.getWorkOrderId()+"-"+bom.getDeviceId();
@@ -239,11 +249,55 @@ public class CreateMainWorkOrderJob implements JobHandler {
                 });
 
                 // 按照 保养计划id+设备id 分组 每个"保养计划id+设备id" 生成一个工单
-                deviceBomPair.forEach((k,v) -> {
-
+                Map<Long, List<Long>> finalDevicePersonPair = devicePersonPair;
+                // 获取当前时间的 yyyy-MM-dd 格式
+                String currentDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY));
+                deviceBomPair.forEach((k, v) -> {
+                    String[] planIdDeviceIdStrS = k.split("-");
+                    // 查询当前设备关联的责任人 如果有多个责任人 需要建立多个对应的工单 但是多个工单 要建立关联关系
+                    if (finalDevicePersonPair.containsKey(Long.valueOf(planIdDeviceIdStrS[1]))) {
+                        List<Long> personIds = finalDevicePersonPair.get(Long.valueOf(planIdDeviceIdStrS[1]));
+                        if (CollUtil.isNotEmpty(personIds)) {
+                            // 多个责任人的相同工单 使用 order_group_id 建立关联
+                            String orderGroupId = StrUtil.uuid();
+                            personIds.forEach(personId -> {
+                                // k保养计划id   v已经触发的保养工单明细
+                                IotMaintenancePlanDO plan = maintenancePair.get(Long.valueOf(planIdDeviceIdStrS[0]));
+                                IotMainWorkOrderDO workOrder = new IotMainWorkOrderDO();
+                                theMaxId.getAndSet(theMaxId.get() + 1);
+                                workOrder.setId(theMaxId.get());
+                                // 设备多个责任人关联工单标识
+                                workOrder.setOrderGroupId(orderGroupId);
+                                // 查询设备对应的部门
+                                workOrder.setDeptId(plan.getDeptId());
+                                workOrder.setName(plan.getName() + " 工单");
+                                if (devices.containsKey(Long.valueOf(planIdDeviceIdStrS[1]))) {
+                                    workOrder.setDeptId(devices.get(Long.valueOf(planIdDeviceIdStrS[1])).getDeptId());
+                                    workOrder.setName(devices.get(Long.valueOf(planIdDeviceIdStrS[1])).getDeviceCode() + " "
+                                            + devices.get(Long.valueOf(planIdDeviceIdStrS[1])).getDeviceName() + currentDate + " 保养工单");
+                                }
+                                workOrder.setPlanId(plan.getId());
+                                workOrder.setOrderNumber(iotMainWorkOrderService.createWorkOrderNumber());
+                                workOrder.setType(1);   // 计划生成
+                                workOrder.setResult(1); // 待执行
+                                workOrder.setResponsiblePerson(String.valueOf(personId));
+                                workOrder.setAuditStatus(FailureAuditStatusEnum.DRAFT.getStatus());
+                                workOrder.setCreator(String.valueOf(personId));
+                                workOrders.add(workOrder);
+                                // 2. 处理关联的BOM明细
+                                final long workOrderId = workOrder.getId(); // 获取当前工单ID
+                                v.forEach(bom -> {
+                                    IotMainWorkOrderBomDO tempBom = new IotMainWorkOrderBomDO();
+                                    BeanUtils.copyProperties(bom,tempBom);
+                                    tempBom.setWorkOrderId(workOrderId);
+                                    finalWorkOrderBomS.add(tempBom);
+                                });
+                            });
+                        }
+                    }
                 });
 
-                workOrderBomPair.forEach((k,v) -> {
+                /* workOrderBomPair.forEach((k,v) -> {
                     // k保养计划id   v已经触发的保养工单明细
                     IotMaintenancePlanDO plan = maintenancePair.get(k);
                     IotMainWorkOrderDO workOrder = new IotMainWorkOrderDO();
@@ -264,7 +318,7 @@ public class CreateMainWorkOrderJob implements JobHandler {
                     v.forEach(bom -> bom.setWorkOrderId(workOrderId)); // 设置明细关联ID
                     // 3. 添加到最终集合
                     finalWorkOrderBomS.addAll(v);
-                });
+                }); */
             }
             // 批量新增 保养工单记录
             if (CollUtil.isNotEmpty(workOrders)) {

+ 2 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java

@@ -3,14 +3,11 @@ package cn.iocoder.yudao.module.pms.service;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
-import cn.iocoder.yudao.module.pms.controller.admin.vo.DeviceVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.ThingsModelDO;
-import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
-import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 
 import javax.validation.Valid;
 import java.util.Collection;
@@ -107,10 +104,10 @@ public interface IotDeviceService {
     /**
      * 获得 设备bom 关联 关系 列表
      *
-     * @param deviceIds
+     * @param pageReqVO
      * @return 设备bom 关联 列表
      */
-    List<IotDeviceRespVO> deviceAssociateBomList(List<Long> deviceIds);
+    List<IotDeviceRespVO> deviceAssociateBomList(IotDevicePageReqVO pageReqVO);
     PageResult<IotDeviceRespVO> deviceAssociateBomListPage(IotDevicePageReqVO pageReqVO);
 
     /**

+ 4 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java

@@ -321,14 +321,15 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     }
 
     @Override
-    public List<IotDeviceRespVO> deviceAssociateBomList(List<Long> deviceIds) {
-        List<IotDeviceRespVO> devices = iotDeviceMapper.deviceAssociateBomList(deviceIds);
+    public List<IotDeviceRespVO> deviceAssociateBomList(IotDevicePageReqVO pageReqVO) {
+        List<IotDeviceRespVO> devices = iotDeviceMapper.deviceAssociateBomList(pageReqVO.getDeviceIds(), pageReqVO.getBomFlag());
         return devices;
     }
 
     @Override
     public PageResult<IotDeviceRespVO> deviceAssociateBomListPage(IotDevicePageReqVO pageReqVO) {
-        IPage<IotDeviceRespVO> page = iotDeviceMapper.deviceAssociateBomListPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO.getDeviceIds());
+        IPage<IotDeviceRespVO> page = iotDeviceMapper.deviceAssociateBomListPage(new Page<>(pageReqVO.getPageNo(),
+                pageReqVO.getPageSize()), pageReqVO.getDeviceIds(), pageReqVO.getBomFlag());
         return new PageResult<>(page.getRecords(), page.getTotal());
     }
 

+ 21 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderServiceImpl.java

@@ -573,6 +573,27 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
                 }
             }
         }
+        // 将当前工单的关联工单 一并关闭 是否需要将当前工单选择的物料及费用也复制到 关联工单?
+        IotMainWorkOrderPageReqVO orderReqVO = new IotMainWorkOrderPageReqVO();
+        orderReqVO.setOrderGroupId(updateObj.getOrderGroupId());
+        List<IotMainWorkOrderDO> associateOrders = iotMainWorkOrderMapper.selectList(orderReqVO);
+        List<IotMainWorkOrderDO> filteredOrders = associateOrders.stream()
+                .filter(order -> !order.getId().equals(updateObj.getId()))
+                .collect(Collectors.toList());
+        if (CollUtil.isNotEmpty(filteredOrders)) {
+            // 将关联工单设置为 已执行
+            filteredOrders.forEach(order -> order.setResult(2));
+            iotMainWorkOrderMapper.updateBatch(filteredOrders);
+            List<Long> workOrderIds = filteredOrders.stream()
+                    .map(IotMainWorkOrderDO::getId)
+                    .collect(Collectors.toList());
+            // 将关联工单的明细 status 设置为 1
+            IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
+            reqVO.setWorkOrderIds(workOrderIds);
+            List<IotMainWorkOrderBomDO> associateOrderBomS = iotMainWorkOrderBomMapper.selectList(reqVO);
+            associateOrderBomS.forEach(order -> order.setStatus(1));
+            iotMainWorkOrderBomMapper.updateBatch(associateOrderBomS);
+        }
         // 只扣减本地库存 不处理SAP库存
         if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {
             IotLockStockPageReqVO reqVO = new IotLockStockPageReqVO();

+ 14 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceMapper.xml

@@ -242,12 +242,17 @@
                 t1.`code`
             FROM
                 rq_iot_device t
-            INNER JOIN rq_iot_bom t1 ON ( t1.device_category_id = t.asset_class AND t1.deleted = 0 )
+            INNER JOIN rq_iot_device_bom t1 ON ( t1.device_id = t.id AND t1.deleted = 0 )
             WHERE
                 t.deleted = 0
             AND t1.deleted = 0
             AND t1.leaf_flag = 1
-            AND t1.type LIKE '%2%'
+            <if test='bomFlag!=null and bomFlag!="" and bomFlag=="b" '>
+                AND t1.type LIKE '%2%'
+            </if>
+            <if test='bomFlag!=null and bomFlag!="" and bomFlag=="w" '>
+                AND t1.type LIKE '%1%'
+            </if>
             <if test="deviceIds != null and deviceIds.size &gt; 0">
                 AND t.id IN
                 <foreach collection="deviceIds" index="index" item="key" open="(" separator="," close=")">
@@ -297,12 +302,17 @@
         t1.`code`
         FROM
         rq_iot_device t
-        INNER JOIN rq_iot_bom t1 ON ( t1.device_category_id = t.asset_class AND t1.deleted = 0 )
+        INNER JOIN rq_iot_device_bom t1 ON ( t1.device_id = t.id AND t1.deleted = 0 )
         WHERE
         t.deleted = 0
         AND t1.deleted = 0
         AND t1.leaf_flag = 1
-        AND t1.type LIKE '%2%'
+        <if test='bomFlag!=null and bomFlag!="" and bomFlag=="b" '>
+            AND t1.type LIKE '%2%'
+        </if>
+        <if test='bomFlag!=null and bomFlag!="" and bomFlag=="w" '>
+            AND t1.type LIKE '%1%'
+        </if>
         <if test="deviceIds != null and deviceIds.size &gt; 0">
             AND t.id IN
             <foreach collection="deviceIds" index="index" item="key" open="(" separator="," close=")">