Browse Source

Merge remote-tracking branch 'origin/master'

lipenghui 1 week ago
parent
commit
9e6f49cdd9

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

@@ -89,7 +89,14 @@ public class IotMainWorkOrderBomMaterialController {
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order-bom-material:query')")
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order-bom-material:query')")
     public CommonResult<List<IotMainWorkOrderBomMaterialRespVO>> getIotMainWorkOrderBomMaterialList(@Valid IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
     public CommonResult<List<IotMainWorkOrderBomMaterialRespVO>> getIotMainWorkOrderBomMaterialList(@Valid IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
         List<IotMainWorkOrderBomMaterialDO> list = iotMainWorkOrderBomMaterialService.getIotMainWorkOrderBomMaterialList(pageReqVO);
         List<IotMainWorkOrderBomMaterialDO> list = iotMainWorkOrderBomMaterialService.getIotMainWorkOrderBomMaterialList(pageReqVO);
-        return success(BeanUtils.toBean(list, IotMainWorkOrderBomMaterialRespVO.class));
+        // 查询已经关联的物料的 工厂 成本中心 库存地点 信息
+        Map<Long, SapOrgRespDTO> factoryMap = sapOrgApi.getSapOrgMap(
+                convertList(list, IotMainWorkOrderBomMaterialDO::getFactoryId));
+        Map<Long, SapOrgRespDTO> costCenterMap = sapOrgApi.getSapOrgMap(
+                convertList(list, IotMainWorkOrderBomMaterialDO::getCostCenterId));
+        Map<Long, SapOrgRespDTO> storageLocationMap = sapOrgApi.getSapOrgMap(
+                convertList(list, IotMainWorkOrderBomMaterialDO::getStorageLocationId));
+        return success(IotWorkOrderBomMaterialConvert.INSTANCE.convertList1(list, factoryMap, costCenterMap, storageLocationMap));
     }
     }
 
 
     @GetMapping("/workOrderMaterials")
     @GetMapping("/workOrderMaterials")

+ 23 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotmainworkorderbommaterial/IotWorkOrderBomMaterialConvert.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
 import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
 import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 import org.mapstruct.factory.Mappers;
@@ -23,6 +24,13 @@ public interface IotWorkOrderBomMaterialConvert {
                 costCenterMap.get(stock.getCostCenterId()), stockLocationMap.get(stock.getStorageLocationId())));
                 costCenterMap.get(stock.getCostCenterId()), stockLocationMap.get(stock.getStorageLocationId())));
     }
     }
 
 
+    default List<IotMainWorkOrderBomMaterialRespVO> convertList1(List<IotMainWorkOrderBomMaterialDO> list,
+                                                                Map<Long, SapOrgRespDTO> factoryMap,
+                                                                Map<Long, SapOrgRespDTO> costCenterMap, Map<Long, SapOrgRespDTO> stockLocationMap) {
+        return CollectionUtils.convertList(list, stock -> convert2(stock, factoryMap.get(stock.getFactoryId()),
+                costCenterMap.get(stock.getCostCenterId()), stockLocationMap.get(stock.getStorageLocationId())));
+    }
+
     default IotMainWorkOrderBomMaterialRespVO convert1(IotMainWorkOrderBomMaterialRespVO stock,
     default IotMainWorkOrderBomMaterialRespVO convert1(IotMainWorkOrderBomMaterialRespVO stock,
                                                        SapOrgRespDTO factory, SapOrgRespDTO costCenter, SapOrgRespDTO projectDepartment) {
                                                        SapOrgRespDTO factory, SapOrgRespDTO costCenter, SapOrgRespDTO projectDepartment) {
         IotMainWorkOrderBomMaterialRespVO stockVO = BeanUtils.toBean(stock, IotMainWorkOrderBomMaterialRespVO.class);
         IotMainWorkOrderBomMaterialRespVO stockVO = BeanUtils.toBean(stock, IotMainWorkOrderBomMaterialRespVO.class);
@@ -38,4 +46,19 @@ public interface IotWorkOrderBomMaterialConvert {
         return stockVO;
         return stockVO;
     }
     }
 
 
+    default IotMainWorkOrderBomMaterialRespVO convert2(IotMainWorkOrderBomMaterialDO stock,
+                                                       SapOrgRespDTO factory, SapOrgRespDTO costCenter, SapOrgRespDTO projectDepartment) {
+        IotMainWorkOrderBomMaterialRespVO stockVO = BeanUtils.toBean(stock, IotMainWorkOrderBomMaterialRespVO.class);
+        if (ObjectUtil.isNotEmpty(factory)) {
+            stockVO.setFactory(factory.getFactoryName());
+        }
+        if (ObjectUtil.isNotEmpty(costCenter)) {
+            stockVO.setCostCenter(costCenter.getCostCenterName());
+        }
+        if (ObjectUtil.isNotEmpty(projectDepartment)) {
+            stockVO.setProjectDepartment(projectDepartment.getStorageLocationName());
+        }
+        return stockVO;
+    }
+
 }
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialServiceImpl.java

