lipenghui hai 3 meses
pai
achega
929b4235aa
Modificáronse 20 ficheiros con 1014 adicións e 51 borrados
  1. 3 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 12 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java
  3. 34 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/bom/vo/IotMaintainBomPageReqVO.java
  4. 39 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/bom/vo/IotMaintainBomRespVO.java
  5. 32 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/bom/vo/IotMaintainBomSaveReqVO.java
  6. 97 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/IotMaintainMaterialsController.java
  7. 68 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/vo/IotMaintainMaterialsPageReqVO.java
  8. 86 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/vo/IotMaintainMaterialsRespVO.java
  9. 65 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/vo/IotMaintainMaterialsSaveReqVO.java
  10. 4 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainRespVO.java
  11. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainSaveVO.java
  12. 47 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainBomDO.java
  13. 96 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainMaterialsDO.java
  14. 30 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintain/IotMaintainBomMapper.java
  15. 41 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintain/IotMaintainMaterialsMapper.java
  16. 57 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainBomService.java
  17. 79 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainBomServiceImpl.java
  18. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainMaterialsService.java
  19. 75 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainMaterialsServiceImpl.java
  20. 91 47
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java

+ 3 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -50,4 +50,7 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_MAIN_WORK_ORDER_NOT_EXISTS = new ErrorCode(141,"保养工单不存在");
     ErrorCode IOT_DEVICE_RUN_LOG_NOT_EXISTS = new ErrorCode(142, "设备运行数据记录 中间表不存在");
     ErrorCode DEVICE_NOT_EXISTS = new ErrorCode(143, "延凡设备不存在");
+    ErrorCode IOT_MAINTAIN_MATERIALS_NOT_EXISTS = new ErrorCode(144, "维修工单对应物料不存在");
+    ErrorCode IOT_MAINTAIN_BOM_NOT_EXISTS = new ErrorCode(145, "维修工单对应维修项BOM不存在");
+
 }

+ 12 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java

