Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

lipenghui 1 kuukausi sitten
vanhempi
commit
251d7021da

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

@@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicematerial/vo/IotDeviceMaterialPageReqVO.java

@@ -9,6 +9,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -49,4 +50,12 @@ public class IotDeviceMaterialPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "设备id 集合", example = "27947,12345")
+    private List<Long> deviceIds;
+
+    @Schema(description = "bom节点id 集合", example = "27947,12345")
+    private List<Long> bomNodeIds;
 }

+ 0 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/IotMaintenanceBomController.java

@@ -122,8 +122,6 @@ public class IotMaintenanceBomController {
         Set<String> pointNames = new HashSet<>();
         // 多个累计类型属性名称集合
         Set<String> multiPointNames = new HashSet<>();
-        // 查询保养计划保养项的上次保养时间 唯一键
-        Set<String> lastMaintenanceDateKey = new HashSet<>();
         // 保养计划中保养项BOM节点id集合
         Set<Long> bomNodeIds = new HashSet<>();
         BOMs.forEach(bom -> {
@@ -133,8 +131,6 @@ public class IotMaintenanceBomController {
             if (StrUtil.isNotBlank(bom.getType())) {
                 pointNames.add(bom.getType());
             }
-            // 设置唯一健 标识 标识保养项的 历史保养工单中最新的上次保养时间
-            // lastMaintenanceDateKey.add(StrUtil.join("-", bom.getDeviceId(), bom.getBomNodeId()));
             bomNodeIds.add(bom.getBomNodeId());
         });
 

+ 56 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbom/IotMainWorkOrderBomController.java

@@ -10,14 +10,18 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
+import cn.iocoder.yudao.module.pms.service.iotdevicematerial.IotDeviceMaterialService;
 import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
+import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderBomService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -31,6 +35,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Stream;
 
@@ -50,6 +55,10 @@ public class IotMainWorkOrderBomController {
     private IotDeviceService iotDeviceService;
     @Resource
     private IotDeviceRunLogService iotDeviceRunLogService;
+    @Resource
+    private IotMainWorkOrderService iotMainWorkOrderService;
+    @Resource
+    private IotDeviceMaterialService iotDeviceMaterialService;
 
     @PostMapping("/create")
     @Operation(summary = "创建PMS 保养计划明细BOM")
@@ -129,16 +138,21 @@ public class IotMainWorkOrderBomController {
         Set<String> pointNames = new HashSet<>();
         // 所有保养工单明细包含的设备id集合
         Set<Long> deviceIds = new HashSet<>();
+        // 保养j明细 保养项BOM节点id集合
+        Set<Long> bomNodeIds = new HashSet<>();
         BOMs.forEach(bom -> {
             if (ObjUtil.isNotEmpty(bom.getDeviceId())) {
                 deviceIds.add(bom.getDeviceId());
             }
+            // 累计运行时长属性名称
             if (StrUtil.isNotBlank(bom.getCode())) {
                 pointNames.add(bom.getCode());
             }
+            // 累计运行公里数属性名称
             if (StrUtil.isNotBlank(bom.getType())) {
                 pointNames.add(bom.getType());
             }
+            bomNodeIds.add(bom.getBomNodeId());
         });
         // 查询 运行记录模板中包含多个累计 时长 公里数 属性的集合
         List<IotDeviceRunLogRespVO> multipleAccumulatedData = new ArrayList<>();
@@ -154,6 +168,40 @@ public class IotMainWorkOrderBomController {
                 tempTotalRunDataPair.put(uniqueKey, data.getTotalRunTime());
             });
         }
+
+        // 查询所有保养项 历史保养记录 (保养项所有历史工单中最新的保养时间)
+        Map<String, LocalDateTime> latestMaintenanceDatePair = new HashMap<>();
+        if (CollUtil.isNotEmpty(deviceIds) && CollUtil.isNotEmpty(bomNodeIds)) {
+            List<IotMainWorkOrderBomDO> latestWorkOrderBomS = iotMainWorkOrderService.historyWorkOrderBoms(deviceIds, bomNodeIds);
+            if (CollUtil.isNotEmpty(latestWorkOrderBomS)) {
+                latestWorkOrderBomS.forEach(bom -> {
+                    String uniqueKey = StrUtil.join("-", bom.getDeviceId(), bom.getBomNodeId());
+                    latestMaintenanceDatePair.put(uniqueKey, bom.getUpdateTime());
+                });
+            }
+        }
+
+        // 查询每个保养项上关联的物料列表
+        IotDeviceMaterialPageReqVO reqVO = new IotDeviceMaterialPageReqVO();
+        reqVO.setDeviceIds(new ArrayList<>(deviceIds));
+        reqVO.setBomNodeIds(new ArrayList<>(bomNodeIds));
+        List<IotDeviceMaterialDO> deviceBomMaterials = iotDeviceMaterialService.deviceBomMaterials(reqVO);
+        Map<String, List<IotDeviceMaterialDO>> deviceBomMaterialPair = new HashMap<>();
+        if (CollUtil.isNotEmpty(deviceBomMaterials)) {
+            deviceBomMaterials.forEach(bomMaterial -> {
+                String uniqueKey = StrUtil.join("-", bomMaterial.getDeviceId(), bomMaterial.getBomNodeId());
+                if (deviceBomMaterialPair.containsKey(uniqueKey)) {
+                    List<IotDeviceMaterialDO> tempBomMaterials = deviceBomMaterialPair.get(uniqueKey);
+                    tempBomMaterials.add(bomMaterial);
+                    deviceBomMaterialPair.put(uniqueKey, tempBomMaterials);
+                } else {
+                    List<IotDeviceMaterialDO> tempBomMaterials = new ArrayList<>();
+                    tempBomMaterials.add(bomMaterial);
+                    deviceBomMaterialPair.put(uniqueKey, tempBomMaterials);
+                }
+            });
+        }
+
         // 2. 转换成 VO
         return BeanUtils.toBean(BOMs, IotMainWorkOrderBomRespVO.class, bomVO -> {
             // 设置设备相关信息
@@ -181,6 +229,14 @@ public class IotMainWorkOrderBomController {
                     bomVO.setTempTotalMileage(tempTotalRunDataPair.get(uniqueKey));
                 }
             }
+            // 设置保养项的上次保养时间
+            String uniqueKey = StrUtil.join("-", bomVO.getDeviceId(), bomVO.getBomNodeId());
+            if (latestMaintenanceDatePair.containsKey(uniqueKey)) {
+                bomVO.setLastMaintenanceDate(latestMaintenanceDatePair.get(uniqueKey));
+            }
+            if (deviceBomMaterialPair.containsKey(uniqueKey)) {
+                bomVO.setDeviceBomMaterials(deviceBomMaterialPair.get(uniqueKey));
+            }
         });
     }
 }

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbom/vo/IotMainWorkOrderBomRespVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo;
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -7,6 +8,7 @@ import lombok.Data;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Schema(description = "管理后台 - PMS 保养计划明细BOM Response VO")
 @Data