@@ -380,7 +380,7 @@ public class IotDeviceMaterialServiceImpl implements IotDeviceMaterialService {
                         material.setFactory(StrUtil.EMPTY);
                         material.setFactory(StrUtil.EMPTY);
                         material.setStorageLocation(StrUtil.EMPTY);
                         material.setStorageLocation(StrUtil.EMPTY);
                         material.setCostCenter(StrUtil.EMPTY);
                         material.setCostCenter(StrUtil.EMPTY);
-                        material.setMaterialSource("SAP主数据");
+                        material.setMaterialSource("sap主数据");
                     }
                     }
                 });
                 });
                 deviceMaterials.forEach(bomMaterial -> {
                 deviceMaterials.forEach(bomMaterial -> {

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

@@ -1340,30 +1340,36 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         // key设备id-保养项BOM节点id   value保养工单明细对象   用于更新关联的保养计划保养项
         // key设备id-保养项BOM节点id   value保养工单明细对象   用于更新关联的保养计划保养项
         Map<String, IotMainWorkOrderBomSaveReqVO> deviceBomPair = new HashMap<>();
         Map<String, IotMainWorkOrderBomSaveReqVO> deviceBomPair = new HashMap<>();
         workOrderBOMs.forEach(bom -> {
         workOrderBOMs.forEach(bom -> {
+            IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
             if (ObjUtil.isNotEmpty(bom.getStatus()) && 0 == bom.getStatus()) {
             if (ObjUtil.isNotEmpty(bom.getStatus()) && 0 == bom.getStatus()) {
                 // 兼容保养工单中部分保养项保养完成 部分保养项 延期保养的情况 这里只更新延期保养 或正常 保养的物料
                 // 兼容保养工单中部分保养项保养完成 部分保养项 延期保养的情况 这里只更新延期保养 或正常 保养的物料
-                IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
                 // 如果工单明细中任何一个保养项设置了 任何一种推迟保养规则 工单结果 不能设置为 已执行
                 // 如果工单明细中任何一个保养项设置了 任何一种推迟保养规则 工单结果 不能设置为 已执行
-                if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)>0
-                        || bom.getDelayDuration().compareTo(BigDecimal.ZERO)>0 || bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)>0) {
-                    tempBom.setStatus(0);
-                    mainCompleted.set(false);
-                }
-                if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)==0
+                /* if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)>0
+                        || bom.getDelayDuration().compareTo(BigDecimal.ZERO)>0 || bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)>0) { */
+                tempBom.setStatus(0);
+                mainCompleted.set(false);
+                // }
+                /* if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)==0
                         && bom.getDelayDuration().compareTo(BigDecimal.ZERO)==0 && bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)==0) {
                         && bom.getDelayDuration().compareTo(BigDecimal.ZERO)==0 && bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)==0) {
                     // 如果保养项没有设置延时保养 则查询当前设备的 累计运行公里数 累计运行时间 当前时间日期 赋值到 关联保养计划 明细 的 对应保养规则数据上
                     // 如果保养项没有设置延时保养 则查询当前设备的 累计运行公里数 累计运行时间 当前时间日期 赋值到 关联保养计划 明细 的 对应保养规则数据上
                     deviceIds.add(bom.getDeviceId());
                     deviceIds.add(bom.getDeviceId());
                     // 保养项下如果已经添加了物料 说明该保养项已经保养完成
                     // 保养项下如果已经添加了物料 说明该保养项已经保养完成
                     bomNodeIds.add(bom.getBomNodeId());
                     bomNodeIds.add(bom.getBomNodeId());
                     tempBom.setStatus(1);
                     tempBom.setStatus(1);
-                }
-                workOrderBomDOS.add(tempBom);
+                } */
+            } else if (ObjUtil.isNotEmpty(bom.getStatus()) && 1 == bom.getStatus()) {
+                // 当前保养项已经保养完成 查询当前设备的 累计运行公里数 累计运行时间 当前时间日期 赋值到 关联保养计划 明细 的 对应保养规则数据上
+                deviceIds.add(bom.getDeviceId());
+                // 保养项下如果已经添加了物料 说明该保养项已经保养完成
+                bomNodeIds.add(bom.getBomNodeId());
+                tempBom.setStatus(1);
                 // 设置需要更新 关联保养计划 保养项 运行时间周期(H) 的设备id 保养项id 集合
                 // 设置需要更新 关联保养计划 保养项 运行时间周期(H) 的设备id 保养项id 集合
                 mctDeviceIds.add(bom.getDeviceId());
                 mctDeviceIds.add(bom.getDeviceId());
                 mctBomNodeIds.add(bom.getBomNodeId());
                 mctBomNodeIds.add(bom.getBomNodeId());
                 String uniqueKey = StrUtil.join("-", bom.getDeviceId(), bom.getBomNodeId());
                 String uniqueKey = StrUtil.join("-", bom.getDeviceId(), bom.getBomNodeId());
                 deviceBomPair.put(uniqueKey, bom);
                 deviceBomPair.put(uniqueKey, bom);
             }
             }
+            workOrderBomDOS.add(tempBom);
         });
         });
         if (CollUtil.isNotEmpty(workOrderBOMs)) {
         if (CollUtil.isNotEmpty(workOrderBOMs)) {
             // 组装bom关联的设备信息
             // 组装bom关联的设备信息
@@ -1463,16 +1469,16 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         if (2 == updateObj.getResult()) {
         if (2 == updateObj.getResult()) {
             if (CollUtil.isNotEmpty(filteredOrders)) {
             if (CollUtil.isNotEmpty(filteredOrders)) {
                 // 将关联工单设置为 已执行 直接删除
                 // 将关联工单设置为 已执行 直接删除
-                filteredOrders.forEach(order -> {order.setResult(2);  order.setDeleted(true);});
+                filteredOrders.forEach(order -> { order.setResult(2);  order.setDeleted(true); });
                 iotMainWorkOrderMapper.updateBatch(filteredOrders);
                 iotMainWorkOrderMapper.updateBatch(filteredOrders);
                 List<Long> workOrderIds = filteredOrders.stream()
                 List<Long> workOrderIds = filteredOrders.stream()
                         .map(IotMainWorkOrderDO::getId)
                         .map(IotMainWorkOrderDO::getId)
                         .collect(Collectors.toList());
                         .collect(Collectors.toList());
-                // 将关联工单的明细 status 设置为 1
+                // 将关联工单的明细 status 设置为 1 直接删除
                 IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
                 IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
                 reqVO.setWorkOrderIds(workOrderIds);
                 reqVO.setWorkOrderIds(workOrderIds);
                 List<IotMainWorkOrderBomDO> associateOrderBomS = iotMainWorkOrderBomMapper.selectList(reqVO);
                 List<IotMainWorkOrderBomDO> associateOrderBomS = iotMainWorkOrderBomMapper.selectList(reqVO);
-                associateOrderBomS.forEach(order -> order.setStatus(1));
+                associateOrderBomS.forEach(order -> { order.setStatus(1); order.setDeleted(true); });
                 iotMainWorkOrderBomMapper.updateBatch(associateOrderBomS);
                 iotMainWorkOrderBomMapper.updateBatch(associateOrderBomS);
             }
             }
         }
         }
@@ -1488,10 +1494,10 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
                     order.setLaborCost(updateObj.getLaborCost());
                     order.setLaborCost(updateObj.getLaborCost());
                     order.setRemark(updateObj.getRemark());
                     order.setRemark(updateObj.getRemark());
                 });
                 });