@@ -4,8 +4,12 @@ import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageR
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
+import cn.iocoder.yudao.module.pms.service.IotDeviceService;
+import cn.iocoder.yudao.module.pms.service.maintain.IotMaintainBomService;
 import cn.iocoder.yudao.module.pms.service.maintain.IotMaintainService;
 import cn.iocoder.yudao.module.pms.service.maintain.material.IotMaintainMaterialService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +49,10 @@ public class IotMaintainController {
     private IotMaintainService iotMaintainService;
     @Autowired
     private IotMaintainMaterialService iotMaintainMaterialService;
+    @Autowired
+    private IotMaintainBomService iotMaintainBomService;
+    @Autowired
+    private IotDeviceService iotDeviceService;
 
     @PostMapping("/create")
     @Operation(summary = "创建维修工单")
@@ -76,9 +84,11 @@ public class IotMaintainController {
     @PreAuthorize("@ss.hasPermission('rq:iot-maintain:query')")
     public CommonResult<IotMaintainRespVO> getIotMaintain(@RequestParam("id") Long id) {
         IotMaintainDO iotMaintain = iotMaintainService.getIotMaintain(id);
+        IotDeviceDO iotDevice = iotDeviceService.getIotDevice(iotMaintain.getDeviceId());
         IotMaintainRespVO bean = BeanUtils.toBean(iotMaintain, IotMaintainRespVO.class);
-        List<IotMaintainMaterialDO> listByMaintainId = iotMaintainMaterialService.getListByMaintainId(id);
-        bean.setMaintainMaterialDOS(listByMaintainId);
+        List<IotMaintainBomDO> listByMaintainId = iotMaintainBomService.getListByMaintainId(id);
+        bean.setMaintainBomDOS(listByMaintainId);
+        bean.setDeviceCode(iotDevice.getDeviceCode());
         return success(bean);
     }
 

+ 34 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/bom/vo/IotMaintainBomPageReqVO.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 维修工单对应维修项BOM分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotMaintainBomPageReqVO extends PageParam {
+
+    @Schema(description = "维修工单id", example = "16140")
+    private Long maintainId;
+
+    @Schema(description = "保养工单明细设备BOM节点id", example = "28516")
+    private Long bomNodeId;
+
+    @Schema(description = "维修项名称", example = "王五")
+    private String name;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 39 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/bom/vo/IotMaintainBomRespVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 维修工单对应维修项BOM Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotMaintainBomRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "19495")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "维修工单id", requiredMode = Schema.RequiredMode.REQUIRED, example = "16140")
+    @ExcelProperty("维修工单id")
+    private Long maintainId;
+
+    @Schema(description = "保养工单明细设备BOM节点id", example = "28516")
+    @ExcelProperty("保养工单明细设备BOM节点id")
+    private Long bomNodeId;
+
+    @Schema(description = "维修项名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @ExcelProperty("维修项名称")
+    private String name;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 32 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/bom/vo/IotMaintainBomSaveReqVO.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsSaveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 维修工单对应维修项BOM新增/修改 Request VO")
+@Data
+public class IotMaintainBomSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "19495")
+    private Long id;
+
+    @Schema(description = "维修工单id", requiredMode = Schema.RequiredMode.REQUIRED, example = "16140")
+    @NotNull(message = "维修工单id不能为空")
+    private Long maintainId;
+
+    @Schema(description = "保养工单明细设备BOM节点id", example = "28516")
+    private Long bomNodeId;
+
+    @Schema(description = "维修项名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @NotEmpty(message = "维修项名称不能为空")
+    private String name;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    private List<IotMaintainMaterialsSaveReqVO> materials;
+
+}

+ 97 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/IotMaintainMaterialsController.java

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.materials;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainMaterialsDO;
+import cn.iocoder.yudao.module.pms.service.maintain.IotMaintainMaterialsService;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+
+@Tag(name = "管理后台 - 维修工单对应物料")
+@RestController
+@RequestMapping("/rq/iot-maintain-materials")
+@Validated
+public class IotMaintainMaterialsController {
+
+    @Resource
+    private IotMaintainMaterialsService iotMaintainMaterialsService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建维修工单对应物料")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintain-materials:create')")
+    public CommonResult<Long> createIotMaintainMaterials(@Valid @RequestBody IotMaintainMaterialsSaveReqVO createReqVO) {
+        return success(iotMaintainMaterialsService.createIotMaintainMaterials(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新维修工单对应物料")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintain-materials:update')")
+    public CommonResult<Boolean> updateIotMaintainMaterials(@Valid @RequestBody IotMaintainMaterialsSaveReqVO updateReqVO) {
+        iotMaintainMaterialsService.updateIotMaintainMaterials(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除维修工单对应物料")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintain-materials:delete')")
+    public CommonResult<Boolean> deleteIotMaintainMaterials(@RequestParam("id") Long id) {
+        iotMaintainMaterialsService.deleteIotMaintainMaterials(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得维修工单对应物料")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintain-materials:query')")
+    public CommonResult<IotMaintainMaterialsRespVO> getIotMaintainMaterials(@RequestParam("id") Long id) {
+        IotMaintainMaterialsDO iotMaintainMaterials = iotMaintainMaterialsService.getIotMaintainMaterials(id);
+        return success(BeanUtils.toBean(iotMaintainMaterials, IotMaintainMaterialsRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得维修工单对应物料分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintain-materials:query')")
+    public CommonResult<PageResult<IotMaintainMaterialsRespVO>> getIotMaintainMaterialsPage(@Valid IotMaintainMaterialsPageReqVO pageReqVO) {
+        PageResult<IotMaintainMaterialsDO> pageResult = iotMaintainMaterialsService.getIotMaintainMaterialsPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotMaintainMaterialsRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出维修工单对应物料 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintain-materials:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotMaintainMaterialsExcel(@Valid IotMaintainMaterialsPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotMaintainMaterialsDO> list = iotMaintainMaterialsService.getIotMaintainMaterialsPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "维修工单对应物料.xls", "数据", IotMaintainMaterialsRespVO.class,
+                        BeanUtils.toBean(list, IotMaintainMaterialsRespVO.class));
+    }
+
+}

+ 68 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/vo/IotMaintainMaterialsPageReqVO.java

@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 维修工单对应物料分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotMaintainMaterialsPageReqVO extends PageParam {
+
+    @Schema(description = "维修工单id", example = "2757")
+    private Long maintainId;
+
+    @Schema(description = "维修项id", example = "10896")
+    private Long bomId;
+
+    @Schema(description = "保养工单明细设备BOM节点id", example = "6271")
+    private Long bomNodeId;
+
+    @Schema(description = "物料id", example = "25104")
+    private Long materialId;
+
+    @Schema(description = "物料编码")
+    private String materialCode;
+
+    @Schema(description = "物料名称", example = "芋艿")
+    private String materialName;
+
+    @Schema(description = "消耗数量")
+    private BigDecimal quantity;
+
+    @Schema(description = "单价(元)", example = "1603")
+    private BigDecimal unitPrice;
+
+    @Schema(description = "总金额(元)", example = "1015")
+    private BigDecimal totalPrice;
+
+    @Schema(description = "总数量")
+    private BigDecimal totalInventoryQuantity;
+
+    @Schema(description = "物料来源 (SAP库存 本地库存...)")
+    private String materialSource;
+
+    @Schema(description = "库存地点")
+    private String inventoryAddress;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 86 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/vo/IotMaintainMaterialsRespVO.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 维修工单对应物料 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotMaintainMaterialsRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9612")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "维修工单id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2757")
+    @ExcelProperty("维修工单id")
+    private Long maintainId;
+
+    @Schema(description = "维修项id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10896")
+    @ExcelProperty("维修项id")
+    private Long bomId;
+
+    @Schema(description = "保养工单明细设备BOM节点id", example = "6271")
+    @ExcelProperty("保养工单明细设备BOM节点id")
+    private Long bomNodeId;
+
+    @Schema(description = "物料id", example = "25104")
+    @ExcelProperty("物料id")
+    private Long materialId;
+
+    @Schema(description = "物料编码")
+    @ExcelProperty("物料编码")
+    private String materialCode;
+
+    @Schema(description = "物料名称", example = "芋艿")
+    @ExcelProperty("物料名称")
+    private String materialName;
+
+    @Schema(description = "消耗数量")
+    @ExcelProperty("消耗数量")
+    private BigDecimal quantity;
+
+    @Schema(description = "单价(元)", example = "1603")
+    @ExcelProperty("单价(元)")
+    private BigDecimal unitPrice;
+    @Schema(description = "单位")
+    private String unit;
+
+    @Schema(description = "总金额(元)", example = "1015")
+    @ExcelProperty("总金额(元)")
+    private BigDecimal totalPrice;
+
+    @Schema(description = "总数量")
+    @ExcelProperty("总数量")
+    private BigDecimal totalInventoryQuantity;
+
+    @Schema(description = "物料来源 (SAP库存 本地库存...)")
+    @ExcelProperty("物料来源 (SAP库存 本地库存...)")
+    private String materialSource;
+
+    @Schema(description = "库存地点")
+    @ExcelProperty("库存地点")
+    private String inventoryAddress;
+
+    @Schema(description = "排序")
+    @ExcelProperty("排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    @ExcelProperty("状态 0启用  1停用")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 65 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/materials/vo/IotMaintainMaterialsSaveReqVO.java

@@ -0,0 +1,65 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 维修工单对应物料新增/修改 Request VO")
+@Data
+public class IotMaintainMaterialsSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9612")
+    private Long id;
+
+    @Schema(description = "维修工单id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2757")
+    @NotNull(message = "维修工单id不能为空")
+    private Long maintainId;
+
+    @Schema(description = "维修项id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10896")
+    @NotNull(message = "维修项id不能为空")
+    private Long bomId;
+
+    @Schema(description = "保养工单明细设备BOM节点id", example = "6271")
+    private Long bomNodeId;
+
+    @Schema(description = "物料id", example = "25104")
+    private Long materialId;
+
+    @Schema(description = "物料编码")
+    private String materialCode;
+
+    @Schema(description = "物料名称", example = "芋艿")
+    private String materialName;
+
+    @Schema(description = "消耗数量")
+    private BigDecimal quantity;
+
+    @Schema(description = "单价(元)", example = "1603")
+    private BigDecimal unitPrice;
+
+    @Schema(description = "总金额(元)", example = "1015")
+    private BigDecimal totalPrice;
+
+    @Schema(description = "总数量")
+    private BigDecimal totalInventoryQuantity;
+
+    @Schema(description = "物料来源 (SAP库存 本地库存...)")
+    private String materialSource;
+
+    @Schema(description = "库存地点")
+    private String inventoryAddress;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "单位")
+    private String unit;
+}

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainRespVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.maintain.vo;
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -102,7 +103,7 @@ public class IotMaintainRespVO {
     @Schema(description = "维修负责人")
     private Long maintainPerson;
     @Schema(description = "工单物料")
-    private List<IotMaintainMaterialDO> maintainMaterialDOS;
+    private List<IotMaintainBomDO> maintainBomDOS;
     private String type;
     /**
      * 维修费用
@@ -116,4 +117,6 @@ public class IotMaintainRespVO {
      * 委外附件
      */
     private String outFile;
+
+    private String deviceCode;
 }

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainSaveVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.maintain.vo;
 
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.material.vo.IotMaintainMaterialSaveReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -12,6 +13,6 @@ public class IotMaintainSaveVO {
     @Schema(description = "维修工单")
     private IotMaintainSaveReqVO maintain;
     @Schema(description = "工单物料")
-    private List<IotMaintainMaterialSaveReqVO> maintainMaterials;
+    private List<IotMaintainBomSaveReqVO> maintainMaterials;
 
 }

+ 47 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainBomDO.java

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.maintain;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 维修工单对应维修项BOM DO
+ *
+ * @author 李鹏辉
+ */
+@TableName("rq_iot_maintain_bom")
+@KeySequence("rq_iot_maintain_bom_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotMaintainBomDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 维修工单id
+     */
+    private Long maintainId;
+    /**
+     * 保养工单明细设备BOM节点id
+     */
+    private Long bomNodeId;
+    /**
+     * 维修项名称
+     */
+    private String name;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 96 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainMaterialsDO.java

@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.maintain;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 维修工单对应物料 DO
+ *
+ * @author 李鹏辉
+ */
+@TableName("rq_iot_maintain_materials")
+@KeySequence("rq_iot_maintain_materials_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotMaintainMaterialsDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 维修工单id
+     */
+    private Long maintainId;
+    /**
+     * 维修项id
+     */
+    private Long bomId;
+    /**
+     * 保养工单明细设备BOM节点id
+     */
+    private Long bomNodeId;
+    /**
+     * 物料id
+     */
+    private Long materialId;
+    /**
+     * 物料编码
+     */
+    private String materialCode;
+    /**
+     * 物料名称
+     */
+    private String materialName;
+    /**
+     * 消耗数量
+     */
+    private BigDecimal quantity;
+    /**
+     * 单价(元)
+     */
+    private BigDecimal unitPrice;
+    /**
+     * 总金额(元)
+     */
+    private BigDecimal totalPrice;
+    /**
+     * 总数量
+     */
+    private BigDecimal totalInventoryQuantity;
+    /**
+     * 物料来源 (SAP库存 本地库存...)
+     */
+    private String materialSource;
+    /**
+     * 库存地点
+     */
+    private String inventoryAddress;
+    private String unit;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 状态 0启用  1停用
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 30 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintain/IotMaintainBomMapper.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.maintain;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 维修工单对应维修项BOM Mapper
+ *
+ * @author 李鹏辉
+ */
+@Mapper
+public interface IotMaintainBomMapper extends BaseMapperX<IotMaintainBomDO> {
+
+    default PageResult<IotMaintainBomDO> selectPage(IotMaintainBomPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotMaintainBomDO>()
+                .eqIfPresent(IotMaintainBomDO::getMaintainId, reqVO.getMaintainId())
+                .eqIfPresent(IotMaintainBomDO::getBomNodeId, reqVO.getBomNodeId())
+                .likeIfPresent(IotMaintainBomDO::getName, reqVO.getName())
+                .eqIfPresent(IotMaintainBomDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotMaintainBomDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotMaintainBomDO::getId));
+    }
+
+}

+ 41 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintain/IotMaintainMaterialsMapper.java

@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.maintain;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainMaterialsDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 维修工单对应物料 Mapper
+ *
+ * @author 李鹏辉
+ */
+@Mapper
+public interface IotMaintainMaterialsMapper extends BaseMapperX<IotMaintainMaterialsDO> {
+
+    default PageResult<IotMaintainMaterialsDO> selectPage(IotMaintainMaterialsPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotMaintainMaterialsDO>()
+                .eqIfPresent(IotMaintainMaterialsDO::getMaintainId, reqVO.getMaintainId())
+                .eqIfPresent(IotMaintainMaterialsDO::getBomId, reqVO.getBomId())
+                .eqIfPresent(IotMaintainMaterialsDO::getBomNodeId, reqVO.getBomNodeId())
+                .eqIfPresent(IotMaintainMaterialsDO::getMaterialId, reqVO.getMaterialId())
+                .eqIfPresent(IotMaintainMaterialsDO::getMaterialCode, reqVO.getMaterialCode())
+                .likeIfPresent(IotMaintainMaterialsDO::getMaterialName, reqVO.getMaterialName())
+                .eqIfPresent(IotMaintainMaterialsDO::getQuantity, reqVO.getQuantity())
+                .eqIfPresent(IotMaintainMaterialsDO::getUnitPrice, reqVO.getUnitPrice())
+                .eqIfPresent(IotMaintainMaterialsDO::getTotalPrice, reqVO.getTotalPrice())
+                .eqIfPresent(IotMaintainMaterialsDO::getTotalInventoryQuantity, reqVO.getTotalInventoryQuantity())
+                .eqIfPresent(IotMaintainMaterialsDO::getMaterialSource, reqVO.getMaterialSource())
+                .eqIfPresent(IotMaintainMaterialsDO::getInventoryAddress, reqVO.getInventoryAddress())
+                .eqIfPresent(IotMaintainMaterialsDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotMaintainMaterialsDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotMaintainMaterialsDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotMaintainMaterialsDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotMaintainMaterialsDO::getId));
+    }
+
+}

+ 57 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainBomService.java

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.pms.service.maintain;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
+
+/**
+ * 维修工单对应维修项BOM Service 接口
+ *
+ * @author 李鹏辉
+ */
+public interface IotMaintainBomService {
+    List<IotMaintainBomDO> getListByMaintainId(Long maintainId);
+    /**
+     * 创建维修工单对应维修项BOM
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotMaintainBom(@Valid IotMaintainBomSaveReqVO createReqVO);
+
+    /**
+     * 更新维修工单对应维修项BOM
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotMaintainBom(@Valid IotMaintainBomSaveReqVO updateReqVO);
+
+    /**
+     * 删除维修工单对应维修项BOM
+     *
+     * @param id 编号
+     */
+    void deleteIotMaintainBom(Long id);
+
+    /**
+     * 获得维修工单对应维修项BOM
+     *
+     * @param id 编号
+     * @return 维修工单对应维修项BOM
+     */
+    IotMaintainBomDO getIotMaintainBom(Long id);
+
+    /**
+     * 获得维修工单对应维修项BOM分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 维修工单对应维修项BOM分页
+     */
+    PageResult<IotMaintainBomDO> getIotMaintainBomPage(IotMaintainBomPageReqVO pageReqVO);
+
+}

+ 79 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainBomServiceImpl.java

@@ -0,0 +1,79 @@
+package cn.iocoder.yudao.module.pms.service.maintain;
+
+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.maintain.bom.vo.IotMaintainBomPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainBomMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import java.util.Collections;
+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_MAINTAIN_BOM_NOT_EXISTS;
+
+/**
+ * 维修工单对应维修项BOM Service 实现类
+ *
+ * @author 李鹏辉
+ */
+@Service
+@Validated
+public class IotMaintainBomServiceImpl implements IotMaintainBomService {
+
+    @Resource
+    private IotMaintainBomMapper iotMaintainBomMapper;
+
+    @Override
+    public List<IotMaintainBomDO> getListByMaintainId(Long maintainId) {
+        return iotMaintainBomMapper.selectList("maintain_id", maintainId);
+    }
+
+    @Override
+    public Long createIotMaintainBom(IotMaintainBomSaveReqVO createReqVO) {
+        // 插入
+        IotMaintainBomDO iotMaintainBom = BeanUtils.toBean(createReqVO, IotMaintainBomDO.class);
+        iotMaintainBomMapper.insert(iotMaintainBom);
+        // 返回
+        return iotMaintainBom.getId();
+    }
+
+    @Override
+    public void updateIotMaintainBom(IotMaintainBomSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotMaintainBomExists(updateReqVO.getId());
+        // 更新
+        IotMaintainBomDO updateObj = BeanUtils.toBean(updateReqVO, IotMaintainBomDO.class);
+        iotMaintainBomMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotMaintainBom(Long id) {
+        // 校验存在
+        validateIotMaintainBomExists(id);
+        // 删除
+        iotMaintainBomMapper.deleteById(id);
+    }
+
+    private void validateIotMaintainBomExists(Long id) {
+        if (iotMaintainBomMapper.selectById(id) == null) {
+            throw exception(IOT_MAINTAIN_BOM_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotMaintainBomDO getIotMaintainBom(Long id) {
+        return iotMaintainBomMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotMaintainBomDO> getIotMaintainBomPage(IotMaintainBomPageReqVO pageReqVO) {
+        return iotMaintainBomMapper.selectPage(pageReqVO);
+    }
+
+}

+ 56 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainMaterialsService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.pms.service.maintain;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainMaterialsDO;
+
+/**
+ * 维修工单对应物料 Service 接口
+ *
+ * @author 李鹏辉
+ */
+public interface IotMaintainMaterialsService {
+
+    /**
+     * 创建维修工单对应物料
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotMaintainMaterials(@Valid IotMaintainMaterialsSaveReqVO createReqVO);
+
+    /**
+     * 更新维修工单对应物料
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotMaintainMaterials(@Valid IotMaintainMaterialsSaveReqVO updateReqVO);
+
+    /**
+     * 删除维修工单对应物料
+     *
+     * @param id 编号
+     */
+    void deleteIotMaintainMaterials(Long id);
+
+    /**
+     * 获得维修工单对应物料
+     *
+     * @param id 编号
+     * @return 维修工单对应物料
+     */
+    IotMaintainMaterialsDO getIotMaintainMaterials(Long id);
+
+    /**
+     * 获得维修工单对应物料分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 维修工单对应物料分页
+     */
+    PageResult<IotMaintainMaterialsDO> getIotMaintainMaterialsPage(IotMaintainMaterialsPageReqVO pageReqVO);
+
+}

+ 75 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainMaterialsServiceImpl.java

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.pms.service.maintain;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainMaterialsDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMaterialsMapper;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTAIN_MATERIALS_NOT_EXISTS;
+
+/**
+ * 维修工单对应物料 Service 实现类
+ *
+ * @author 李鹏辉
+ */
+@Service
+@Validated
+public class IotMaintainMaterialsServiceImpl implements IotMaintainMaterialsService {
+
+    @Resource
+    private IotMaintainMaterialsMapper iotMaintainMaterialsMapper;
+
+    @Override
+    public Long createIotMaintainMaterials(IotMaintainMaterialsSaveReqVO createReqVO) {
+        // 插入
+        IotMaintainMaterialsDO iotMaintainMaterials = BeanUtils.toBean(createReqVO, IotMaintainMaterialsDO.class);
+        iotMaintainMaterialsMapper.insert(iotMaintainMaterials);
+        // 返回
+        return iotMaintainMaterials.getId();
+    }
+
+    @Override
+    public void updateIotMaintainMaterials(IotMaintainMaterialsSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotMaintainMaterialsExists(updateReqVO.getId());
+        // 更新
+        IotMaintainMaterialsDO updateObj = BeanUtils.toBean(updateReqVO, IotMaintainMaterialsDO.class);
+        iotMaintainMaterialsMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotMaintainMaterials(Long id) {
+        // 校验存在
+        validateIotMaintainMaterialsExists(id);
+        // 删除
+        iotMaintainMaterialsMapper.deleteById(id);
+    }
+
+    private void validateIotMaintainMaterialsExists(Long id) {
+        if (iotMaintainMaterialsMapper.selectById(id) == null) {
+            throw exception(IOT_MAINTAIN_MATERIALS_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotMaintainMaterialsDO getIotMaintainMaterials(Long id) {
+        return iotMaintainMaterialsMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotMaintainMaterialsDO> getIotMaintainMaterialsPage(IotMaintainMaterialsPageReqVO pageReqVO) {
+        return iotMaintainMaterialsMapper.selectPage(pageReqVO);
+    }
+
+}

+ 91 - 47
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java

@@ -9,7 +9,9 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.material.vo.IotMaintainMaterialSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.materials.vo.IotMaintainMaterialsSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveVO;
@@ -17,12 +19,16 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotoutbound.IotOutboundDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainMaterialsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.failure.IotFailureReportMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotoutbound.IotOutboundMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainBomMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMaterialsMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.material.IotMaintainMaterialMapper;
 import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@@ -80,6 +86,10 @@ public class IotMaintainServiceImpl implements IotMaintainService {
     private NotifyMessageSendApi notifyMessageSendApi;
     @Resource
     private BpmProcessInstanceApi processInstanceApi;
+    @Autowired
+    private IotMaintainBomMapper iotMaintainBomMapper;
+    @Autowired
+    private IotMaintainMaterialsMapper iotMaintainMaterialsMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -98,15 +108,31 @@ public class IotMaintainServiceImpl implements IotMaintainService {
         iotMaintain.setFailureName(createReqVO.getMaintain().getDeviceName()+DateUtil.format(new Date(), "yyyyMMddHHmmss"));
         iotMaintain.setDeleted(false);
         iotMaintainMapper.insert(iotMaintain);
+        //插入工单bom
+        List<IotMaintainBomSaveReqVO> maintainMaterials = createReqVO.getMaintainMaterials();
+        if (CollUtil.isEmpty(maintainMaterials)) {
+            throw new ServiceException(IOT_MAINTAIN_NOT_EXISTS);
+        }
         //插入工单物料
-        List<IotMaintainMaterialSaveReqVO> maintainMaterials = createReqVO.getMaintainMaterials();
-        List<IotMaintainMaterialDO> collect = maintainMaterials.stream().map(e -> {
-            IotMaintainMaterialDO bean = BeanUtils.toBean(e, IotMaintainMaterialDO.class);
-            bean.setMaintainId(iotMaintain.getId());
-            bean.setDeleted(false);
-            return bean;
-        }).collect(Collectors.toList());
-        iotMaintainMaterialMapper.insertBatch(collect);
+        for (IotMaintainBomSaveReqVO maintainMaterial : maintainMaterials) {
+            IotMaintainBomDO iotMaintainBomDO = new IotMaintainBomDO();
+            iotMaintainBomDO.setBomNodeId(maintainMaterial.getBomNodeId());
+            iotMaintainBomDO.setMaintainId(iotMaintain.getId());
+            iotMaintainBomDO.setName(maintainMaterial.getName());
+            iotMaintainBomDO.setDeleted(false);
+            iotMaintainBomMapper.insert(iotMaintainBomDO);
+            List<IotMaintainMaterialsDO> iotMaintainMaterialsDOS = new ArrayList<>();
+            maintainMaterial.getMaterials().forEach(e ->{
+                IotMaintainMaterialsDO iotMaintainMaterialsDO = new IotMaintainMaterialsDO();
+                BeanUtils.copyProperties(e, iotMaintainMaterialsDO);
+                iotMaintainMaterialsDO.setDeleted(false);
+                iotMaintainMaterialsDO.setMaintainId(iotMaintain.getId());
+                iotMaintainMaterialsDO.setBomId(iotMaintainBomDO.getId());
+                iotMaintainMaterialsDOS.add(iotMaintainMaterialsDO);
+            });
+            iotMaintainMaterialsMapper.insertBatch(iotMaintainMaterialsDOS);
+        }
+
         //本地库存减少且记录出库
         localStockAndOut(createReqVO);
         if ("in".equals(createReqVO.getMaintain().getType())) {
@@ -130,18 +156,34 @@ public class IotMaintainServiceImpl implements IotMaintainService {
         // 更新
         IotMaintainDO updateObj = BeanUtils.toBean(updateReqVO.getMaintain(), IotMaintainDO.class);
         iotMaintainMapper.updateById(updateObj);
-
-        List<IotMaintainMaterialSaveReqVO> maintainMaterials = updateReqVO.getMaintainMaterials();
-        //删除工单物料
-        iotMaintainMaterialMapper.deleteByMap(ImmutableMap.of("maintain_id", updateObj.getId()));
+        //删除工单bom及物料
+        iotMaintainBomMapper.delete("maintain_id", String.valueOf(updateObj.getId()));
+        iotMaintainMaterialsMapper.delete("maintain_id", String.valueOf(updateObj.getId()));
+        //插入工单bom
+        List<IotMaintainBomSaveReqVO> maintainMaterials = updateReqVO.getMaintainMaterials();
+        if (CollUtil.isEmpty(maintainMaterials)) {
+            throw new ServiceException(IOT_MAINTAIN_NOT_EXISTS);
+        }
         //插入工单物料
-        List<IotMaintainMaterialDO> collect = maintainMaterials.stream().map(e -> {
-            IotMaintainMaterialDO bean = BeanUtils.toBean(e, IotMaintainMaterialDO.class);
-            bean.setMaintainId(updateObj.getId());
-            bean.setDeleted(false);
-            return bean;
-        }).collect(Collectors.toList());
-        iotMaintainMaterialMapper.insertBatch(collect);
+        for (IotMaintainBomSaveReqVO maintainMaterial : maintainMaterials) {
+            IotMaintainBomDO iotMaintainBomDO = new IotMaintainBomDO();
+            iotMaintainBomDO.setBomNodeId(maintainMaterial.getBomNodeId());
+            iotMaintainBomDO.setMaintainId(updateObj.getId());
+            iotMaintainBomDO.setName(maintainMaterial.getName());
+            iotMaintainBomDO.setDeleted(false);
+            iotMaintainBomMapper.insert(iotMaintainBomDO);
+            List<IotMaintainMaterialsDO> iotMaintainMaterialsDOS = new ArrayList<>();
+            maintainMaterial.getMaterials().forEach(e ->{
+                IotMaintainMaterialsDO iotMaintainMaterialsDO = new IotMaintainMaterialsDO();
+                BeanUtils.copyProperties(e, iotMaintainMaterialsDO);
+                iotMaintainMaterialsDO.setDeleted(false);
+                iotMaintainMaterialsDO.setMaintainId(updateObj.getId());
+                iotMaintainMaterialsDO.setBomId(iotMaintainBomDO.getId());
+                iotMaintainMaterialsDOS.add(iotMaintainMaterialsDO);
+            });
+            iotMaintainMaterialsMapper.insertBatch(iotMaintainMaterialsDOS);
+        }
+
         //本地库存减少且记录出库
         localStockAndOut(updateReqVO);
         if ("in".equals(updateReqVO.getMaintain().getType())) {
@@ -158,38 +200,40 @@ public class IotMaintainServiceImpl implements IotMaintainService {
      * @param maintainSaveVO 维修工单信息
      */
     private void localStockAndOut(IotMaintainSaveVO maintainSaveVO) {
-        List<IotMaintainMaterialSaveReqVO> maintainMaterials = maintainSaveVO.getMaintainMaterials();
+        List<IotMaintainBomSaveReqVO> maintainMaterials = maintainSaveVO.getMaintainMaterials();
         //判断物料不为空
         if (CollUtil.isNotEmpty(maintainMaterials)) {
-            maintainMaterials.forEach(e ->{
-                String code = e.getCode();
-                //减去本地库存
-                if ("本地库存".equals(e.getSourceType())){
-                    List<IotLockStockDO> stockDOS = iotLockStockMapper.selectByMap(ImmutableMap.of("material_code", code, "dept_id", maintainSaveVO.getMaintain().getDeptId()));
-                    if (CollUtil.isNotEmpty(stockDOS)) {
-                        IotLockStockDO iotLockStockDO = stockDOS.get(0);
-                        BigDecimal quantity = iotLockStockDO.getQuantity();
-                        BigDecimal subtract = quantity.subtract(e.getDepleteCount());
-                        if (subtract.compareTo(BigDecimal.ZERO) < 0){
-                            throw new ServiceException(IOT_LOCK_STOCK_FUSHU);
+            maintainMaterials.forEach(f ->{
+                f.getMaterials().forEach(e ->{
+                    String code = e.getMaterialCode();
+                    //减去本地库存
+                    if ("本地库存".equals(e.getMaterialSource())){
+                        List<IotLockStockDO> stockDOS = iotLockStockMapper.selectByMap(ImmutableMap.of("material_code", code, "dept_id", maintainSaveVO.getMaintain().getDeptId()));
+                        if (CollUtil.isNotEmpty(stockDOS)) {
+                            IotLockStockDO iotLockStockDO = stockDOS.get(0);
+                            BigDecimal quantity = iotLockStockDO.getQuantity();
+                            BigDecimal subtract = quantity.subtract(e.getQuantity());
+                            if (subtract.compareTo(BigDecimal.ZERO) < 0){
+                                throw new ServiceException(IOT_LOCK_STOCK_FUSHU);
+                            }
+                            iotLockStockDO.setQuantity(subtract);
+                            iotLockStockMapper.updateById(iotLockStockDO);
                         }
-                        iotLockStockDO.setQuantity(subtract);
-                        iotLockStockMapper.updateById(iotLockStockDO);
                     }
-                }
-                //记录出库
-                IotOutboundDO outboundDO = new IotOutboundDO();
-                outboundDO.setDeptId(maintainSaveVO.getMaintain().getDeptId());
-                outboundDO.setMaterialCode(code);
-                outboundDO.setMaterialName(e.getName());
-                outboundDO.setDeliveryTime(LocalDateTimeUtil.now());
-                outboundDO.setReason("故障维修");
-                outboundDO.setStatus(0);
-                outboundDO.setType(1);
-                outboundDO.setDeleted(false);
-                outboundDO.setUnit(e.getUnit());
-                outboundDO.setUnitPrice(e.getPrice());
-                iotOutboundMapper.insert(outboundDO);
+                    //记录出库
+                    IotOutboundDO outboundDO = new IotOutboundDO();
+                    outboundDO.setDeptId(maintainSaveVO.getMaintain().getDeptId());
+                    outboundDO.setMaterialCode(code);
+                    outboundDO.setMaterialName(e.getMaterialName());
+                    outboundDO.setDeliveryTime(LocalDateTimeUtil.now());
+                    outboundDO.setReason("故障维修");
+                    outboundDO.setStatus(0);
+                    outboundDO.setType(1);
+                    outboundDO.setDeleted(false);
+                    outboundDO.setUnit(e.getUnit());
+                    outboundDO.setUnitPrice(e.getUnitPrice());
+                    iotOutboundMapper.insert(outboundDO);
+                });
             });
         }
         //更新故障上报的状态为工单处理完成