@@ -193,4 +195,10 @@ public class IotMainWorkOrderBomRespVO {
     private BigDecimal tempTotalRunTime;
     @Schema(description = "临时 累计运行公里数 用于运行记录模板中包含多个累计类型属性的场景", example = "20238km")
     private BigDecimal tempTotalMileage;
+
+    @Schema(description = "上次保养时间")
+    private LocalDateTime lastMaintenanceDate;
+
+    @Schema(description = "保养项关联的设备bom物料列表")
+    private List<IotDeviceMaterialDO> deviceBomMaterials;
 }

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicematerial/IotDeviceMaterialMapper.java

@@ -58,8 +58,10 @@ public interface IotDeviceMaterialMapper extends BaseMapperX<IotDeviceMaterialDO
         return selectList(new LambdaQueryWrapperX<IotDeviceMaterialDO>()
                 .eqIfPresent(IotDeviceMaterialDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
                 .eqIfPresent(IotDeviceMaterialDO::getDeviceId, reqVO.getDeviceId())
+                .inIfPresent(IotDeviceMaterialDO::getDeviceId, reqVO.getDeviceIds())
                 .likeIfPresent(IotDeviceMaterialDO::getName, reqVO.getName())
                 .eqIfPresent(IotDeviceMaterialDO::getBomNodeId, reqVO.getBomNodeId())
+                .inIfPresent(IotDeviceMaterialDO::getBomNodeId, reqVO.getBomNodeIds())
                 .eqIfPresent(IotDeviceMaterialDO::getCode, reqVO.getCode())
                 .eqIfPresent(IotDeviceMaterialDO::getMaterialId, reqVO.getMaterialId())
                 .eqIfPresent(IotDeviceMaterialDO::getQuantity, reqVO.getQuantity())

+ 14 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/sap/service/IotSapServiceImpl.java

@@ -526,7 +526,7 @@ public class IotSapServiceImpl implements IotSapService {
             factoryIdPair.put(factory.getFactoryCode(), factory.getId());
             factoryNamePair.put(factory.getFactoryCode(), factory.getFactoryName());
         });
-        // 库存地点集合
+        // pms已经维护的 库存地点 集合
         storageLocations.forEach(location -> {
             System.out.println("当前库存地点信息:" + location.getFactoryCode() + " - " + location.getStorageLocationCode());
             String uniqueKey = StrUtil.join("-", location.getFactoryCode(), location.getStorageLocationCode());
@@ -537,6 +537,19 @@ public class IotSapServiceImpl implements IotSapService {
             // stockLocationNamePair.put(location.getStorageLocationCode(), location.getStorageLocationName());
             stockLocationNamePair.put(uniqueKey, location.getStorageLocationName());
         });
+        // 筛选出pms系统中未维护的 库存地点 信息(工厂-库存地点编码)
+        Set<String> notExistStorageLocations = new HashSet<>();
+        sapStocks.forEach(stock -> {
+            String uniqueKey = StrUtil.join("-", stock.getWERKS(), stock.getLGORT());
+            if (!storageLocationIdPair.containsKey(uniqueKey)) {
+                notExistStorageLocations.add(uniqueKey);
+            }
+        });
+        if (CollUtil.isNotEmpty(notExistStorageLocations)) {
+            notExistStorageLocations.forEach(location -> {
+                System.out.println("系统中未维护的 工厂编码 - 库存地点编码:" + location);
+            });
+        }
         // 查询所有部门
         List<DeptRespDTO> depts = TenantUtils.execute(1L, () -> deptApi.getDeptList());
         // 筛选出所有设置了 库存地点 的部门

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

@@ -1,7 +1,6 @@
 package cn.iocoder.yudao.module.pms.service.iotdevicematerial;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
@@ -70,6 +69,14 @@ public interface IotDeviceMaterialService {
      */
     List<IotDeviceMaterialDO> getIotDeviceMaterials(IotDeviceMaterialSaveReqVO saveReqVO);
 
+    /**
+     * 获得PMS 设备BOM挂载物料关联列表
+     *
+     * @param reqVO 列表查询
+     * @return PMS 设备BOM挂载物料关联列表
+     */
+    List<IotDeviceMaterialDO> deviceBomMaterials(IotDeviceMaterialPageReqVO reqVO);
+
     /**
      * 删除设备BOM关联的物料
      *

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

@@ -5,10 +5,8 @@ import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicematerial.IotDeviceMaterialMapper;
@@ -25,7 +23,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_COMMON_BOM_MATERIAL_NOT_EXISTS;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_MATERIAL_NOT_EXISTS;
 
 
@@ -99,6 +96,11 @@ public class IotDeviceMaterialServiceImpl implements IotDeviceMaterialService {
         return iotDeviceMaterialMapper.selectList(saveReqVO);
     }
 
+    @Override
+    public List<IotDeviceMaterialDO> deviceBomMaterials(IotDeviceMaterialPageReqVO reqVO) {
+        return iotDeviceMaterialMapper.selectList(reqVO);
+    }
+
     @Override
     public void deleteDeviceMaterial(Long bomNodeId, String code) {
         if (ObjUtil.isEmpty(bomNodeId) || StrUtil.isBlank(code)) {