+                // 更新 关联保养工单的相关数据
+                iotMainWorkOrderMapper.updateBatch(filteredOrders);
             }
             }
         }
         }
-        // 如果在填报工单时 填写了 保养项 中的 ‘运行时间周期(H)’ 保存时需要同步到 保养工单 关联的 保养计划的 对应的保养项的 ‘运行时间周期(H)’
-        // 包含 延时保养 的情况
         // 只扣减本地库存 不处理SAP库存
         // 只扣减本地库存 不处理SAP库存
         // 保养基于单设备 出库时记录 单设备所属的部门id(即保养工单的部门id)
         // 保养基于单设备 出库时记录 单设备所属的部门id(即保养工单的部门id)
         if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {
         if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {

+ 85 - 28
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotWorkOrderMaterialMapper.xml

@@ -44,6 +44,77 @@
             AND lo.material_code LIKE concat(concat("%",#{materialCode}),"%")
             AND lo.material_code LIKE concat(concat("%",#{materialCode}),"%")
         </if>
         </if>
 
 
+        UNION ALL
+
+        -- sap库存物料
+        SELECT
+        sap.factory_id AS factoryId,
+        0 AS costCenterId,
+        sap.storage_location_id AS storageLocationId,
+        sap.material_code AS materialCode,
+        sap.material_name AS materialName,
+        sap.unit_price AS unitPrice,
+        sap.quantity AS totalInventoryQuantity,
+        sap.unit AS unit,
+        'sap库存' AS materialSource
+        FROM
+        rq_iot_sap_stock sap
+        WHERE
+        1=1
+        <if test="materialCodes != null and materialCodes.size &gt; 0">
+            AND sap.material_code IN
+            <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="factoryIds != null and factoryIds.size &gt; 0">
+            AND sap.factory_id IN
+            <foreach collection="factoryIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="stockLocationIds != null and stockLocationIds.size &gt; 0">
+            AND sap.storage_location_id IN
+            <foreach collection="stockLocationIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="materialName!=null and materialName!=''">
+            AND sap.material_name LIKE concat(concat("%",#{materialName}),"%")
+        </if>
+        <if test="materialCode!=null and materialCode!=''">
+            AND sap.material_code LIKE concat(concat("%",#{materialCode}),"%")
+        </if>
+
+        UNION ALL
+        -- sap主数据
+        SELECT
+        0 AS factoryId,
+        0 AS costCenterId,
+        0 AS storageLocationId,
+        m.`code` AS materialCode,
+        m.`name` AS materialName,
+        m.unit_price AS unitPrice,
+        0 AS totalInventoryQuantity,
+        m.unit AS unit,
+        'sap主数据' AS materialSource
+        FROM
+        rq_iot_material m
+        WHERE
+        1=1
+        <if test="materialCodes != null and materialCodes.size &gt; 0">
+            AND m.`code` IN
+            <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="materialName!=null and materialName!=''">
+            AND m.`name` LIKE concat(concat("%",#{materialName}),"%")
+        </if>
+        <if test="materialCode!=null and materialCode!=''">
+            AND m.`code` LIKE concat(concat("%",#{materialCode}),"%")
+        </if>
+
         UNION ALL
         UNION ALL
         -- 本地库存物料
         -- 本地库存物料
         SELECT
         SELECT
@@ -86,7 +157,6 @@
         </if>
         </if>
 
 
         UNION ALL
         UNION ALL
-
         -- sap库存物料
         -- sap库存物料
         SELECT
         SELECT
         sap.factory_id AS factoryId,
         sap.factory_id AS factoryId,
@@ -103,7 +173,7 @@
         WHERE
         WHERE
         1=1
         1=1
         <if test="materialCodes != null and materialCodes.size &gt; 0">
         <if test="materialCodes != null and materialCodes.size &gt; 0">
-            AND sap.material_code IN
+            AND sap.material_code NOT IN
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
                 #{key}
                 #{key}
             </foreach>
             </foreach>
@@ -128,46 +198,33 @@
         </if>
         </if>
 
 
         UNION ALL
         UNION ALL
-        -- sap库存物料
+        -- sap主数据
         SELECT
         SELECT
-        sap.factory_id AS factoryId,
+        0 AS factoryId,
         0 AS costCenterId,
         0 AS costCenterId,
-        sap.storage_location_id AS storageLocationId,
-        sap.material_code AS materialCode,
-        sap.material_name AS materialName,
-        sap.unit_price AS unitPrice,
-        sap.quantity AS totalInventoryQuantity,
-        sap.unit AS unit,
-        'sap库存' AS materialSource
+        0 AS storageLocationId,
+        m.`code` AS materialCode,
+        m.`name` AS materialName,
+        m.unit_price AS unitPrice,
+        0 AS totalInventoryQuantity,
+        m.unit AS unit,
+        'sap主数据' AS materialSource
         FROM
         FROM
-        rq_iot_sap_stock sap
+        rq_iot_material m
         WHERE
         WHERE
         1=1
         1=1
         <if test="materialCodes != null and materialCodes.size &gt; 0">
         <if test="materialCodes != null and materialCodes.size &gt; 0">
-            AND sap.material_code NOT IN
+            AND m.`code` NOT IN
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
                 #{key}
                 #{key}
             </foreach>
             </foreach>
         </if>
         </if>
-        <if test="factoryIds != null and factoryIds.size &gt; 0">
-            AND sap.factory_id IN
-            <foreach collection="factoryIds" index="index" item="key" open="(" separator="," close=")">
-                #{key}
-            </foreach>
-        </if>
-        <if test="stockLocationIds != null and stockLocationIds.size &gt; 0">
-            AND sap.storage_location_id IN
-            <foreach collection="stockLocationIds" index="index" item="key" open="(" separator="," close=")">
-                #{key}
-            </foreach>
-        </if>
         <if test="materialName!=null and materialName!=''">
         <if test="materialName!=null and materialName!=''">
-            AND sap.material_name LIKE concat(concat("%",#{materialName}),"%")
+            AND m.`name` LIKE concat(concat("%",#{materialName}),"%")
         </if>
         </if>
         <if test="materialCode!=null and materialCode!=''">
         <if test="materialCode!=null and materialCode!=''">
-            AND sap.material_code LIKE concat(concat("%",#{materialCode}),"%")
+            AND m.`code` LIKE concat(concat("%",#{materialCode}),"%")
         </if>
         </if>
 
 
-
     </select>
     </select>
 </mapper>
 </mapper>