瀏覽代碼

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
zhangcl 4 月之前
父節點
當前提交
27231b5a5a
共有 23 個文件被更改,包括 1094 次插入6 次删除
  1. 3 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java
  3. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainSaveReqVO.java
  4. 97 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/IotMaintenanceDetailsController.java
  5. 97 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/IotMaintenancePlanController.java
  6. 61 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceDetailsPageReqVO.java
  7. 72 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceDetailsRespVO.java
  8. 52 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceDetailsSaveReqVO.java
  9. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanPageReqVO.java
  10. 51 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanRespVO.java
  11. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanSaveReqVO.java
  12. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainDO.java
  13. 82 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintenance/IotMaintenanceDetailsDO.java
  14. 59 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintenance/IotMaintenancePlanDO.java
  15. 38 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenanceDetailsMapper.java
  16. 33 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenancePlanMapper.java
  17. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java
  18. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainService.java
  19. 98 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java
  20. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenanceDetailsService.java
  21. 75 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenanceDetailsServiceImpl.java
  22. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanService.java
  23. 75 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanServiceImpl.java

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

@@ -30,6 +30,9 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_SAP_STOCK_NOT_EXISTS = new ErrorCode(131, "PMS SAP 库存(通用库存/项目部库存)不存在");
     ErrorCode IOT_MAINTAIN_MATERIAL_NOT_EXISTS = new ErrorCode(129, "工单物料不存在");
     ErrorCode IOT_INFORMATION_DB_NOT_EXISTS = new ErrorCode(130, "知识库不存在");
+    ErrorCode IOT_LOCK_STOCK_FUSHU = new ErrorCode(131, "超过本地库存");
+    ErrorCode IOT_MAINTENANCE_PLAN_NOT_EXISTS = new ErrorCode(133, "保养计划明细不存在");
+    ErrorCode IOT_MAINTENANCE_DETAILS_NOT_EXISTS = new ErrorCode(134, "保养计划明细不存在");
     ErrorCode IOT_STORAGE_AREA_NOT_EXISTS = new ErrorCode(131, "PMS 库区不存在");
     ErrorCode IOT_SHELVES_NOT_EXISTS = new ErrorCode(132, "PMS 货架不存在");
     ErrorCode IOT_CARGO_LOCATION_NOT_EXISTS = new ErrorCode(133, "PMS 货位不存在");

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

@@ -56,7 +56,7 @@ public class IotMaintainController {
     @PutMapping("/update")
     @Operation(summary = "更新维修工单")
     @PreAuthorize("@ss.hasPermission('rq:iot-maintain:update')")
-    public CommonResult<Boolean> updateIotMaintain(@Valid @RequestBody IotMaintainSaveReqVO updateReqVO) {
+    public CommonResult<Boolean> updateIotMaintain(@Valid @RequestBody IotMaintainSaveVO updateReqVO) {
         iotMaintainService.updateIotMaintain(updateReqVO);
         return success(true);
     }

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

@@ -13,6 +13,9 @@ public class IotMaintainSaveReqVO {
     //@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20489")
     private Long id;
 
+    //故障id
+    private String failureId;
+
     //@Schema(description = "故障编码", requiredMode = Schema.RequiredMode.REQUIRED)
     private String failureCode;
 

+ 97 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/IotMaintenanceDetailsController.java

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceDetailsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceDetailsRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceDetailsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenanceDetailsDO;
+import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenanceDetailsService;
+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-maintenance-details")
+@Validated
+public class IotMaintenanceDetailsController {
+
+    @Resource
+    private IotMaintenanceDetailsService iotMaintenanceDetailsService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建保养计划明细")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-details:create')")
+    public CommonResult<Long> createIotMaintenanceDetails(@Valid @RequestBody IotMaintenanceDetailsSaveReqVO createReqVO) {
+        return success(iotMaintenanceDetailsService.createIotMaintenanceDetails(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新保养计划明细")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-details:update')")
+    public CommonResult<Boolean> updateIotMaintenanceDetails(@Valid @RequestBody IotMaintenanceDetailsSaveReqVO updateReqVO) {
+        iotMaintenanceDetailsService.updateIotMaintenanceDetails(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除保养计划明细")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-details:delete')")
+    public CommonResult<Boolean> deleteIotMaintenanceDetails(@RequestParam("id") Long id) {
+        iotMaintenanceDetailsService.deleteIotMaintenanceDetails(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得保养计划明细")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-details:query')")
+    public CommonResult<IotMaintenanceDetailsRespVO> getIotMaintenanceDetails(@RequestParam("id") Long id) {
+        IotMaintenanceDetailsDO iotMaintenanceDetails = iotMaintenanceDetailsService.getIotMaintenanceDetails(id);
+        return success(BeanUtils.toBean(iotMaintenanceDetails, IotMaintenanceDetailsRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得保养计划明细分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-details:query')")
+    public CommonResult<PageResult<IotMaintenanceDetailsRespVO>> getIotMaintenanceDetailsPage(@Valid IotMaintenanceDetailsPageReqVO pageReqVO) {
+        PageResult<IotMaintenanceDetailsDO> pageResult = iotMaintenanceDetailsService.getIotMaintenanceDetailsPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotMaintenanceDetailsRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出保养计划明细 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-details:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotMaintenanceDetailsExcel(@Valid IotMaintenanceDetailsPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotMaintenanceDetailsDO> list = iotMaintenanceDetailsService.getIotMaintenanceDetailsPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "保养计划明细.xls", "数据", IotMaintenanceDetailsRespVO.class,
+                        BeanUtils.toBean(list, IotMaintenanceDetailsRespVO.class));
+    }
+
+}

+ 97 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/IotMaintenancePlanController.java

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
+import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
+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-maintenance-plan")
+@Validated
+public class IotMaintenancePlanController {
+
+    @Resource
+    private IotMaintenancePlanService iotMaintenancePlanService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建保养计划")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:create')")
+    public CommonResult<Long> createIotMaintenancePlan(@Valid @RequestBody IotMaintenancePlanSaveReqVO createReqVO) {
+        return success(iotMaintenancePlanService.createIotMaintenancePlan(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新保养计划")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:update')")
+    public CommonResult<Boolean> updateIotMaintenancePlan(@Valid @RequestBody IotMaintenancePlanSaveReqVO updateReqVO) {
+        iotMaintenancePlanService.updateIotMaintenancePlan(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除保养计划")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:delete')")
+    public CommonResult<Boolean> deleteIotMaintenancePlan(@RequestParam("id") Long id) {
+        iotMaintenancePlanService.deleteIotMaintenancePlan(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得保养计划")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:query')")
+    public CommonResult<IotMaintenancePlanRespVO> getIotMaintenancePlan(@RequestParam("id") Long id) {
+        IotMaintenancePlanDO iotMaintenancePlan = iotMaintenancePlanService.getIotMaintenancePlan(id);
+        return success(BeanUtils.toBean(iotMaintenancePlan, IotMaintenancePlanRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得保养计划分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:query')")
+    public CommonResult<PageResult<IotMaintenancePlanRespVO>> getIotMaintenancePlanPage(@Valid IotMaintenancePlanPageReqVO pageReqVO) {
+        PageResult<IotMaintenancePlanDO> pageResult = iotMaintenancePlanService.getIotMaintenancePlanPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotMaintenancePlanRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出保养计划 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotMaintenancePlanExcel(@Valid IotMaintenancePlanPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotMaintenancePlanDO> list = iotMaintenancePlanService.getIotMaintenancePlanPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "保养计划.xls", "数据", IotMaintenancePlanRespVO.class,
+                        BeanUtils.toBean(list, IotMaintenancePlanRespVO.class));
+    }
+
+}

+ 61 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceDetailsPageReqVO.java

@@ -0,0 +1,61 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.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 IotMaintenanceDetailsPageReqVO extends PageParam {
+
+    @Schema(description = "保养计划id", example = "7027")
+    private Long planId;
+
+    @Schema(description = "设备id", example = "14317")
+    private Long deviceId;
+
+    @Schema(description = "设备资产编号")
+    private String deviceAssetNumber;
+
+    @Schema(description = "设备名称", example = "李四")
+    private String deviceName;
+
+    @Schema(description = "设备类别")
+    private String deviceCategory;
+
+    @Schema(description = "设备品牌")
+    private String deviceBrand;
+
+    @Schema(description = "当前运行公里数(km)")
+    private BigDecimal runningKilometers;
+
+    @Schema(description = "当前运行时间(小时)")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private BigDecimal[] runningTime;
+
+    @Schema(description = "自然日期(天)")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private BigDecimal[] naturalDate;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 72 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceDetailsRespVO.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.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 IotMaintenanceDetailsRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31782")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "保养计划id", example = "7027")
+    @ExcelProperty("保养计划id")
+    private Long planId;
+
+    @Schema(description = "设备id", example = "14317")
+    @ExcelProperty("设备id")
+    private Long deviceId;
+
+    @Schema(description = "设备资产编号")
+    @ExcelProperty("设备资产编号")
+    private String deviceAssetNumber;
+
+    @Schema(description = "设备名称", example = "李四")
+    @ExcelProperty("设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类别")
+    @ExcelProperty("设备类别")
+    private String deviceCategory;
+
+    @Schema(description = "设备品牌")
+    @ExcelProperty("设备品牌")
+    private String deviceBrand;
+
+    @Schema(description = "当前运行公里数(km)")
+    @ExcelProperty("当前运行公里数(km)")
+    private BigDecimal runningKilometers;
+
+    @Schema(description = "当前运行时间(小时)")
+    @ExcelProperty("当前运行时间(小时)")
+    private BigDecimal runningTime;
+
+    @Schema(description = "自然日期(天)")
+    @ExcelProperty("自然日期(天)")
+    private BigDecimal naturalDate;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "排序")
+    @ExcelProperty("排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    @ExcelProperty("状态 0启用  1停用")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 52 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceDetailsSaveReqVO.java

@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.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 IotMaintenanceDetailsSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31782")
+    private Long id;
+
+    @Schema(description = "保养计划id", example = "7027")
+    private Long planId;
+
+    @Schema(description = "设备id", example = "14317")
+    private Long deviceId;
+
+    @Schema(description = "设备资产编号")
+    private String deviceAssetNumber;
+
+    @Schema(description = "设备名称", example = "李四")
+    private String deviceName;
+
+    @Schema(description = "设备类别")
+    private String deviceCategory;
+
+    @Schema(description = "设备品牌")
+    private String deviceBrand;
+
+    @Schema(description = "当前运行公里数(km)")
+    private BigDecimal runningKilometers;
+
+    @Schema(description = "当前运行时间(小时)")
+    private BigDecimal runningTime;
+
+    @Schema(description = "自然日期(天)")
+    private BigDecimal naturalDate;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    private Integer status;
+
+}

+ 43 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanPageReqVO.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.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 = "管理后台 - 保养计划分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotMaintenancePlanPageReqVO extends PageParam {
+
+    @Schema(description = "组织id", example = "1052")
+    private Long deptId;
+
+    @Schema(description = "计划编号 自动生成")
+    private String serialNumber;
+
+    @Schema(description = "计划名称 默认以队伍名称生成", example = "张三")
+    private String name;
+
+    @Schema(description = "负责人id 多个以逗号分隔")
+    private String responsiblePerson;
+
+    @Schema(description = "负责人id 多个以逗号分隔", example = "王五")
+    private String responsiblePersonName;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 51 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanRespVO.java

@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.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 = "管理后台 - 保养计划 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotMaintenancePlanRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3796")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "组织id", example = "1052")
+    @ExcelProperty("组织id")
+    private Long deptId;
+
+    @Schema(description = "计划编号 自动生成")
+    @ExcelProperty("计划编号 自动生成")
+    private String serialNumber;
+
+    @Schema(description = "计划名称 默认以队伍名称生成", example = "张三")
+    @ExcelProperty("计划名称 默认以队伍名称生成")
+    private String name;
+
+    @Schema(description = "负责人id 多个以逗号分隔")
+    @ExcelProperty("负责人id 多个以逗号分隔")
+    private String responsiblePerson;
+
+    @Schema(description = "负责人id 多个以逗号分隔", example = "王五")
+    @ExcelProperty("负责人id 多个以逗号分隔")
+    private String responsiblePersonName;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    @ExcelProperty("状态 0启用  1停用")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanSaveReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 保养计划新增/修改 Request VO")
+@Data
+public class IotMaintenancePlanSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3796")
+    private Long id;
+
+    @Schema(description = "组织id", example = "1052")
+    private Long deptId;
+
+    @Schema(description = "计划编号 自动生成")
+    private String serialNumber;
+
+    @Schema(description = "计划名称 默认以队伍名称生成", example = "张三")
+    private String name;
+
+    @Schema(description = "负责人id 多个以逗号分隔")
+    private String responsiblePerson;
+
+    @Schema(description = "负责人id 多个以逗号分隔", example = "王五")
+    private String responsiblePersonName;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    private Integer status;
+
+}

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

@@ -30,6 +30,10 @@ public class IotMaintainDO extends BaseDO {
      */
     @TableId
     private Long id;
+    /**
+     * 故障id
+     */
+    private Long failureId;
     /**
      * 故障编码
      */

+ 82 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintenance/IotMaintenanceDetailsDO.java

@@ -0,0 +1,82 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.maintenance;
+
+import lombok.*;
+import java.util.*;
+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_maintenance_details")
+@KeySequence("rq_iot_maintenance_details_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotMaintenanceDetailsDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 保养计划id
+     */
+    private Long planId;
+    /**
+     * 设备id
+     */
+    private Long deviceId;
+    /**
+     * 设备资产编号
+     */
+    private String deviceAssetNumber;
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+    /**
+     * 设备类别
+     */
+    private String deviceCategory;
+    /**
+     * 设备品牌
+     */
+    private String deviceBrand;
+    /**
+     * 当前运行公里数(km)
+     */
+    private BigDecimal runningKilometers;
+    /**
+     * 当前运行时间(小时)
+     */
+    private BigDecimal runningTime;
+    /**
+     * 自然日期(天)
+     */
+    private BigDecimal naturalDate;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 状态 0启用  1停用
+     */
+    private Integer status;
+
+}

+ 59 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintenance/IotMaintenancePlanDO.java

@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.maintenance;
+
+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;
+
+/**
+ * 保养计划 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("rq_iot_maintenance_plan")
+@KeySequence("rq_iot_maintenance_plan_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotMaintenancePlanDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 组织id
+     */
+    private Long deptId;
+    /**
+     * 计划编号 自动生成
+     */
+    private String serialNumber;
+    /**
+     * 计划名称 默认以队伍名称生成
+     */
+    private String name;
+    /**
+     * 负责人id 多个以逗号分隔
+     */
+    private String responsiblePerson;
+    /**
+     * 负责人id 多个以逗号分隔
+     */
+    private String responsiblePersonName;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态 0启用  1停用
+     */
+    private Integer status;
+
+}

+ 38 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenanceDetailsMapper.java

@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.maintenance;
+
+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.maintenance.vo.IotMaintenanceDetailsPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenanceDetailsDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 保养计划明细 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface IotMaintenanceDetailsMapper extends BaseMapperX<IotMaintenanceDetailsDO> {
+
+    default PageResult<IotMaintenanceDetailsDO> selectPage(IotMaintenanceDetailsPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotMaintenanceDetailsDO>()
+                .eqIfPresent(IotMaintenanceDetailsDO::getPlanId, reqVO.getPlanId())
+                .eqIfPresent(IotMaintenanceDetailsDO::getDeviceId, reqVO.getDeviceId())
+                .eqIfPresent(IotMaintenanceDetailsDO::getDeviceAssetNumber, reqVO.getDeviceAssetNumber())
+                .likeIfPresent(IotMaintenanceDetailsDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotMaintenanceDetailsDO::getDeviceCategory, reqVO.getDeviceCategory())
+                .eqIfPresent(IotMaintenanceDetailsDO::getDeviceBrand, reqVO.getDeviceBrand())
+                .eqIfPresent(IotMaintenanceDetailsDO::getRunningKilometers, reqVO.getRunningKilometers())
+                .betweenIfPresent(IotMaintenanceDetailsDO::getRunningTime, reqVO.getRunningTime())
+                .betweenIfPresent(IotMaintenanceDetailsDO::getNaturalDate, reqVO.getNaturalDate())
+                .eqIfPresent(IotMaintenanceDetailsDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotMaintenanceDetailsDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotMaintenanceDetailsDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotMaintenanceDetailsDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotMaintenanceDetailsDO::getId));
+    }
+
+}

+ 33 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenancePlanMapper.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.maintenance;
+
+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.maintenance.vo.IotMaintenancePlanPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 保养计划 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface IotMaintenancePlanMapper extends BaseMapperX<IotMaintenancePlanDO> {
+
+    default PageResult<IotMaintenancePlanDO> selectPage(IotMaintenancePlanPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotMaintenancePlanDO>()
+                .eqIfPresent(IotMaintenancePlanDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotMaintenancePlanDO::getSerialNumber, reqVO.getSerialNumber())
+                .likeIfPresent(IotMaintenancePlanDO::getName, reqVO.getName())
+                .eqIfPresent(IotMaintenancePlanDO::getResponsiblePerson, reqVO.getResponsiblePerson())
+                .likeIfPresent(IotMaintenancePlanDO::getResponsiblePersonName, reqVO.getResponsiblePersonName())
+                .eqIfPresent(IotMaintenancePlanDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotMaintenancePlanDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotMaintenancePlanDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotMaintenancePlanDO::getId));
+    }
+
+}

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java

@@ -84,6 +84,7 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
         iotMaintainDO.setStatus("tx");
         iotMaintainDO.setAuditStatus(0);
         iotMaintainDO.setMaintainPerson(failureReportDO.getAssigneeUserId());
+        iotMaintainDO.setFailureId(failureReportDO.getId());
         iotMaintainMapper.insert(iotMaintainDO);
     }
 

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainService.java

@@ -30,7 +30,7 @@ public interface IotMaintainService {
      *
      * @param updateReqVO 更新信息
      */
-    void updateIotMaintain(@Valid IotMaintainSaveReqVO updateReqVO);
+    void updateIotMaintain(@Valid IotMaintainSaveVO updateReqVO);
 
     /**
      * 删除维修工单

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

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.module.pms.service.maintain;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -9,22 +11,33 @@ import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageR
 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.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.IotMaintainDO;
 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.IotMaintainMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.material.IotMaintainMaterialMapper;
+import com.google.common.collect.ImmutableMap;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 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_LOCK_STOCK_FUSHU;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTAIN_NOT_EXISTS;
 
 /**
@@ -40,6 +53,12 @@ public class IotMaintainServiceImpl implements IotMaintainService {
     private IotMaintainMapper iotMaintainMapper;
     @Resource
     private IotMaintainMaterialMapper iotMaintainMaterialMapper;
+    @Resource
+    private IotLockStockMapper iotLockStockMapper;
+    @Resource
+    private IotOutboundMapper iotOutboundMapper;
+    @Autowired
+    private IotFailureReportMapper iotFailureReportMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -59,19 +78,94 @@ public class IotMaintainServiceImpl implements IotMaintainService {
             return bean;
         }).collect(Collectors.toList());
         iotMaintainMaterialMapper.insertBatch(collect);
-        // 返回
+        //本地库存减少且记录出库
+        if ("finished".equals(createReqVO.getMaintain().getStatus())){
+            localStockAndOut(createReqVO);
+        }
         return iotMaintain.getId();
     }
 
     @Override
-    public void updateIotMaintain(IotMaintainSaveReqVO updateReqVO) {
+    public void updateIotMaintain(IotMaintainSaveVO updateReqVO) {
         // 校验存在
-        validateIotMaintainExists(updateReqVO.getId());
+        validateIotMaintainExists(updateReqVO.getMaintain().getId());
         // 更新
-        IotMaintainDO updateObj = BeanUtils.toBean(updateReqVO, IotMaintainDO.class);
+        IotMaintainDO updateObj = BeanUtils.toBean(updateReqVO.getMaintain(), IotMaintainDO.class);
         iotMaintainMapper.updateById(updateObj);
+
+        List<IotMaintainMaterialSaveReqVO> maintainMaterials = updateReqVO.getMaintainMaterials();
+        //删除工单物料
+        iotMaintainMaterialMapper.deleteByMap(ImmutableMap.of("maintainId", updateObj.getId()));
+        //插入工单物料
+        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);
+        //本地库存减少且记录出库
+        if ("finished".equals(updateReqVO.getMaintain().getStatus())){
+            localStockAndOut(updateReqVO);
+        }
     }
 
+    /**
+     * 减少本地库存并记录出库
+     * @param maintainSaveVO 维修工单信息
+     */
+    private void localStockAndOut(IotMaintainSaveVO maintainSaveVO) {
+        List<IotMaintainMaterialSaveReqVO> 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(BigDecimal.valueOf(e.getDepleteCount()));
+                        if (subtract.compareTo(BigDecimal.ZERO) < 0){
+                            throw new ServiceException(IOT_LOCK_STOCK_FUSHU);
+                        }
+                        iotLockStockDO.setQuantity(subtract);
+                        iotLockStockMapper.updateById(iotLockStockDO);
+                        //todo 安全库存提醒?
+                    }
+                }
+                //记录出库
+                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);
+            });
+        }
+        //更新故障上报的状态为工单处理完成
+        IotMaintainSaveReqVO iotMaintain = maintainSaveVO.getMaintain();
+        if (Objects.nonNull(iotMaintain.getFailureId())){
+            IotFailureReportDO iotFailureReportDO = iotFailureReportMapper.selectById(iotMaintain.getFailureId());
+            if (Objects.nonNull(iotFailureReportDO)){
+                iotFailureReportDO.setStatus("orderfinished");
+                iotFailureReportMapper.updateById(iotFailureReportDO);
+            }
+        }
+        //todo 异步消息通知逻辑
+        CompletableFuture.runAsync(()->{
+
+        });
+    }
+
+
     @Override
     public void deleteIotMaintain(Long id) {
         // 校验存在

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

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.pms.service.maintenance;
+
+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.maintenance.vo.IotMaintenanceDetailsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceDetailsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenanceDetailsDO;
+
+/**
+ * 保养计划明细 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface IotMaintenanceDetailsService {
+
+    /**
+     * 创建保养计划明细
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotMaintenanceDetails(@Valid IotMaintenanceDetailsSaveReqVO createReqVO);
+
+    /**
+     * 更新保养计划明细
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotMaintenanceDetails(@Valid IotMaintenanceDetailsSaveReqVO updateReqVO);
+
+    /**
+     * 删除保养计划明细
+     *
+     * @param id 编号
+     */
+    void deleteIotMaintenanceDetails(Long id);
+
+    /**
+     * 获得保养计划明细
+     *
+     * @param id 编号
+     * @return 保养计划明细
+     */
+    IotMaintenanceDetailsDO getIotMaintenanceDetails(Long id);
+
+    /**
+     * 获得保养计划明细分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 保养计划明细分页
+     */
+    PageResult<IotMaintenanceDetailsDO> getIotMaintenanceDetailsPage(IotMaintenanceDetailsPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.pms.service.maintenance;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceDetailsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceDetailsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenanceDetailsDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintenance.IotMaintenanceDetailsMapper;
+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_MAINTENANCE_DETAILS_NOT_EXISTS;
+
+/**
+ * 保养计划明细 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class IotMaintenanceDetailsServiceImpl implements IotMaintenanceDetailsService {
+
+    @Resource
+    private IotMaintenanceDetailsMapper iotMaintenanceDetailsMapper;
+
+    @Override
+    public Long createIotMaintenanceDetails(IotMaintenanceDetailsSaveReqVO createReqVO) {
+        // 插入
+        IotMaintenanceDetailsDO iotMaintenanceDetails = BeanUtils.toBean(createReqVO, IotMaintenanceDetailsDO.class);
+        iotMaintenanceDetailsMapper.insert(iotMaintenanceDetails);
+        // 返回
+        return iotMaintenanceDetails.getId();
+    }
+
+    @Override
+    public void updateIotMaintenanceDetails(IotMaintenanceDetailsSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotMaintenanceDetailsExists(updateReqVO.getId());
+        // 更新
+        IotMaintenanceDetailsDO updateObj = BeanUtils.toBean(updateReqVO, IotMaintenanceDetailsDO.class);
+        iotMaintenanceDetailsMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotMaintenanceDetails(Long id) {
+        // 校验存在
+        validateIotMaintenanceDetailsExists(id);
+        // 删除
+        iotMaintenanceDetailsMapper.deleteById(id);
+    }
+
+    private void validateIotMaintenanceDetailsExists(Long id) {
+        if (iotMaintenanceDetailsMapper.selectById(id) == null) {
+            throw exception(IOT_MAINTENANCE_DETAILS_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotMaintenanceDetailsDO getIotMaintenanceDetails(Long id) {
+        return iotMaintenanceDetailsMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotMaintenanceDetailsDO> getIotMaintenanceDetailsPage(IotMaintenanceDetailsPageReqVO pageReqVO) {
+        return iotMaintenanceDetailsMapper.selectPage(pageReqVO);
+    }
+
+}

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

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.pms.service.maintenance;
+
+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.maintenance.vo.IotMaintenancePlanPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
+
+/**
+ * 保养计划 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface IotMaintenancePlanService {
+
+    /**
+     * 创建保养计划
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotMaintenancePlan(@Valid IotMaintenancePlanSaveReqVO createReqVO);
+
+    /**
+     * 更新保养计划
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotMaintenancePlan(@Valid IotMaintenancePlanSaveReqVO updateReqVO);
+
+    /**
+     * 删除保养计划
+     *
+     * @param id 编号
+     */
+    void deleteIotMaintenancePlan(Long id);
+
+    /**
+     * 获得保养计划
+     *
+     * @param id 编号
+     * @return 保养计划
+     */
+    IotMaintenancePlanDO getIotMaintenancePlan(Long id);
+
+    /**
+     * 获得保养计划分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 保养计划分页
+     */
+    PageResult<IotMaintenancePlanDO> getIotMaintenancePlanPage(IotMaintenancePlanPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.pms.service.maintenance;
+
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintenance.IotMaintenancePlanMapper;
+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_MAINTENANCE_PLAN_NOT_EXISTS;
+
+/**
+ * 保养计划 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class IotMaintenancePlanServiceImpl implements IotMaintenancePlanService {
+
+    @Resource
+    private IotMaintenancePlanMapper iotMaintenancePlanMapper;
+
+    @Override
+    public Long createIotMaintenancePlan(IotMaintenancePlanSaveReqVO createReqVO) {
+        // 插入
+        IotMaintenancePlanDO iotMaintenancePlan = BeanUtils.toBean(createReqVO, IotMaintenancePlanDO.class);
+        iotMaintenancePlanMapper.insert(iotMaintenancePlan);
+        // 返回
+        return iotMaintenancePlan.getId();
+    }
+
+    @Override
+    public void updateIotMaintenancePlan(IotMaintenancePlanSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotMaintenancePlanExists(updateReqVO.getId());
+        // 更新
+        IotMaintenancePlanDO updateObj = BeanUtils.toBean(updateReqVO, IotMaintenancePlanDO.class);
+        iotMaintenancePlanMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotMaintenancePlan(Long id) {
+        // 校验存在
+        validateIotMaintenancePlanExists(id);
+        // 删除
+        iotMaintenancePlanMapper.deleteById(id);
+    }
+
+    private void validateIotMaintenancePlanExists(Long id) {
+        if (iotMaintenancePlanMapper.selectById(id) == null) {
+            throw exception(IOT_MAINTENANCE_PLAN_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotMaintenancePlanDO getIotMaintenancePlan(Long id) {
+        return iotMaintenancePlanMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotMaintenancePlanDO> getIotMaintenancePlanPage(IotMaintenancePlanPageReqVO pageReqVO) {
+        return iotMaintenancePlanMapper.selectPage(pageReqVO);
+    }
+
+}