diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/bdgzsomthing/bdgzsomthingController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/bdgzsomthing/bdgzsomthingController.java index 2a08e1e..9007375 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/bdgzsomthing/bdgzsomthingController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/bdgzsomthing/bdgzsomthingController.java @@ -151,7 +151,7 @@ public class bdgzsomthingController { BeanUtils.toBean(list, bdgzsomthingRespVO.class)); } - @Scheduled(fixedRate = 10800000) +// @Scheduled(fixedRate = 10800000) public void scheduledTask() { bdgzsomthingService.selectds(); } @@ -159,15 +159,15 @@ public class bdgzsomthingController { //@Scheduled(cron = "0 2 0 * * ?") //每天十天执行一次 @PostConstruct public void init() { - selectHasPrice(); - selectSafeStorageAndDeliverOneYear(); +// selectHasPrice(); +// selectSafeStorageAndDeliverOneYear(); } - @Scheduled(cron = "0 0 2 * * ?") +// @Scheduled(cron = "0 0 2 * * ?") public void selectHasPrice(){ bdgzsomthingService.selectHasPrice(); } - @Scheduled(cron = "0 0 0 * * ?") +// @Scheduled(cron = "0 0 0 * * ?") public void selectSafeStorageAndDeliverOneYear(){bdgzsomthingService.selectSafeStorageAndDeliverOneYear();} @PostMapping("/getMessage") @Operation(summary = "小程序消息") diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/MaterialPlanController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/MaterialPlanController.java index af6cc4c..95fa7b3 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/MaterialPlanController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/MaterialPlanController.java @@ -1,95 +1,143 @@ -package com.chanko.yunxi.mes.module.heli.controller.admin.materialplan; - -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 com.chanko.yunxi.mes.framework.common.pojo.PageParam; -import com.chanko.yunxi.mes.framework.common.pojo.PageResult; -import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; -import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; -import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; - -import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; - -import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; -import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; - -import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.*; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; -import com.chanko.yunxi.mes.module.heli.service.materialplan.MaterialPlanService; - -@Tag(name = "管理后台 - 物料需求计划") -@RestController -@RequestMapping("/heli/material-plan") -@Validated -public class MaterialPlanController { - - @Resource - private MaterialPlanService materialPlanService; - - @PostMapping("/create") - @Operation(summary = "创建物料需求计划") - @PreAuthorize("@ss.hasPermission('heli:material-plan:create')") - public CommonResult<Long> createMaterialPlan(@Valid @RequestBody MaterialPlanSaveReqVO createReqVO) { - return success(materialPlanService.createMaterialPlan(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新物料需求计划") - @PreAuthorize("@ss.hasPermission('heli:material-plan:update')") - public CommonResult<Boolean> updateMaterialPlan(@Valid @RequestBody MaterialPlanSaveReqVO updateReqVO) { - materialPlanService.updateMaterialPlan(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除物料需求计划") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('heli:material-plan:delete')") - public CommonResult<Boolean> deleteMaterialPlan(@RequestParam("id") Long id) { - materialPlanService.deleteMaterialPlan(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得物料需求计划") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('heli:material-plan:query')") - public CommonResult<MaterialPlanRespVO> getMaterialPlan(@RequestParam("id") Long id) { - MaterialPlanDO materialPlan = materialPlanService.getMaterialPlan(id); - return success(BeanUtils.toBean(materialPlan, MaterialPlanRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得物料需求计划分页") - @PreAuthorize("@ss.hasPermission('heli:material-plan:query')") - public CommonResult<PageResult<MaterialPlanRespVO>> getMaterialPlanPage(@Valid MaterialPlanPageReqVO pageReqVO) { - PageResult<MaterialPlanDO> pageResult = materialPlanService.getMaterialPlanPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, MaterialPlanRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出物料需求计划 Excel") - @PreAuthorize("@ss.hasPermission('heli:material-plan:export')") - @OperateLog(type = EXPORT) - public void exportMaterialPlanExcel(@Valid MaterialPlanPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List<MaterialPlanDO> list = materialPlanService.getMaterialPlanPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "物料需求计划.xls", "数据", MaterialPlanRespVO.class, - BeanUtils.toBean(list, MaterialPlanRespVO.class)); - } - -} \ No newline at end of file +package com.chanko.yunxi.mes.module.heli.controller.admin.materialplan; + +import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; +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 com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; + +import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; + +import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; +import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; +import com.chanko.yunxi.mes.module.heli.service.materialplan.MaterialPlanService; + +@Tag(name = "管理后台 - 物料需求计划") +@RestController +@RequestMapping("/heli/material-plan") +@Validated +public class MaterialPlanController { + + @Resource + private MaterialPlanService materialPlanService; + + @PostMapping("/create") + @Operation(summary = "创建物料需求计划") + @PreAuthorize("@ss.hasPermission('heli:material-plan:create')") + public CommonResult<Long> createMaterialPlan(@Valid @RequestBody MaterialPlanSaveReqVO createReqVO) { + return success(materialPlanService.createMaterialPlan(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新物料需求计划") + @PreAuthorize("@ss.hasPermission('heli:material-plan:update')") + public CommonResult<Boolean> updateMaterialPlan(@Valid @RequestBody MaterialPlanSaveReqVO updateReqVO) { + materialPlanService.updateMaterialPlan(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除物料需求计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:material-plan:delete')") + public CommonResult<Boolean> deleteMaterialPlan(@RequestParam("id") Long id) { + materialPlanService.deleteMaterialPlan(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得物料需求计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:material-plan:query')") + public CommonResult<MaterialPlanRespVO> getMaterialPlan(@RequestParam("id") Long id) { + MaterialPlanDO materialPlan = materialPlanService.getMaterialPlan(id); + return success(BeanUtils.toBean(materialPlan, MaterialPlanRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得物料需求计划分页") + @PreAuthorize("@ss.hasPermission('heli:material-plan:query')") + public CommonResult<PageResult<MaterialPlanRespVO>> getMaterialPlanPage(@Valid MaterialPlanPageReqVO pageReqVO) { + PageResult<MaterialPlanDO> pageResult = materialPlanService.getMaterialPlanPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MaterialPlanRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出物料需求计划 Excel") + @PreAuthorize("@ss.hasPermission('heli:material-plan:export')") + @OperateLog(type = EXPORT) + public void exportMaterialPlanExcel(@Valid MaterialPlanPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List<MaterialPlanDO> list = materialPlanService.getMaterialPlanPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "物料需求计划.xls", "数据", MaterialPlanRespVO.class, + BeanUtils.toBean(list, MaterialPlanRespVO.class)); + } + @GetMapping("/pages") + @Operation(summary = "获得标准件物料需求计划管理分页") + @PreAuthorize("@ss.hasPermission('heli:material-plan:query')") + public CommonResult<PageResult<MaterialPlanRespVO>> getMaterialPlanPages(@Valid MaterialPlanPageReqVO pageReqVO) { + PageResult<MaterialPlanDO> pageResult = materialPlanService.getMaterialPlanPages(pageReqVO); + return success(BeanUtils.toBean(pageResult, MaterialPlanRespVO.class)); + } + @DeleteMapping("/delMaterialPlan") + @Operation(summary = "删除物料需求计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:material-plan:delete')") + public CommonResult<Boolean> delMaterialPlan(@RequestParam("id") Long id) { + return materialPlanService.delMaterialPlan(id); + } + + @GetMapping("/getPartPage") + @Operation(summary = "获得零件物料需求计划分页") + @PreAuthorize("@ss.hasPermission('heli:material-plan:query')") + public CommonResult<PageResult<TaskDispatchDetailDO>> getPartPage(@Valid MaterialPlanPageReqVO pageReqVO) { + PageResult<TaskDispatchDetailDO> pageResult = materialPlanService.getPartPage(pageReqVO); + return success(pageResult); + } + @PostMapping("/submit") + @Operation(summary = "提交") + @PreAuthorize("@ss.hasPermission('heli:process-bom:create')") + public CommonResult<Boolean> submit(@Valid @RequestBody List<TaskDispatchDetailDO> list) { + return success(materialPlanService.submit(list)); + } + @GetMapping("/withdraw") + @Operation(summary = "撤回") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:process-bom:query')") + public CommonResult<Boolean> withdraw(@RequestParam("code") String code) { + return materialPlanService.withdraw(code); + } + @GetMapping("/exportPart") + @Operation(summary = "导出物料需求计划 Excel") + @PreAuthorize("@ss.hasPermission('heli:material-plan:export')") + @OperateLog(type = EXPORT) + public void exportPart(@Valid MaterialPlanPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List<TaskDispatchDetailDO> list = materialPlanService.getPartPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "零件物料需求计划.xlsx", "数据", PartExcelVO.class, + BeanUtils.toBean(list, PartExcelVO.class)); + } +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanPageReqVO.java index 6ab6858..90585f9 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanPageReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanPageReqVO.java @@ -56,5 +56,14 @@ public class MaterialPlanPageReqVO extends PageParam { @Schema(description = "创建时间") private String createTime; + @Schema(description = "子项目名称") + private String projectSubName; + @Schema(description = "零件名称") + private String materialName; + @Schema(description = "项目编码") + private String projectCode; + @Schema(description = "需求计划类型") + private String matType; + } \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanRespVO.java index d6353fa..52f1d42 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanRespVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/MaterialPlanRespVO.java @@ -72,4 +72,17 @@ public class MaterialPlanRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "子项目名称") + @ExcelProperty("子项目名称") + private String name; + @Schema(description = "客户简称") + @ExcelProperty("客户简称") + private String brief; + @Schema(description = "需求计划类型") + @ExcelProperty("需求计划类型") + private String matType; + @Schema(description = "制单日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("制单日期") + private LocalDateTime matPlanDate; + } \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/PartExcelVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/PartExcelVO.java new file mode 100644 index 0000000..6f2b1b8 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplan/vo/PartExcelVO.java @@ -0,0 +1,56 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat; +import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * BOM Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免BOM导入有问题 +public class PartExcelVO { + @ExcelProperty("工序名称") + private String procedureName; + + + @ExcelProperty("项目名称") + private String projectName; + + @ExcelProperty("子项目名称") + private String projectSubName; + @ExcelProperty("客户简码") + private String customerName; + @ExcelProperty("零件名称") + private String materialName; + + @ExcelProperty("材质") + private String compositionName; + + @ExcelProperty("数量") + private Integer amount; + + + @ExcelProperty("要求完成日期") + private String boomArriveDates; + + @ExcelProperty("要求说明") + private String description; + @ExcelProperty("重量(T)") + private BigDecimal matWeight; + @ExcelProperty("责任人") + private String nickname; + @ExcelProperty("物料需求单号") + private String projectMaterialPlanNo; +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/MaterialPlanBoomController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/MaterialPlanBoomController.java index 4322de7..742a8d0 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/MaterialPlanBoomController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/MaterialPlanBoomController.java @@ -112,6 +112,12 @@ public class MaterialPlanBoomController { PageResult<ProcessBomDetailDO> pageResult = materialPlanBoomService.getProcessBoomDetailList(pageReqVO); return success(BeanUtils.toBean(pageResult, ProcessBomDetailDO.class)); } - + @GetMapping("/pages") + @Operation(summary = "获得物料需求计划加工件明细分页") + @PreAuthorize("@ss.hasPermission('heli:material-plan-boom:query')") + public CommonResult<PageResult<MaterialPlanBoomDO>> getMaterialPlanBoomPages(@Valid ProcessBoomPageReqVO pageReqVO) { + PageResult<MaterialPlanBoomDO> pageResult = materialPlanBoomService.getMaterialPlanBoomPages(pageReqVO); + return success(BeanUtils.toBean(pageResult, MaterialPlanBoomDO.class)); + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/vo/ProcessBoomPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/vo/ProcessBoomPageReqVO.java index 1a4a89c..6c0567d 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/vo/ProcessBoomPageReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/materialplanboom/vo/ProcessBoomPageReqVO.java @@ -27,4 +27,6 @@ public class ProcessBoomPageReqVO extends PageParam { @Schema(description = "生产计划子项目编号") private String projectSubCode; + @Schema(description = "物料需求计划id") + private String projectMaterialPlanId; } \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/ProcessBomController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/ProcessBomController.java index 4d5d6bd..b15edf6 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/ProcessBomController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/ProcessBomController.java @@ -12,9 +12,12 @@ import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService; +import com.chanko.yunxi.mes.module.heli.controller.admin.plantask.vo.PlanTaskPageReqVO; +import com.chanko.yunxi.mes.module.heli.controller.admin.plantask.vo.PlanTaskRespVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.*; import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; @@ -230,4 +233,35 @@ public class ProcessBomController { processBomService.deleteProcessBomDetailNew(id); return success(true); } + @GetMapping("/getStandardPage") + @Operation(summary = "获得标准件物料需求计划") + @PreAuthorize("@ss.hasPermission('heli:process-bom:query')") + public CommonResult<PageResult<ProcessBomDetailDO>> getStandardPage(@Valid ProcessBomPageReqVO pageReqVO) { + PageResult<ProcessBomDetailDO> pageResult = processBomService.getStandardPage(pageReqVO); + return success(pageResult); + } + @PostMapping("/submit") + @Operation(summary = "提交") + @PreAuthorize("@ss.hasPermission('heli:process-bom:create')") + public CommonResult<Boolean> submit(@Valid @RequestBody List<ProcessBomDetailDO> list) { + return success(processBomService.submit(list)); + } + @GetMapping("/withdraw") + @Operation(summary = "撤回") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:process-bom:query')") + public CommonResult<Boolean> withdraw(@RequestParam("code") String code) { + return processBomService.withdraw(code); + } + @GetMapping("/exportStandard") + @Operation(summary = "导出标准件物料需求计划Excel") + @OperateLog(type = EXPORT) + public void exportStandard(@Valid ProcessBomPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List<ProcessBomDetailDO> list = processBomService.getStandardPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "标准件物料需求计划.xlsx", "数据", ProcessBomExcelVO.class, + BeanUtils.toBean(list, ProcessBomExcelVO.class)); + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomExcelVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomExcelVO.java new file mode 100644 index 0000000..0934ea3 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomExcelVO.java @@ -0,0 +1,59 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat; +import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert; +import com.chanko.yunxi.mes.module.system.enums.DictTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * BOM Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免BOM导入有问题 +public class ProcessBomExcelVO { + + @ExcelProperty("客户简称") + private String customerName; + + @ExcelProperty("项目名称") + private String projectName; + + @ExcelProperty("子项目名称") + private String projectSubName; + + @ExcelProperty("零件名称") + private String materialName; + + @ExcelProperty("材质") + private String compositionName; + + @ExcelProperty("规格型号") + private String spec; + + @ExcelProperty("图号") + private String blueprintNo; + + @ExcelProperty("数量") + private Integer amount; + + @ExcelProperty(value = "单位", converter = DictConvert.class) + @DictFormat("heli_material_unit") + private String unit; + @ExcelProperty("要求完成日期") + private String boomArriveDates; + + @ExcelProperty("责任人") + private String nickname; + @ExcelProperty("物料需求单号") + private String projectMaterialPlanNo; +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomPageReqVO.java index e170444..cb1faca 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomPageReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/processbom/vo/ProcessBomPageReqVO.java @@ -60,7 +60,13 @@ public class ProcessBomPageReqVO extends PageParam { @Schema(description = "项目名称") private String projectName; + @Schema(description = "零件名称") + private String materialName; + @Schema(description = "责任人") + private String ownerName; + @Schema(description = "物料需求单号") + private String projectMaterialPlanNo; @Schema(description = "审核人") private Long userId; diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplan/MaterialPlanDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplan/MaterialPlanDO.java index a2c9bf6..c547348 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplan/MaterialPlanDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplan/MaterialPlanDO.java @@ -68,6 +68,14 @@ public class MaterialPlanDO extends BaseDO { * 备注 */ private String description; + /** + * 客户id + */ + private Long customerId; + /** + * 客户简称 + */ + private String brief; /** * 生产计划单号 @@ -77,7 +85,30 @@ public class MaterialPlanDO extends BaseDO { /** * 项目名称 */ - @TableField(exist = false) private String projectName; + /** + * 项目简码 + */ + private String projectNameSim; + /** + * 需求计划类型 + */ + private Integer matType; + /** + * 子项目id + */ + private Long projectPlanSubId; + /** + * 子项目名称 + */ + private String name; + /** + * 子项目简码 + */ + private String nameSim; + /** + * 制单日期 + */ + private Date matPlanDate; } \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplanboom/MaterialPlanBoomDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplanboom/MaterialPlanBoomDO.java index 460a6a5..1a8c07c 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplanboom/MaterialPlanBoomDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/materialplanboom/MaterialPlanBoomDO.java @@ -53,6 +53,42 @@ public class MaterialPlanBoomDO extends BaseDO { * 备注 */ private String description; + /** + * 物料名称 + */ + private String matName; + /** + * 责任人id + */ + private Long duEmpId; + /** + * 采购or库存(0 -采购 1- 库存) + */ + private Integer isPurYard; + /** + * 需求状态(0-待送审 1 -已送审 2-已批准 3-已打回) + */ + private Integer mplanStatus; + /** + * 采购单id + */ + private Long projectPurchaseOrderMakeId; + /** + * 采购单号 + */ + private String purchaseNo; + /** + * 采购单明细id + */ + private Long projectPurchaseOrderMakeDetailId; + /** + * 物料id + */ + private Long materialId; + /** + * 零件重量 + */ + private BigDecimal matWeight; @TableField(exist = false) private String materialName; @TableField(exist = false) @@ -69,5 +105,7 @@ public class MaterialPlanBoomDO extends BaseDO { private Long compositionId; @TableField(exist = false) private String projectMaterialPlanNo; + @TableField(exist = false) + private String nickname; } \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plan/PlanDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plan/PlanDO.java index 426beb5..c461ee4 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plan/PlanDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/plan/PlanDO.java @@ -116,7 +116,9 @@ public class PlanDO extends BaseDO { *要求设计结束日期 * */ private LocalDateTime changeEndTime; + @TableField(exist = false) private String name; + @TableField(exist = false) private String brief; /** * 子项目id diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processbom/ProcessBomDetailDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processbom/ProcessBomDetailDO.java index 137fc6c..8851416 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processbom/ProcessBomDetailDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processbom/ProcessBomDetailDO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import lombok.*; +import org.apache.poi.hpsf.Date; import org.apache.poi.hpsf.Decimal; import java.math.BigDecimal; @@ -78,6 +79,10 @@ public class ProcessBomDetailDO extends BaseDO { * 备注 */ private String remark; + /** + * 其他件物料编码 + */ + private String otherMaterialCode; /** * 状态,1表示正常,2表示禁用 */ @@ -104,6 +109,13 @@ public class ProcessBomDetailDO extends BaseDO { * 操作次数 * */ private Integer bomOperateCount; + private Long duEmpId; + private Integer mplanStatus; + /* + *操作时间 + * */ + private LocalDateTime mplanDate; + private Integer isPurYard; /* *操作时间 @@ -151,4 +163,25 @@ public class ProcessBomDetailDO extends BaseDO { private BigDecimal price; @TableField(exist = false) private String matUnitId; + @TableField(exist = false) + private String customerName; + @TableField(exist = false) + private String projectName; + @TableField(exist = false) + private String projectSubName; + @TableField(exist = false) + private LocalDateTime boomArriveDate; + @TableField(exist = false) + private String boomArriveDates; + private String projectMaterialPlanNo; + @TableField(exist = false) + private Long projectId; + @TableField(exist = false) + private Long customerId; + @TableField(exist = false) + private String nameSim; + @TableField(exist = false) + private String projectNameSim; + @TableField(exist = false) + private String nickname; } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processdesign/ProcessDesignDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processdesign/ProcessDesignDO.java index 796fc2d..3a171bb 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processdesign/ProcessDesignDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/processdesign/ProcessDesignDO.java @@ -151,5 +151,6 @@ public class ProcessDesignDO extends BaseDO { @TableField(exist = false) private String blueprintLink; - + @TableField(exist = false) + private String brief; } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java index a2fc967..326ada5 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/taskdispatch/TaskDispatchDetailDO.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import io.swagger.v3.oas.models.security.SecurityScheme; import lombok.*; +import org.apache.poi.hpsf.Date; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -96,6 +97,9 @@ public class TaskDispatchDetailDO extends BaseDO { private Long dispatchType; private String postId; private String isOutsourcing; + private String projectMaterialPlanNo; + private Long projectMaterialPlanDetailId; + private Integer planStatus; /** * 工序状态 默认 已提交 已完成 0 1 2 */ @@ -157,7 +161,8 @@ public class TaskDispatchDetailDO extends BaseDO { @TableField(exist = false) private Integer wgType; - + @TableField(exist = false) + private Integer boomAmount; @TableField(exist = false) private String deviceName; @@ -194,4 +199,32 @@ public class TaskDispatchDetailDO extends BaseDO { @TableField(exist = false) private String nextProcedureName; + @TableField(exist = false) + private String customerName; + @TableField(exist = false) + private String compositionName; + @TableField(exist = false) + private String description; + @TableField(exist = false) + private LocalDateTime boomArriveDate; + @TableField(exist = false) + private String boomArriveDates; + @TableField(exist = false) + private Long projectSubId; + @TableField(exist = false) + private Long projectId; + @TableField(exist = false) + private Long planId; + @TableField(exist = false) + private Long customerId; + @TableField(exist = false) + private String nameSim; + @TableField(exist = false) + private String projectNameSim; + @TableField(exist = false) + private Long duEmpId; + @TableField(exist = false) + private BigDecimal matWeight; + @TableField(exist = false) + private String nickname; } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplan/MaterialPlanMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplan/MaterialPlanMapper.java index 912aa8a..455b3e4 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplan/MaterialPlanMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplan/MaterialPlanMapper.java @@ -8,6 +8,7 @@ import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; @@ -41,6 +42,23 @@ public interface MaterialPlanMapper extends BaseMapperX<MaterialPlanDO> { return selectPage(reqVO, query); } + + default PageResult<MaterialPlanDO> selectPages(MaterialPlanPageReqVO pageReqVO){ + MPJLambdaWrapper<MaterialPlanDO> query = new MPJLambdaWrapper<>(); + query.selectAll(MaterialPlanDO.class) + .leftJoin(MaterialPlanBoomDO.class, "b", MaterialPlanBoomDO::getProjectMaterialPlanId, MaterialPlanDO::getId) + .groupBy(MaterialPlanDO::getId) + .orderByDesc(MaterialPlanDO::getCreateTime); + query.like(!StringUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectName()),MaterialPlanDO::getProjectName, pageReqVO.getProjectName()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), MaterialPlanDO::getName, pageReqVO.getProjectSubName()) + .like(!StringUtils.isEmpty(pageReqVO.getMaterialName()), MaterialPlanBoomDO::getMatName, pageReqVO.getMaterialName()) + .eq(!StringUtils.isEmpty(pageReqVO.getMatType()), MaterialPlanDO::getMatType, pageReqVO.getMatType()); + + + + return selectPage(pageReqVO, query); + } // default PageResult<MaterialPlanDO> selectPage(MaterialPlanPageReqVO reqVO) { // return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanDO>() // .eqIfPresent(MaterialPlanDO::getId, reqVO.getId()) diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplanboom/MaterialPlanBoomMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplanboom/MaterialPlanBoomMapper.java index 75b6645..18d28e8 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplanboom/MaterialPlanBoomMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/materialplanboom/MaterialPlanBoomMapper.java @@ -13,6 +13,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.enums.BoomDetailTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum; +import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.*; @@ -70,6 +71,20 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO> List<MaterialPlanBoomDO> selectafterten(@Param("id") Long txrid, @Param("evday") String evday); + default PageResult<MaterialPlanBoomDO> getMaterialPlanBoomPages(ProcessBoomPageReqVO pageReqVO){ + MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>(); + query.selectAll(MaterialPlanBoomDO.class) + .select("a.nickname as nickname,b.spec as boomSpec") + .leftJoin(AdminUserDO.class, "a", AdminUserDO::getId, MaterialPlanBoomDO::getDuEmpId) + .leftJoin(ProcessBomDetailDO.class, "b", ProcessBomDetailDO::getId, MaterialPlanBoomDO::getBoomDetailId) + .orderByDesc(MaterialPlanBoomDO::getId) + .disableSubLogicDel() + ; + + query.eq(pageReqVO.getProjectMaterialPlanId() != null, MaterialPlanBoomDO::getProjectMaterialPlanId, pageReqVO.getProjectMaterialPlanId()); + return selectPage(pageReqVO,query); + } + // default PageResult<MaterialPlanBoomDO> selectPage(MaterialPlanBoomPageReqVO reqVO) { // return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanBoomDO>() // .eqIfPresent(MaterialPlanBoomDO::getId, reqVO.getId()) diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processbom/ProcessBomDetailMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processbom/ProcessBomDetailMapper.java index c97b547..5d7bc75 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processbom/ProcessBomDetailMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processbom/ProcessBomDetailMapper.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.controller.admin.equip.EquipController; import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomRespVO; import com.chanko.yunxi.mes.module.heli.controller.admin.plantaskbom.vo.PlanTaskBomPageReqVO; @@ -13,6 +14,8 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBo import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO; @@ -22,10 +25,13 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDeta import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO; +import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.bouncycastle.eac.EACCertificateBuilder; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.util.Arrays; @@ -39,7 +45,9 @@ import java.util.List; @Mapper public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO> { -// default List<ProcessBomDetailDO> selectListByBomId(Long bomId) { + + + // default List<ProcessBomDetailDO> selectListByBomId(Long bomId) { // // MPJLambdaWrapper<ProcessBomDetailDO> query = new MPJLambdaWrapper<>(); // @@ -186,4 +194,48 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO> .eq(ProcessBomDetailDO::getType,'1'); return selectPage(reqVO,query); } + + default PageResult<ProcessBomDetailDO> getStandardPage(ProcessBomPageReqVO pageReqVO){ + MPJLambdaWrapper<ProcessBomDetailDO> query = new MPJLambdaWrapper<>(); + query.selectAll(ProcessBomDetailDO.class) + .select( "c.brief as customerName", "b.project_name as projectName","b.project_name_sim as projectNameSim") + .select("d.name as projectSubName,d.id as projectSubId,d.name_sim as nameSim,f.name as compositionName") + .select("b.id as projectId,g.plan_id as planId,c.id as customerId") + .select("u.nickname as nickname") + .select("DATE_FORMAT(p.boom_arrive_date, '%Y-%m-%d') AS boomArriveDates") + .select("p.boom_arrive_date as boomArriveDate,p.du_emp_id as duEmpId,h.project_material_plan_no as projectMaterialPlanNo") + .leftJoin(ProcessBomDO.class,"g",ProcessBomDO::getId,ProcessBomDetailDO::getBomId) + .leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, ProcessBomDO::getProjectId) + .leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId) + .leftJoin(ProjectOrderSubDO.class, "d", ProjectOrderSubDO::getId, ProcessBomDO::getProjectSubId) + .leftJoin(CompositionDO.class,"f",CompositionDO::getId,ProcessBomDetailDO::getCompositionId) +// .leftJoin(MaterialPlanDO.class,"h",MaterialPlanDO::getProjectMaterialPlanNo,ProcessBomDetailDO::getProjectMaterialPlanNo) +// .leftJoin(MaterialPlanBoomDO.class,"p",MaterialPlanBoomDO::getBoomDetailId,ProcessBomDetailDO::getId) + .leftJoin("project_material_plan h on (h.project_material_plan_no = t.project_material_plan_no and h.deleted=0)") + .leftJoin("project_material_plan_boom p on (p.boom_detail_id = t.id and p.deleted=0)") + .leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,ProcessBomDetailDO::getDuEmpId) + .groupBy(ProcessBomDetailDO::getId) + .orderByDesc(ProcessBomDO::getId) + .disableSubLogicDel(); + + query + .like(!StringUtils.isEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName()) + .like(!StringUtils.isEmpty(pageReqVO.getMaterialName()), ProcessBomDetailDO::getMaterialName, pageReqVO.getMaterialName()) + .like(!StringUtils.isEmpty(pageReqVO.getOwnerName()), AdminUserDO::getNickname, pageReqVO.getOwnerName()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo()) + .eq(!StringUtils.isEmpty(pageReqVO.getStatus()), ProcessBomDetailDO::getMplanStatus, pageReqVO.getStatus()); +// .eq(MaterialPlanBoomDO::getDeleted,0) +// .eq(MaterialPlanDO::getDeleted,0); + if (ObjectUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo())) { + query.eq(ProcessBomDO::getBomStatus,"2") + .ne(ProjectOrderDO::getOrderStatus,"64") + .eq(ProcessBomDetailDO::getType,"1"); + ; + } + + + return selectPage(pageReqVO, query); + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java index dedc14f..afebf0d 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/processdesign/ProcessDesignMapper.java @@ -109,7 +109,7 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> { MPJLambdaWrapper<ProcessDesignDO> query = new MPJLambdaWrapper<>(); query.selectAll(ProcessDesignDO.class) .select("a.status as planStatus") - .select("a.plan_no as planCode","a.has_craft as hasCraft", "a.craft_start_date as craftStartDate", "a.craft_end_date as craftEndDate", "e.name as customerName") + .select("a.plan_no as planCode","a.has_craft as hasCraft", "a.craft_start_date as craftStartDate", "a.craft_end_date as craftEndDate", "e.name as customerName","e.brief as brief") .select("d.code as projectCode", "d.project_name as projectName", "d.business_line as businessLine", "d.property","d.is_urgency as isUrgency") .select("u1.nickname as projectOwnerName", "u2.nickname as craftOwnerName") .select("b.blank_date as blankDate", "b.two_dim_date as twoDimDate", "b.three_dim_date as threeDimDate") diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java index 87dfff1..fcdacfc 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/taskdispatch/TaskDispatchDetailMapper.java @@ -5,12 +5,17 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.MaterialPlanPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskDispatchDetailPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskDispatchDetailTotalVO; import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskPlanJDBaoBiaoPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.ygjx.vo.YgjxPageReqVO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.equipmanufacture.EquipManufactureDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; @@ -23,6 +28,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.beans.BeanUtils; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; @@ -674,4 +680,38 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail } + default PageResult<TaskDispatchDetailDO> getPartPage(MaterialPlanPageReqVO pageReqVO){ + MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>(); + query.selectAll(TaskDispatchDetailDO.class) + .select("f.name as compositionName,g.name as procedureName,d.amount as boomAmount") + .select("b.project_name_sim as projectNameSim,c.name_sim as nameSim") + .select("b.id as projectId,i.plan_id as planId,c.id as customerId,d.id as bomDetailId") + .select( "b.project_name as projectName", "c.name as projectSubName") + .select("d.material_name as materialName,DATE_FORMAT(p.boom_arrive_date, '%Y-%m-%d') AS boomArriveDates") + .select("e.brief as customerName,u.nickname as nickname,c.id as projectSubId") + .select("p.boom_arrive_date as boomArriveDate,p.du_emp_id as duEmpId,p.description as description,p.mat_weight as matWeight") + .leftJoin(TaskDispatchDO.class, "a", TaskDispatchDO::getId, TaskDispatchDetailDO::getDispatchId) + .leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, TaskDispatchDO::getProjectId) + .leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId) + .leftJoin(ProcessBomDetailDO.class, "d", ProcessBomDetailDO::getId, TaskDispatchDO::getBomDetailId) + .leftJoin(ProcessBomDO.class,"i",ProcessBomDO::getId,ProcessBomDetailDO::getBomId) + .leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId) + .leftJoin(CompositionDO.class,"f",CompositionDO::getId,ProcessBomDetailDO::getCompositionId) + .leftJoin("project_material_plan h on (h.project_material_plan_no = t.project_material_plan_no and h.deleted=0)") + .leftJoin("project_material_plan_boom p on (p.id = t.project_material_plan_detail_id and p.deleted=0)") + .leftJoin(ProcedureDO.class, "g", ProcedureDO::getId, TaskDispatchDetailDO::getProcedureId) + .leftJoin("system_users u on (u.id=p.du_emp_id and u.deleted=0)") + .groupBy(TaskDispatchDetailDO::getId) + .disableSubLogicDel(); + + query + .like(!StringUtils.isEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName()) + .like(!StringUtils.isEmpty(pageReqVO.getMaterialName()), ProcessBomDetailDO::getMaterialName, pageReqVO.getMaterialName()) + .like(!StringUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo()) + .eq(!StringUtils.isEmpty(pageReqVO.getStatus()), TaskDispatchDetailDO::getPlanStatus, pageReqVO.getStatus()) + .eq( TaskDispatchDetailDO::getIsOutsourcing, "Y"); + return selectPage(pageReqVO, query); + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanService.java index 4b2a60b..05d409b 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanService.java @@ -1,55 +1,69 @@ -package com.chanko.yunxi.mes.module.heli.service.materialplan; - -import java.util.*; -import javax.validation.*; -import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.*; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; -import com.chanko.yunxi.mes.framework.common.pojo.PageResult; -import com.chanko.yunxi.mes.framework.common.pojo.PageParam; - -/** - * 物料需求计划 Service 接口 - * - * @author 管理员 - */ -public interface MaterialPlanService { - - /** - * 创建物料需求计划 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createMaterialPlan(@Valid MaterialPlanSaveReqVO createReqVO); - - /** - * 更新物料需求计划 - * - * @param updateReqVO 更新信息 - */ - void updateMaterialPlan(@Valid MaterialPlanSaveReqVO updateReqVO); - - /** - * 删除物料需求计划 - * - * @param id 编号 - */ - void deleteMaterialPlan(Long id); - - /** - * 获得物料需求计划 - * - * @param id 编号 - * @return 物料需求计划 - */ - MaterialPlanDO getMaterialPlan(Long id); - - /** - * 获得物料需求计划分页 - * - * @param pageReqVO 分页查询 - * @return 物料需求计划分页 - */ - PageResult<MaterialPlanDO> getMaterialPlanPage(MaterialPlanPageReqVO pageReqVO); - -} \ No newline at end of file +package com.chanko.yunxi.mes.module.heli.service.materialplan; + +import java.util.*; +import javax.validation.*; + +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.TaskDispatchController; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; + +/** + * 物料需求计划 Service 接口 + * + * @author 管理员 + */ +public interface MaterialPlanService { + + /** + * 创建物料需求计划 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaterialPlan(@Valid MaterialPlanSaveReqVO createReqVO); + + /** + * 更新物料需求计划 + * + * @param updateReqVO 更新信息 + */ + void updateMaterialPlan(@Valid MaterialPlanSaveReqVO updateReqVO); + + /** + * 删除物料需求计划 + * + * @param id 编号 + */ + void deleteMaterialPlan(Long id); + + /** + * 获得物料需求计划 + * + * @param id 编号 + * @return 物料需求计划 + */ + MaterialPlanDO getMaterialPlan(Long id); + + /** + * 获得物料需求计划分页 + * + * @param pageReqVO 分页查询 + * @return 物料需求计划分页 + */ + PageResult<MaterialPlanDO> getMaterialPlanPage(MaterialPlanPageReqVO pageReqVO); + + PageResult<MaterialPlanDO> getMaterialPlanPages(MaterialPlanPageReqVO pageReqVO); + + CommonResult<Boolean> delMaterialPlan(Long id); + + PageResult<TaskDispatchDetailDO> getPartPage(MaterialPlanPageReqVO pageReqVO); + + Boolean submit(List<TaskDispatchDetailDO> list); + + CommonResult<Boolean> withdraw(String code); +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanServiceImpl.java index 4327c2c..955c556 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplan/MaterialPlanServiceImpl.java @@ -2,12 +2,20 @@ package com.chanko.yunxi.mes.module.heli.service.materialplan; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.framework.common.util.object.ObjectUtils; import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils; import com.chanko.yunxi.mes.module.heli.dal.dataobject.attentiontodo.AttentiontodoDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; import com.chanko.yunxi.mes.module.heli.dal.mysql.attentiontodo.AttentiontodoMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper; import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.system.api.user.AdminUserApi; @@ -15,11 +23,13 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.dal.mysql.user.AdminUserMapper; import com.chanko.yunxi.mes.module.system.service.user.AdminUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; @@ -60,7 +70,13 @@ public class MaterialPlanServiceImpl implements MaterialPlanService { @Resource private AdminUserService adminUserService; @Resource + private MaterialPlanBoomMapper materialPlanBoomMapper; + @Resource private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper; + @Resource + private ProcessBomDetailMapper processBomDetailMapper; + @Resource + private TaskDispatchDetailMapper taskDispatchDetailMapper; @Override public Long createMaterialPlan(MaterialPlanSaveReqVO createReqVO) { // 插入 @@ -197,5 +213,116 @@ public class MaterialPlanServiceImpl implements MaterialPlanService { public PageResult<MaterialPlanDO> getMaterialPlanPage(MaterialPlanPageReqVO pageReqVO) { return materialPlanMapper.selectPage(pageReqVO); } + @Override + public PageResult<MaterialPlanDO> getMaterialPlanPages(MaterialPlanPageReqVO pageReqVO) { + return materialPlanMapper.selectPages(pageReqVO); + } + + @Override + public CommonResult<Boolean> delMaterialPlan(Long id) { + MaterialPlanDO planDO = materialPlanMapper.selectById(id); + if(ObjectUtil.isEmpty(planDO)) return CommonResult.error(400,"该物料需求单号不存在,请确认!"); + LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId()); + queryWrapper.in(MaterialPlanBoomDO::getMplanStatus,1,2,3); + if (materialPlanBoomMapper.selectCount(queryWrapper) > 0)return CommonResult.error(400,"该物料需求计划已送审,不允许删除,请确认!"); + LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId()); + if (planDO.getMatType()==0){ + LambdaUpdateWrapper<ProcessBomDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(ProcessBomDetailDO::getProjectMaterialPlanNo, planDO.getProjectMaterialPlanNo()); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getProjectMaterialPlanNo, null); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getDuEmpId, null); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getMplanStatus,0); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getMplanDate,null); + processBomDetailMapper.update(lambdaUpdateWrapper); + }else { + LambdaUpdateWrapper<TaskDispatchDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(TaskDispatchDetailDO::getProjectMaterialPlanNo, planDO.getProjectMaterialPlanNo()); + lambdaUpdateWrapper.set(TaskDispatchDetailDO::getProjectMaterialPlanNo, null); + lambdaUpdateWrapper.set(TaskDispatchDetailDO::getPlanStatus,0); + lambdaUpdateWrapper.set(TaskDispatchDetailDO::getProjectMaterialPlanDetailId,null); + taskDispatchDetailMapper.update(lambdaUpdateWrapper); + } + materialPlanBoomMapper.delete(queryWrapper1); + materialPlanMapper.deleteById(planDO.getId()); + return CommonResult.success(true); + } + + @Override + public PageResult<TaskDispatchDetailDO> getPartPage(MaterialPlanPageReqVO pageReqVO) { + return taskDispatchDetailMapper.getPartPage(pageReqVO); + } + + @Override + @Transactional + public Boolean submit(List<TaskDispatchDetailDO> list) { + TaskDispatchDetailDO detailDO = list.get(0); + MaterialPlanDO planDO = new MaterialPlanDO(); + SerialNumberDO serialNumberDO = new SerialNumberDO(); + serialNumberDO = serialNumberService.getSerialNumber(MATERIAL_PLAN.name(), new SimpleDateFormat("yyyyMMdd").format(new Date())); + serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1); + planDO.setProjectMaterialPlanNo(MATERIAL_PLAN.getCode(serialNumberDO.getSerialNumber().toString())); + planDO.setProjectId(detailDO.getProjectId()); + planDO.setProjectPlanId(detailDO.getPlanId()); + planDO.setCustomerId(detailDO.getCustomerId()); + planDO.setBrief(detailDO.getCustomerName()); + planDO.setProjectName(detailDO.getProjectName()); + planDO.setProjectNameSim(detailDO.getProjectNameSim()); + planDO.setMatType(1); + planDO.setProjectPlanSubId(detailDO.getProjectSubId()); + planDO.setName(detailDO.getProjectSubName()); + planDO.setNameSim(detailDO.getNameSim()); + planDO.setMatPlanDate(new Date()); + materialPlanMapper.insert(planDO); + // 回写序列记录 + serialNumberService.updateSerialNumber(serialNumberDO); + List<MaterialPlanBoomDO> materialPlanBoomDOList = new ArrayList<>(); + for (TaskDispatchDetailDO taskDispatchDetailDO : list) { + MaterialPlanBoomDO boomDO = new MaterialPlanBoomDO(); + boomDO.setProjectMaterialPlanId(planDO.getId()); + boomDO.setBoomDetailId(taskDispatchDetailDO.getBomDetailId()); + boomDO.setBoomAmount(new BigDecimal(taskDispatchDetailDO.getBoomAmount())); + boomDO.setBoomArriveDate(taskDispatchDetailDO.getBoomArriveDate()); + boomDO.setMatName(taskDispatchDetailDO.getMaterialName()); + boomDO.setDuEmpId(taskDispatchDetailDO.getDuEmpId()); + boomDO.setProjectPlanSubId(taskDispatchDetailDO.getProjectSubId()); + boomDO.setMplanStatus(0); + boomDO.setMatWeight(taskDispatchDetailDO.getMatWeight()); + boomDO.setDescription(taskDispatchDetailDO.getDescription()); + materialPlanBoomMapper.insert(boomDO); + materialPlanBoomDOList.add(boomDO); + taskDispatchDetailDO.setProjectMaterialPlanDetailId(boomDO.getId()); + taskDispatchDetailDO.setPlanStatus(1); + taskDispatchDetailDO.setProjectMaterialPlanNo(planDO.getProjectMaterialPlanNo()); + } +// materialPlanBoomMapper.insertBatch(materialPlanBoomDOList); + taskDispatchDetailMapper.insertOrUpdateBatch(list); + return true; + } + + @Override + public CommonResult<Boolean> withdraw(String code) { + LambdaQueryWrapper<MaterialPlanDO> wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MaterialPlanDO::getProjectMaterialPlanNo, code); + wrapper.eq(MaterialPlanDO::getDeleted,0); + MaterialPlanDO planDO = materialPlanMapper.selectOne(wrapper); + if(ObjectUtil.isEmpty(planDO)) return CommonResult.error(400,"该物料需求单号不存在,请确认!"); + LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId()); + queryWrapper.in(MaterialPlanBoomDO::getMplanStatus,1,2,3); + if (materialPlanBoomMapper.selectCount(queryWrapper) > 0)return CommonResult.error(400,"该物料需求计划已送审,不允许撤回,请确认!"); + LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId()); + materialPlanBoomMapper.delete(queryWrapper1); + materialPlanMapper.deleteById(planDO.getId()); + LambdaUpdateWrapper<TaskDispatchDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(TaskDispatchDetailDO::getProjectMaterialPlanNo, code); + lambdaUpdateWrapper.set(TaskDispatchDetailDO::getProjectMaterialPlanNo, null); + lambdaUpdateWrapper.set(TaskDispatchDetailDO::getPlanStatus,0); + lambdaUpdateWrapper.set(TaskDispatchDetailDO::getProjectMaterialPlanDetailId,null); + taskDispatchDetailMapper.update(lambdaUpdateWrapper); + return CommonResult.success(true); + } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomService.java index 278c148..3391b35 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomService.java @@ -57,4 +57,5 @@ public interface MaterialPlanBoomService { PageResult<ProcessBomDetailDO> getProcessBoomDetailList(ProcessBoomPageReqVO pageReqVO); + PageResult<MaterialPlanBoomDO> getMaterialPlanBoomPages(ProcessBoomPageReqVO pageReqVO); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomServiceImpl.java index b04ae36..c7e99d9 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/materialplanboom/MaterialPlanBoomServiceImpl.java @@ -154,4 +154,9 @@ public class MaterialPlanBoomServiceImpl implements MaterialPlanBoomService { return processBomDetailDOPageResult; } + @Override + public PageResult<MaterialPlanBoomDO> getMaterialPlanBoomPages(ProcessBoomPageReqVO pageReqVO) { + return materialPlanBoomMapper.getMaterialPlanBoomPages(pageReqVO); + } + } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomService.java index 80fe2c8..2b01588 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomService.java @@ -1,5 +1,6 @@ package com.chanko.yunxi.mes.module.heli.service.processbom; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO; @@ -91,4 +92,10 @@ public interface ProcessBomService { void deleteProcessBomDetailNew(Long id); ProcessBomDetailDO selectProcessBomDetail(Long id); void updateProcessBomDetail(ProcessBomDetailDO processBomDetailDO); + + PageResult<ProcessBomDetailDO> getStandardPage(ProcessBomPageReqVO pageReqVO); + + Boolean submit(List<ProcessBomDetailDO> list); + + CommonResult<Boolean> withdraw(String code); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomServiceImpl.java index 4479eea..aab3119 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processbom/ProcessBomServiceImpl.java @@ -4,10 +4,12 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.generator.IFill; import com.chanko.yunxi.mes.framework.common.enums.BomEditStatusEnum; import com.chanko.yunxi.mes.framework.common.enums.StatusEnum; import com.chanko.yunxi.mes.framework.common.exception.ErrorCode; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; @@ -23,14 +25,18 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthing import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantaskbom.PlanTaskBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.shenhe.ShenheDO; import com.chanko.yunxi.mes.module.heli.dal.mysql.attentiontodo.AttentiontodoMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplan.MaterialPlanMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plantask.PlanTaskMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; @@ -41,6 +47,7 @@ import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoServi import com.chanko.yunxi.mes.module.heli.service.composition.CompositionService; import com.chanko.yunxi.mes.module.heli.service.material.MaterialService; import com.chanko.yunxi.mes.module.heli.service.plantaskbom.PlanTaskBomService; +import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.system.api.user.AdminUserApi; import com.chanko.yunxi.mes.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import com.chanko.yunxi.mes.module.system.dal.dataobject.dict.DictDataDO; @@ -63,12 +70,14 @@ import java.io.IOException; import java.io.Serializable; import java.math.BigDecimal; import java.rmi.RemoteException; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.error; +import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.MATERIAL_PLAN; import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; /** @@ -108,6 +117,12 @@ public class ProcessBomServiceImpl implements ProcessBomService { private AdminUserService adminUserService; @Resource private PlanMapper planMapper; + @Resource + private SerialNumberService serialNumberService; + @Resource + private MaterialPlanMapper materialPlanMapper; + @Resource + private MaterialPlanBoomMapper materialPlanBoomMapper; @Override @Transactional(rollbackFor = Exception.class) public Long createProcessBom(ProcessBomSaveReqVO createReqVO) { @@ -987,6 +1002,82 @@ public class ProcessBomServiceImpl implements ProcessBomService { public void updateProcessBomDetail(ProcessBomDetailDO processBomDetailDO){ processBomDetailMapper.updateById(processBomDetailDO); } + + @Override + public PageResult<ProcessBomDetailDO> getStandardPage(ProcessBomPageReqVO pageReqVO) { + return processBomDetailMapper.getStandardPage(pageReqVO); + } + + @Override + public Boolean submit(List<ProcessBomDetailDO> list) { + ProcessBomDetailDO detailDO = list.get(0); + MaterialPlanDO planDO = new MaterialPlanDO(); + SerialNumberDO serialNumberDO = new SerialNumberDO(); + serialNumberDO = serialNumberService.getSerialNumber(MATERIAL_PLAN.name(), new SimpleDateFormat("yyyyMMdd").format(new Date())); + serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1); + planDO.setProjectMaterialPlanNo(MATERIAL_PLAN.getCode(serialNumberDO.getSerialNumber().toString())); + planDO.setProjectId(detailDO.getProjectId()); + planDO.setProjectPlanId(detailDO.getPlanId()); + planDO.setCustomerId(detailDO.getCustomerId()); + planDO.setBrief(detailDO.getCustomerName()); + planDO.setProjectName(detailDO.getProjectName()); + planDO.setProjectNameSim(detailDO.getProjectNameSim()); + planDO.setMatType(0); + planDO.setProjectPlanSubId(detailDO.getProjectSubId()); + planDO.setName(detailDO.getProjectSubName()); + planDO.setNameSim(detailDO.getNameSim()); + planDO.setMatPlanDate(new Date()); + materialPlanMapper.insert(planDO); + + // 回写序列记录 + serialNumberService.updateSerialNumber(serialNumberDO); + List<MaterialPlanBoomDO> materialPlanBoomDOList = new ArrayList<>(); + for (ProcessBomDetailDO processBomDetailDO : list) { + MaterialPlanBoomDO boomDO = new MaterialPlanBoomDO(); + boomDO.setProjectMaterialPlanId(planDO.getId()); + boomDO.setBoomDetailId(processBomDetailDO.getId()); + boomDO.setBoomAmount(new BigDecimal(processBomDetailDO.getAmount())); + boomDO.setBoomArriveDate(processBomDetailDO.getBoomArriveDate()); + boomDO.setMatName(processBomDetailDO.getMaterialName()); + boomDO.setDuEmpId(processBomDetailDO.getDuEmpId()); + boomDO.setProjectPlanSubId(processBomDetailDO.getProjectSubId()); + boomDO.setMaterialId(processBomDetailDO.getMaterialId()); + boomDO.setMplanStatus(0); + materialPlanBoomDOList.add(boomDO); + processBomDetailDO.setMplanDate(processBomDetailDO.getBoomArriveDate()); + processBomDetailDO.setMplanStatus(1); + processBomDetailDO.setProjectMaterialPlanNo(planDO.getProjectMaterialPlanNo()); + } + materialPlanBoomMapper.insertBatch(materialPlanBoomDOList); + processBomDetailMapper.insertOrUpdateBatch(list); + return true; + } + + @Override + public CommonResult<Boolean> withdraw(String code) { + LambdaQueryWrapper<MaterialPlanDO> wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MaterialPlanDO::getProjectMaterialPlanNo, code); + wrapper.eq(MaterialPlanDO::getDeleted,0); + MaterialPlanDO planDO = materialPlanMapper.selectOne(wrapper); + if(ObjectUtil.isEmpty(planDO)) return CommonResult.error(400,"该物料需求单号不存在,请确认!"); + LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId()); + queryWrapper.in(MaterialPlanBoomDO::getMplanStatus,1,2,3); + if (materialPlanBoomMapper.selectCount(queryWrapper) > 0)return CommonResult.error(400,"该物料需求计划已送审,不允许撤回,请确认!"); + LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId()); + materialPlanBoomMapper.delete(queryWrapper1); + materialPlanMapper.deleteById(planDO.getId()); + LambdaUpdateWrapper<ProcessBomDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(ProcessBomDetailDO::getProjectMaterialPlanNo, code); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getProjectMaterialPlanNo, null); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getDuEmpId, null); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getMplanStatus,0); + lambdaUpdateWrapper.set(ProcessBomDetailDO::getMplanDate,null); + processBomDetailMapper.update(lambdaUpdateWrapper); + return CommonResult.success(true); + } + private void createProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list,Integer num) { LocalDateTime now = LocalDateTime.now(); /*list.forEach(o -> {o.setBomId(bomId);o.setUpdateTimes(now);} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processdesign/ProcessDesignServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processdesign/ProcessDesignServiceImpl.java index 549fddc..2444837 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processdesign/ProcessDesignServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/processdesign/ProcessDesignServiceImpl.java @@ -390,7 +390,7 @@ public class ProcessDesignServiceImpl implements ProcessDesignService { BdgzsomthingDO.setThingname(thingname); // BdgzsomthingDO.setThings(things); BdgzsomthingDO.setAttr4("1"); - BdgzsomthingDO.setAttr6(processDesignDO.getCustomerName()); + BdgzsomthingDO.setAttr6(processDesignDO.getBrief()); BdgzsomthingDO.setAttr7(processDesignDO.getProjectName()); BdgzsomthingDO.setAttr8(processDesignDO.getProjectSubName()); BdgzsomthingDO.setAttr9(processDesignProgressDO.getRemark()); diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplan/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplan/index.ts index af2de45..abfd829 100644 --- a/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplan/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplan/index.ts @@ -1,44 +1,69 @@ -import request from '@/config/axios' - -export interface MaterialPlanVO { - id: number - projectMaterialPlanNo: string - projectId: number - projectPlanId: number - submitUserId: number - submitTime: Date - auditor: number - auditTime: Date - status: number - description: string -} - -// 查询物料需求计划分页 -export const getMaterialPlanPage = async (params) => { - return await request.get({ url: `/heli/material-plan/page`, params }) -} - -// 查询物料需求计划详情 -export const getMaterialPlan = async (id: number) => { - return await request.get({ url: `/heli/material-plan/get?id=` + id }) -} - -// 新增物料需求计划 -export const createMaterialPlan = async (data: MaterialPlanVO) => { - return await request.post({ url: `/heli/material-plan/create`, data }) -} - -// 修改物料需求计划 -export const updateMaterialPlan = async (data: MaterialPlanVO) => { - return await request.put({ url: `/heli/material-plan/update`, data }) -} - -// 删除物料需求计划 -export const deleteMaterialPlan = async (id: number) => { - return await request.delete({ url: `/heli/material-plan/delete?id=` + id }) -} - -// 导出物料需求计划 Excel -export const exportMaterialPlan = async (params) => { - return await request.download({ url: `/heli/material-plan/export-excel`, params }) -} \ No newline at end of file +import request from '@/config/axios' + + + + +export interface MaterialPlanVO { + id: number + projectMaterialPlanNo: string + projectId: number + projectPlanId: number + submitUserId: number + submitTime: Date + auditor: number + auditTime: Date + status: number + description: string +} + +// 查询物料需求计划分页 +export const getMaterialPlanPage = async (params) => { + return await request.get({ url: `/heli/material-plan/page`, params }) +} + +// 查询物料需求计划详情 +export const getMaterialPlan = async (id: number) => { + return await request.get({ url: `/heli/material-plan/get?id=` + id }) +} + +// 新增物料需求计划 +export const createMaterialPlan = async (data: MaterialPlanVO) => { + return await request.post({ url: `/heli/material-plan/create`, data }) +} + +// 修改物料需求计划 +export const updateMaterialPlan = async (data: MaterialPlanVO) => { + return await request.put({ url: `/heli/material-plan/update`, data }) +} + +// 删除物料需求计划 +export const deleteMaterialPlan = async (id: number) => { + return await request.delete({ url: `/heli/material-plan/delete?id=` + id }) +} + +// 导出物料需求计划 Excel +export const exportMaterialPlan = async (params) => { + return await request.download({ url: `/heli/material-plan/export-excel`, params }) +} +// 查询标准件物料需求计划管理分页 +export const getMaterialPlanPages = async (params) => { + return await request.get({ url: `/heli/material-plan/pages`, params }) +} +// 删除物料需求计划 +export const delMaterialPlan = async (id: number) => { + return await request.delete({ url: `/heli/material-plan/delMaterialPlan?id=` + id }) +} +// 查询物料需求计划分页 +export const getPartPage = async (params) => { + return await request.get({ url: `/heli/material-plan/getPartPage`, params }) +} +// 导出物料需求计划 Excel +export const exportPart = async (params) => { + return await request.download({ url: `/heli/material-plan/exportPart`, params }) +} +export const submitForm = async (data) => { + return await request.post({ url: `/heli/material-plan/submit`, data }) +} +export const withdraw = async (code) => { + return await request.get({ url: `/heli/material-plan/withdraw?code=` + code }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplanboom/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplanboom/index.ts index 1632378..43cb499 100644 --- a/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplanboom/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/materialplanboom/index.ts @@ -48,3 +48,6 @@ export const deleteMaterialPlanBoom = async (id: number) => { export const exportMaterialPlanBoom = async (params) => { return await request.download({ url: `/heli/material-plan-boom/export-excel`, params }) } +export const getMaterialPlanBoomPages = async (params) => { + return await request.get({ url: `/heli/material-plan-boom/pages`, params }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/processbom/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/processbom/index.ts index 830a259..41d6adc 100644 --- a/mes-ui/mes-ui-admin-vue3/src/api/heli/processbom/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/processbom/index.ts @@ -73,3 +73,19 @@ export const deleteProcessBomDetail = async (id: number) => { export async function operateProcessBom(data: ProcessBomVO) { return await request.post({ url: `/heli/process-bom/operate`, data }) } + +// 查询标准件物料需求计划 +export const getStandardPage = async (params) => { + return await request.get({ url: `/heli/process-bom/getStandardPage`, params }) +} +export const submitForm = async (data) => { + return await request.post({ url: `/heli/process-bom/submit`, data }) +} +export const withdraw = async (code) => { + return await request.get({ url: `/heli/process-bom/withdraw?code=` + code }) +} +// 导出工艺bom Excel +export const exportStandard = async (params) => { + return await request.download({ url: `/heli/process-bom/exportStandard`, params }) +} + diff --git a/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts b/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts index f0c7d0f..af17730 100644 --- a/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts +++ b/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts @@ -279,7 +279,11 @@ export enum DICT_TYPE { HELI_PG_PLANTYPE = 'heli_pg_planType',//生产进度报表中派工是否完成状态 HELI_GRADE='heli_grade', HELI_CGTYPE='heli_cgType', - HELI_PROJECT_LEADER='heli_project_leader' + HELI_PROJECT_LEADER='heli_project_leader', + HELI_MATERIAL_PLAN_BOOM_STATUS = 'heli_material_plan_boom_status',//物料需求计划标准件状态 + HELI_MAT_TYPE = 'heli_mat_type',//物料需求计划类型 + HELI_PROJECT_MATERIAL_PLAN_BOOM_STATUS='heli_project_material_plan_boom_status'//物料需求计划Boon状态 + } diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/management.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/management.vue new file mode 100644 index 0000000..3f4e63a --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/management.vue @@ -0,0 +1,180 @@ +<template> +<el-card class="hl-card"> + <template #header> + <span>物料需求计划管理</span> + </template> + <ContentWrap class="borderxx"> + <!-- 搜索工作栏 --> + <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="130px"> + <el-form-item label="需求计划单号" prop="projectMaterialPlanNo"> + <el-input v-model="queryParams.projectMaterialPlanNo" placeholder="物料计划单号" clearable @keyup.enter="handleQuery" + class="!w-240px" /> + </el-form-item> + <el-form-item label="项目名称" prop="projectName"> + <el-input v-model="queryParams.projectName" placeholder="项目名称" clearable @keyup.enter="handleQuery" + class="!w-240px" /> + </el-form-item> + <el-form-item label="子项目名称" prop="projectSubName"> + <el-input v-model="queryParams.projectSubName" placeholder="请输入子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="零件名称" prop="materialName"> + <el-input v-model="queryParams.materialName" placeholder="请输入零件名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item style="margin-left:15px"> + <el-button @click="handleQuery" type="primary"> + <Icon icon="ep:search" class="mr-5px" /> 搜索 + </el-button> + <el-button @click="resetQuery"> + <Icon icon="ep:refresh" class="mr-5px" /> 重置 + </el-button> + + </el-form-item> + </el-form> + </ContentWrap> + + <!-- 列表 --> + <ContentWrap> + <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table"> + <el-table-column label="序号" type="index" align="center" fixed min-width="70px" /> + <el-table-column label="物料需求计划单号" align="center" prop="projectMaterialPlanNo" min-width="180" fixed> + <template #default="scope"> + <el-button text type="primary" @click="openForm('detail', scope.row.id)"> + {{ scope.row.projectMaterialPlanNo }} + </el-button> + </template> + </el-table-column> + <el-table-column label="项目名称" align="center" prop="projectName" min-width="180px" /> + <el-table-column label="子项目名称" align="center" prop="name" min-width="180px" /> + <el-table-column label="客户简称" align="center" prop="brief" min-width="180px" /> + <el-table-column label="制单日期" align="center" prop="matPlanDate" :formatter="dateFormatter1" min-width="150" /> + <el-table-column label="需求计划类型" align="center" prop="matType" min-width="150"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.HELI_MAT_TYPE" :value="scope.row.matType" /> + </template> + </el-table-column> + <el-table-column label="操作" align="center" fixed="right" min-width="180"> + <template #default="scope"> + <el-button + link + type="danger" + @click="handleDelete(scope.row.id)" + > + 删除 + </el-button> + <el-button link type="primary" @click="openForm('detail', scope.row.id)"> + 详情信息 + </el-button> + </template> + </el-table-column> + </el-table> + <!-- 分页 --> + <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" + @pagination="getList" /> + </ContentWrap> + +</el-card> + +</template> + +<script setup lang="ts"> +import { DICT_TYPE } from '@/utils/dict' +import { dateFormatter1} from '@/utils/formatTime' +import * as MaterialPlanApi from '@/api/heli/materialplan' + + +defineOptions({ name: 'MaterialPlan' }) +const router = useRouter() +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 + +const loading = ref(true) // 列表的加载中 +const list = ref([]) // 列表的数据 +const total = ref(0) // 列表的总页数 +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + id: undefined, + projectMaterialPlanNo: undefined, + projectId: undefined, + projectPlanId: undefined, + submitUserId: undefined, + projectName: undefined, + projectSubName: undefined, + materialName:undefined, + submitTime: [], + auditor: undefined, + auditTime: [], + status: undefined, + description: undefined, + createTime: [], + matType:0, +}) +const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 + +/** 查询列表 */ +const getList = async () => { + loading.value = true + try { + const data = await MaterialPlanApi.getMaterialPlanPages(queryParams) + list.value = data.list + total.value = data.total + } finally { + loading.value = false + } +} + +/** 搜索按钮操作 */ +const handleQuery = () => { + queryParams.pageNo = 1 + getList() +} + +/** 重置按钮操作 */ +const resetQuery = () => { + queryFormRef.value.resetFields() + handleQuery() +} + +/** 添加/修改操作 */ + +const openForm = (type: string, id?: number) => { + + switch (type) { + case 'create': + router.push({ path: '/purchase/materialplanadd', query: { id: id } }) + break; + case 'update': + router.push({ path: '/purchase/materialplanedit', query: { id: id } }) + break; + case 'detail': + router.push({ path: '/purchase/managementdetail', query: { id: id } }) + break; + default: + break; + } + +} + +/** 删除按钮操作 */ +const handleDelete = async (id: number) => { + try { + // 删除的二次确认 + await message.delConfirm() + // 发起删除 + await MaterialPlanApi.delMaterialPlan(id) + message.success(t('common.delSuccess')) + // 刷新列表 + await getList() + } catch { } +} + + +const userInit = ref() +/** 初始化 **/ +onMounted(async () => { + //用户列表数据 + // userInit.value = await UserApi.getSimpleUserList() + getList() +}) +</script> diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/managementdetail.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/managementdetail.vue new file mode 100644 index 0000000..4370a74 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/managementdetail.vue @@ -0,0 +1,164 @@ +<template> + <el-card class="hl-card" style="position: relative"> + <template #header> + <span>详情页</span> + </template> + <el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading"> + <!-- 基础信息 --> + <el-card class="hl-card-info"> + <template #header> + <div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span> + </template> + + <el-row> + <el-col :span="24"> + <el-row> + + <el-col :span="6"> + <el-row> + <el-col :span="24"> + <el-form-item label="需求计划号" prop="projectMaterialPlanNo"> + <el-input class="!w-300px" placeholder="系统自动生成" v-model="formData.projectMaterialPlanNo" disabled /> + </el-form-item> + </el-col> + </el-row> + </el-col> + <el-col :span="6"> + <el-form-item label="项目名称" prop="projectName"> + <el-input class="!w-300px" placeholder="项目名称" v-model="formData.projectName" disabled /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="子项目名称" prop="name"> + <el-input class="!w-300px" placeholder="项目名称" v-model="formData.name" disabled /> + </el-form-item> + </el-col> + </el-row> + </el-col> + </el-row> + </el-card> + + <!-- 需求单信息 --> + <el-card class="hl-card-info"> + <template #header> + <div class="hl-card-info-icona"></div><span class="hl-card-info-text">需求单信息</span> + </template> + <el-row> + <el-col> + <el-card class="hl-incard"> + <el-table :data="formData.matBoomDOList" class="hl-table" v-loading="loading"> + <el-table-column type="index" label="序号" fixed align="center" min-width="60" /> + <el-table-column prop="matName" min-width="200" label="物料名称" align="center"/> + <el-table-column prop="nickname" min-width="120" label="责任人" align="center"/> + <el-table-column prop="boomAmount" min-width="100" label="需求数量" align="center"/> + <el-table-column prop="boomArriveDate" min-width="200" label="需求到货日期" align="center" :formatter="dateFormatter1"/> + <el-table-column prop="boomSpec" min-width="200" label="规格类型" align="center"/> + <el-table-column prop="mplanStatus" min-width="100" label="需求状态" align="center"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.HELI_PROJECT_MATERIAL_PLAN_BOOM_STATUS" :value="scope.row.mplanStatus" /> + </template> + </el-table-column> + <el-table-column prop="description" min-width="200" label="备注" align="center"/> + </el-table> + <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" + @pagination="getList" /> + </el-card> + </el-col> + </el-row> + </el-card> + </el-form> + <div class="hl-footer text-center"> + <el-button @click="closeForm" size="large">取 消</el-button> + </div> + </el-card> + + <!-- 表单弹窗:物料列表 --> +</template> +<script setup lang="ts"> +import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' +import * as MaterialPlanApi from '@/api/heli/materialplan' +import * as MaterialPlanDetailApi from '@/api/heli/materialplandetail' +import * as MaterialPlanBoomApi from '@/api/heli/materialplanboom' +import type { UploadUserFile } from 'element-plus' +import * as PlanApi from '@/api/heli/plan' +import * as PlanSubApi from '@/api/heli/plansub' +import * as ProjectOrderApi from '@/api/heli/projectorder' +import * as UserApi from '@/api/system/user' +import * as MaterialApi from '@/api/heli/material' +import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file' +import download from '@/utils/download' +import { getAccessToken, getTenantId } from '@/utils/auth' +import {dateFormatter, dateFormatter1, formatDate} from '@/utils/formatTime' +import { useUserStore } from '@/store/modules/user' +import { useTagsViewStore } from '@/store/modules/tagsView' +import MaterialSelect from '@/views/heli/hlvuestyle/materialSelect.vue' +import booms from './boom.vue' + +const reload: any = inject('reload') +const { t } = useI18n() // 国际化 +const message = useMessage() // 消息弹窗 +const { query } = useRoute() +const router = useRouter() +const tagsViewStore = useTagsViewStore() + +const dialogVisible = ref(false) // 弹窗的是否展示 +const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 +const formData = ref({ + id: undefined, + projectMaterialPlanNo: undefined, + projectId: undefined, + projectPlanId: undefined, + projectPlanNo: undefined, + projectCode: undefined, + auditor: undefined, + createTime: new Date(), + status: undefined, + description: undefined, + boomItemDOList: [], + boomItemRemoveList: [], + matBoomDOList: [], + matItemRemoveList: [], + attachments: [] +}) + +const formRef = ref() // 表单 Ref +const subFormRef = ref() // 表单 Ref +const loading = ref(true) // 列表的加载中 +const total = ref(0) // 列表的总页数 +const subBoomFormLoading = ref(false) +const subBoomFormRef = ref() + + + + + + +const closeForm = async () => { + router.push({ path: '/purchase/management' }) + tagsViewStore.delVisitedView(router.currentRoute.value) +} +const userList = ref<UserApi.UserVO[]>([]) // 用户列表 + +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + projectMaterialPlanId: query.id +}) +// 页面数据加载初始化 +onMounted(async () => { + // 获取物料需求计划信息 + formData.value = await MaterialPlanApi.getMaterialPlan(query.id) + getList(); +}) +const getList = async () => { + loading.value = true + try { + const data = await MaterialPlanBoomApi.getMaterialPlanBoomPages(queryParams) + formData.value.matBoomDOList = data.list + total.value = data.total + } finally { + loading.value = false + } +} + +</script> diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/part.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/part.vue new file mode 100644 index 0000000..b6f98d1 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/part.vue @@ -0,0 +1,281 @@ +<template> + <el-card class="hl-card"> + <template #header> + <span>零件物料需求计划</span> + </template> + <ContentWrap class="borderxx"> + <!-- 搜索工作栏 --> + <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px"> + <el-form-item label="项目名称" prop="projectName"> + <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="子项目名称" prop="projectSubName"> + <el-input v-model="queryParams.projectSubName" placeholder="请输入子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="零件名称" prop="materialName"> + <el-input v-model="queryParams.materialName" placeholder="请输入零件名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="领件状态" prop="status"> + <el-select v-model="queryParams.status" placeholder="请选择标准件状态" clearable class="!w-240px"> + <el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_MATERIAL_PLAN_BOOM_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item label="物料需求单号" prop="projectMaterialPlanNo"> + <el-input v-model="queryParams.projectMaterialPlanNo" placeholder="请输入物料需求单号" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item style="margin-left:30px"> + <el-button @click="handleQuery" type="primary"> + <Icon icon="ep:search" class="mr-5px" /> 搜索 + </el-button> + <el-button @click="resetQuery"> + <Icon icon="ep:refresh" class="mr-5px" /> 重置 + </el-button> + + <el-button + type="success" + plain + @click="handleExportDetail" + :loading="exportLoading" + > + <Icon icon="ep:download" class="mr-5px" /> 导出 + </el-button> + </el-form-item> + </el-form> + </ContentWrap> + + <!-- 列表 --> + <el-card class="hl-card-info"> + <template #header> + <div class="hl-card-info-icona"></div><span class="hl-card-info-text">零件明细</span> + </template> + <el-row> + <el-col> + <el-card class="hl-incard"> + <el-form ref="multipleTable" :model="list" v-loading="formLoading" label-width="0" > + <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" /> + <el-table-column fixed label="序号" align="center" type="index" width="60" /> + <el-table-column label="工序名称" align="center" prop="procedureName" min-width="180" > + <template #default="scope"> + <el-button text type="primary"> + {{ scope.row.procedureName }} + </el-button> + </template> + </el-table-column> + <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> + <el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" /> + <el-table-column label="客户简码" align="center" prop="customerName" min-width="150" /> + <el-table-column label="零件名称" align="center" prop="materialName" min-width="180" /> + <el-table-column label="材质" align="center" prop="compositionName" min-width="120" /> + <el-table-column label="数量" align="center" prop="boomAmount" min-width="120" /> + <el-table-column min-width="200px" align="center" > + <template #header><span class="hl-table_header">*</span>要求完成日期</template> + <template #default="{ row, $index }"> + <el-form-item :prop="`${$index}.boomArriveDate`" class="mb-0px!" > + <el-date-picker class="!w-265px" v-model="row.boomArriveDate" type="date" value-format="x" placeholder="要求完成日期" /> + </el-form-item> + </template> + </el-table-column> + <el-table-column min-width="200px" align="center" > + <template #header>要求说明</template> + <template #default="{ row, $index }"> + <el-form-item :prop="`${$index}.description`" class="mb-0px!" > + <el-input class="!w-265px" v-model="row.description" placeholder="要求说明" /> + </el-form-item> + </template> + </el-table-column> + <el-table-column min-width="200px" align="center"> + <template #header>重量(T)</template> + <template #default="{ row, $index }"> + <el-form-item :prop="`${$index}.matWeight`" class="mb-0px!" > + <el-input-number v-model="row.matWeight" type="number" :precision="2" /> + </el-form-item> + </template> + </el-table-column> + <el-table-column min-width="200px" align="center" > + <template #header><span class="hl-table_header">*</span>责任人</template> + <template #default="{ row, $index }"> + <el-form-item :prop="`${$index}.duEmpId`" class="mb-0px!" > + <UserSelect v-model="row.duEmpId" class="!w-265px" clearable @update:newValue="handleSelectedUser($index, $event)"/> + </el-form-item> + </template> + </el-table-column> + <el-table-column label="物料需求单号" align="center" prop="projectMaterialPlanNo" min-width="180" /> + <el-table-column label="操作" align="center" fixed="right" min-width="120"> + <template #default="scope"> + <el-button link type="primary" @click="singleSubmission(scope.row)"> + 提交 + </el-button> + </template> + </el-table-column> + </el-table> + <!-- 分页 --> + <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" /> + </el-form> + </el-card> + </el-col> + </el-row> + </el-card> + <div class="hl-footer text-center"> + <el-button @click="submitForm()" type="success" size="large">全部提交</el-button> + <el-button style="margin-left: 20px" @click="withdraw()" type="danger" size="large">撤回</el-button> + </div> + </el-card> +</template> + +<script setup lang="ts"> +import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' +import download from '@/utils/download' +import * as ProcessBomApi from '@/api/heli/processbom' +import { useCommonStateWithOut } from '@/store/modules/common' +import UserSelect from "@/views/heli/hlvuestyle/userSelect.vue"; +import {inject, ref} from "vue"; +import * as MaterialPlanApi from "@/api/heli/materialplan"; +import {ElTable} from "element-plus"; +const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 + +defineOptions({ name: 'standard' }) +const reload: any = inject('reload') +const commonStore = useCommonStateWithOut() +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 +const router = useRouter() +const multipleTable = ref<InstanceType<typeof ElTable>>() +const multipleSelection = ref([]) +const loading = ref(true) // 列表的加载中 +const list = ref([]) // 列表的数据 +const total = ref(0) // 列表的总页数 +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + code: undefined, + planCode: undefined, + projectCode: undefined, + customerName: undefined, + projectName: undefined, + projectSubName: undefined, + version: undefined, + bomStatus: undefined, + remark: undefined, + status: 0, + createTime: [], + ownerName:undefined, + materialName:undefined, + projectMaterialPlanNo:undefined +}) +const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 + +/** 查询列表 */ +const getList = async () => { + loading.value = true + try { + const data = await MaterialPlanApi.getPartPage(queryParams) + list.value = data.list + total.value = data.total + } finally { + loading.value = false + } +} +/** 导出按钮操作 */ +const handleExportDetail = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await MaterialPlanApi.exportPart(queryParams) + download.excel(data, '零件物料需求计划.xlsx') + } catch { + } finally { + exportLoading.value = false + } +} + +const handleSelectionChange = (val) => { + if (val.length > 1) { + // multipleTable.value.clearSelection() + multipleTable.value=val + } else { + multipleSelection.value = val.pop() + } +} +/** 搜索按钮操作 */ +const handleQuery = () => { + queryParams.pageNo = 1 + getList() +} +const handleSelectedUser = (currentIndex, newValue: any) => { + list.value[currentIndex].duEmpId = newValue?.id +} +const singleSubmission= (val) =>{ + multipleTable.value=[] + multipleTable.value.push(val) + submitForm(); +} +const submitForm = async () => { + const list= multipleTable.value; + if (list.length <= 0) { + message.error("提交明细不能为空,请确认"); + return; + } + const firstProjectSubId = list[0].projectSubId; + for (let i = 1; i < list.length; i++) { + if (list[i].projectSubId !== firstProjectSubId) { + message.error("零件明细不属于同一个子项目,请确认"); + return; + } + } + + for (let i = 0; i < list.length; i++) { + if (list[i].projectMaterialPlanNo!=null){ + message.error("零件"+list[i].materialName+"已生成物料需求计划,请确认") + return + } + if (list[i].boomArriveDate==null){ + message.error("零件"+list[i].materialName+"要求完成日期为空,请确认") + return + } + if (list[i].duEmpId==null){ + message.error("零件"+list[i].materialName+"责任人为空,请确认") + return + } + } + formLoading.value = true + try { + await MaterialPlanApi.submitForm(list) + message.success("提交成功") + // 发送操作成功的事件 + getList() + emit('success') + } finally { + formLoading.value = false + } +} +const withdraw = async () => { + if (queryParams.projectMaterialPlanNo==null){ + message.error("物料需求单号为空,不允许撤回") + return + + } + await MaterialPlanApi.withdraw(queryParams.projectMaterialPlanNo) + message.success("撤回成功") + // 发送操作成功的事件 + getList() + emit('success') + +} +/** 重置按钮操作 */ +const resetQuery = () => { + queryFormRef.value.resetFields() + handleQuery() +} + +/** 初始化 **/ +onMounted(() => { + getList() +}) +</script> +<style> +/* 占位样式 */ +</style> diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/partmanagement.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/partmanagement.vue new file mode 100644 index 0000000..69d66b6 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/partmanagement.vue @@ -0,0 +1,180 @@ +<template> +<el-card class="hl-card"> + <template #header> + <span>物料需求计划管理</span> + </template> + <ContentWrap class="borderxx"> + <!-- 搜索工作栏 --> + <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="130px"> + <el-form-item label="需求计划单号" prop="projectMaterialPlanNo"> + <el-input v-model="queryParams.projectMaterialPlanNo" placeholder="物料计划单号" clearable @keyup.enter="handleQuery" + class="!w-240px" /> + </el-form-item> + <el-form-item label="项目名称" prop="projectName"> + <el-input v-model="queryParams.projectName" placeholder="项目名称" clearable @keyup.enter="handleQuery" + class="!w-240px" /> + </el-form-item> + <el-form-item label="子项目名称" prop="projectSubName"> + <el-input v-model="queryParams.projectSubName" placeholder="请输入子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="零件名称" prop="materialName"> + <el-input v-model="queryParams.materialName" placeholder="请输入零件名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item style="margin-left:15px"> + <el-button @click="handleQuery" type="primary"> + <Icon icon="ep:search" class="mr-5px" /> 搜索 + </el-button> + <el-button @click="resetQuery"> + <Icon icon="ep:refresh" class="mr-5px" /> 重置 + </el-button> + + </el-form-item> + </el-form> + </ContentWrap> + + <!-- 列表 --> + <ContentWrap> + <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table"> + <el-table-column label="序号" type="index" align="center" fixed min-width="70px" /> + <el-table-column label="物料需求计划单号" align="center" prop="projectMaterialPlanNo" min-width="180" fixed> + <template #default="scope"> + <el-button text type="primary" @click="openForm('detail', scope.row.id)"> + {{ scope.row.projectMaterialPlanNo }} + </el-button> + </template> + </el-table-column> + <el-table-column label="项目名称" align="center" prop="projectName" min-width="180px" /> + <el-table-column label="子项目名称" align="center" prop="name" min-width="180px" /> + <el-table-column label="客户简称" align="center" prop="brief" min-width="180px" /> + <el-table-column label="制单日期" align="center" prop="matPlanDate" :formatter="dateFormatter1" min-width="150" /> + <el-table-column label="需求计划类型" align="center" prop="matType" min-width="150"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.HELI_MAT_TYPE" :value="scope.row.matType" /> + </template> + </el-table-column> + <el-table-column label="操作" align="center" fixed="right" min-width="180"> + <template #default="scope"> + <el-button + link + type="danger" + @click="handleDelete(scope.row.id)" + > + 删除 + </el-button> + <el-button link type="primary" @click="openForm('detail', scope.row.id)"> + 详情信息 + </el-button> + </template> + </el-table-column> + </el-table> + <!-- 分页 --> + <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" + @pagination="getList" /> + </ContentWrap> + +</el-card> + +</template> + +<script setup lang="ts"> +import { DICT_TYPE } from '@/utils/dict' +import { dateFormatter1} from '@/utils/formatTime' +import * as MaterialPlanApi from '@/api/heli/materialplan' + + +defineOptions({ name: 'MaterialPlan' }) +const router = useRouter() +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 + +const loading = ref(true) // 列表的加载中 +const list = ref([]) // 列表的数据 +const total = ref(0) // 列表的总页数 +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + id: undefined, + projectMaterialPlanNo: undefined, + projectId: undefined, + projectPlanId: undefined, + submitUserId: undefined, + projectName: undefined, + projectSubName: undefined, + materialName:undefined, + submitTime: [], + auditor: undefined, + auditTime: [], + status: undefined, + description: undefined, + createTime: [], + matType:1, +}) +const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 + +/** 查询列表 */ +const getList = async () => { + loading.value = true + try { + const data = await MaterialPlanApi.getMaterialPlanPages(queryParams) + list.value = data.list + total.value = data.total + } finally { + loading.value = false + } +} + +/** 搜索按钮操作 */ +const handleQuery = () => { + queryParams.pageNo = 1 + getList() +} + +/** 重置按钮操作 */ +const resetQuery = () => { + queryFormRef.value.resetFields() + handleQuery() +} + +/** 添加/修改操作 */ + +const openForm = (type: string, id?: number) => { + + switch (type) { + case 'create': + router.push({ path: '/purchase/materialplanadd', query: { id: id } }) + break; + case 'update': + router.push({ path: '/purchase/materialplanedit', query: { id: id } }) + break; + case 'detail': + router.push({ path: '/purchase/partmanagementdetail', query: { id: id } }) + break; + default: + break; + } + +} + +/** 删除按钮操作 */ +const handleDelete = async (id: number) => { + try { + // 删除的二次确认 + await message.delConfirm() + // 发起删除 + await MaterialPlanApi.delMaterialPlan(id) + message.success(t('common.delSuccess')) + // 刷新列表 + await getList() + } catch { } +} + + +const userInit = ref() +/** 初始化 **/ +onMounted(async () => { + //用户列表数据 + // userInit.value = await UserApi.getSimpleUserList() + getList() +}) +</script> diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/partmanagementdetail.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/partmanagementdetail.vue new file mode 100644 index 0000000..51b351f --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/partmanagementdetail.vue @@ -0,0 +1,165 @@ +<template> + <el-card class="hl-card" style="position: relative"> + <template #header> + <span>详情页</span> + </template> + <el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading"> + <!-- 基础信息 --> + <el-card class="hl-card-info"> + <template #header> + <div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span> + </template> + + <el-row> + <el-col :span="24"> + <el-row> + + <el-col :span="6"> + <el-row> + <el-col :span="24"> + <el-form-item label="需求计划号" prop="projectMaterialPlanNo"> + <el-input class="!w-300px" placeholder="系统自动生成" v-model="formData.projectMaterialPlanNo" disabled /> + </el-form-item> + </el-col> + </el-row> + </el-col> + <el-col :span="6"> + <el-form-item label="项目名称" prop="projectName"> + <el-input class="!w-300px" placeholder="项目名称" v-model="formData.projectName" disabled /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="子项目名称" prop="name"> + <el-input class="!w-300px" placeholder="项目名称" v-model="formData.name" disabled /> + </el-form-item> + </el-col> + </el-row> + </el-col> + </el-row> + </el-card> + + <!-- 需求单信息 --> + <el-card class="hl-card-info"> + <template #header> + <div class="hl-card-info-icona"></div><span class="hl-card-info-text">需求单信息</span> + </template> + <el-row> + <el-col> + <el-card class="hl-incard"> + <el-table :data="formData.matBoomDOList" class="hl-table" v-loading="loading"> + <el-table-column type="index" label="序号" fixed align="center" min-width="60" /> + <el-table-column prop="matName" min-width="200" label="物料名称" align="center"/> + <el-table-column prop="nickname" min-width="120" label="责任人" align="center"/> + <el-table-column prop="boomAmount" min-width="100" label="需求数量" align="center"/> + <el-table-column prop="boomArriveDate" min-width="200" label="需求到货日期" align="center" :formatter="dateFormatter1"/> + <el-table-column prop="boomSpec" min-width="200" label="规格类型" align="center"/> + <el-table-column prop="mplanStatus" min-width="100" label="需求状态" align="center"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.HELI_PROJECT_MATERIAL_PLAN_BOOM_STATUS" :value="scope.row.mplanStatus" /> + </template> + </el-table-column> + <el-table-column prop="matWeight" min-width="200" label="重量(吨)" align="center"/> + <el-table-column prop="description" min-width="200" label="要求说明" align="center"/> + </el-table> + <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" + @pagination="getList" /> + </el-card> + </el-col> + </el-row> + </el-card> + </el-form> + <div class="hl-footer text-center"> + <el-button @click="closeForm" size="large">取 消</el-button> + </div> + </el-card> + + <!-- 表单弹窗:物料列表 --> +</template> +<script setup lang="ts"> +import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' +import * as MaterialPlanApi from '@/api/heli/materialplan' +import * as MaterialPlanDetailApi from '@/api/heli/materialplandetail' +import * as MaterialPlanBoomApi from '@/api/heli/materialplanboom' +import type { UploadUserFile } from 'element-plus' +import * as PlanApi from '@/api/heli/plan' +import * as PlanSubApi from '@/api/heli/plansub' +import * as ProjectOrderApi from '@/api/heli/projectorder' +import * as UserApi from '@/api/system/user' +import * as MaterialApi from '@/api/heli/material' +import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file' +import download from '@/utils/download' +import { getAccessToken, getTenantId } from '@/utils/auth' +import {dateFormatter, dateFormatter1, formatDate} from '@/utils/formatTime' +import { useUserStore } from '@/store/modules/user' +import { useTagsViewStore } from '@/store/modules/tagsView' +import MaterialSelect from '@/views/heli/hlvuestyle/materialSelect.vue' +import booms from './boom.vue' + +const reload: any = inject('reload') +const { t } = useI18n() // 国际化 +const message = useMessage() // 消息弹窗 +const { query } = useRoute() +const router = useRouter() +const tagsViewStore = useTagsViewStore() + +const dialogVisible = ref(false) // 弹窗的是否展示 +const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 +const formData = ref({ + id: undefined, + projectMaterialPlanNo: undefined, + projectId: undefined, + projectPlanId: undefined, + projectPlanNo: undefined, + projectCode: undefined, + auditor: undefined, + createTime: new Date(), + status: undefined, + description: undefined, + boomItemDOList: [], + boomItemRemoveList: [], + matBoomDOList: [], + matItemRemoveList: [], + attachments: [] +}) + +const formRef = ref() // 表单 Ref +const subFormRef = ref() // 表单 Ref +const loading = ref(true) // 列表的加载中 +const total = ref(0) // 列表的总页数 +const subBoomFormLoading = ref(false) +const subBoomFormRef = ref() + + + + + + +const closeForm = async () => { + router.push({ path: '/purchase/management' }) + tagsViewStore.delVisitedView(router.currentRoute.value) +} +const userList = ref<UserApi.UserVO[]>([]) // 用户列表 + +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + projectMaterialPlanId: query.id +}) +// 页面数据加载初始化 +onMounted(async () => { + // 获取物料需求计划信息 + formData.value = await MaterialPlanApi.getMaterialPlan(query.id) + getList(); +}) +const getList = async () => { + loading.value = true + try { + const data = await MaterialPlanBoomApi.getMaterialPlanBoomPages(queryParams) + formData.value.matBoomDOList = data.list + total.value = data.total + } finally { + loading.value = false + } +} + +</script> diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/standard.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/standard.vue new file mode 100644 index 0000000..4c30a87 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/materialplan/standard.vue @@ -0,0 +1,282 @@ +<template> + <el-card class="hl-card"> + <template #header> + <span>标准件物料需求计划</span> + </template> + <ContentWrap class="borderxx"> + <!-- 搜索工作栏 --> + <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px"> + <el-form-item label="项目名称" prop="projectName"> + <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="子项目名称" prop="projectSubName"> + <el-input v-model="queryParams.projectSubName" placeholder="请输入子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="零件名称" prop="materialName"> + <el-input v-model="queryParams.materialName" placeholder="请输入零件名称" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="项目编码" prop="projectCode"> + <el-input v-model="queryParams.projectCode" placeholder="请输入项目编号" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + <el-form-item label="责任人" prop="ownerName"> + <el-input + v-model="queryParams.ownerName" + placeholder="请输入责任人" + clearable + @keyup.enter="handleQuery" + class="!w-240px" + /> + </el-form-item> + <el-form-item label="标准件状态" prop="status"> + <el-select v-model="queryParams.status" placeholder="请选择标准件状态" clearable class="!w-240px"> + <el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_MATERIAL_PLAN_BOOM_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item label="物料需求单号" prop="projectMaterialPlanNo"> + <el-input v-model="queryParams.projectMaterialPlanNo" placeholder="请输入物料需求单号" clearable @keyup.enter="handleQuery" class="!w-240px" /> + </el-form-item> + + + <el-form-item style="margin-left:30px"> + <el-button @click="handleQuery" type="primary"> + <Icon icon="ep:search" class="mr-5px" /> 搜索 + </el-button> + <el-button @click="resetQuery"> + <Icon icon="ep:refresh" class="mr-5px" /> 重置 + </el-button> + + <el-button + type="success" + plain + @click="handleExportDetail" + :loading="exportLoading" + > + <Icon icon="ep:download" class="mr-5px" /> 导出 + </el-button> + </el-form-item> + </el-form> + </ContentWrap> + + <!-- 列表 --> + <el-card class="hl-card-info"> + <template #header> + <div class="hl-card-info-icona"></div><span class="hl-card-info-text">标准件明细</span> + </template> + <el-row> + <el-col> + <el-card class="hl-incard"> + <el-form ref="subFormRef" :model="list" v-loading="formLoading" label-width="0" > + <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table"> + <el-table-column fixed label="序号" align="center" type="index" width="60" /> + <el-table-column label="客户简称" align="center" prop="customerName" min-width="240" /> + <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> + <el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" /> + <el-table-column label="零件名称" align="center" prop="materialName" min-width="180" /> + <el-table-column label="材质" align="center" prop="compositionName" min-width="180" /> + <el-table-column label="规格型号" align="center" prop="spec" min-width="150" /> + <el-table-column label="图号" align="center" prop="blueprintNo" min-width="120" /> + <el-table-column label="数量" align="center" prop="amount" min-width="120" /> + <el-table-column label="单位" align="center" prop="unit" min-width="100"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.unit" /> + </template> + </el-table-column> + <el-table-column min-width="200px" align="center" fixed="right"> + <template #header><span class="hl-table_header">*</span>要求完成日期</template> + <template #default="{ row, $index }"> + <el-form-item :prop="`${$index}.boomArriveDate`" class="mb-0px!" > + <el-date-picker class="!w-265px" v-model="row.boomArriveDate" type="date" value-format="x" placeholder="要求完成日期" /> + </el-form-item> + </template> + </el-table-column> + <el-table-column min-width="200px" align="center" fixed="right" > + <template #header><span class="hl-table_header">*</span>责任人</template> + <template #default="{ row, $index }"> +<!-- <el-select clearable filterable v-model="row.owner" placeholder="请选择责任人" style="width: 170px">--> +<!-- <el-option--> +<!-- v-for="item in ownerList"--> +<!-- :key="item.index"--> +<!-- :label="item.label"--> +<!-- :value="item.id"--> +<!-- />--> +<!-- </el-select>--> + <el-form-item :prop="`${$index}.duEmpId`" class="mb-0px!" > + <UserSelect v-model="row.duEmpId" class="!w-265px" clearable @update:newValue="handleSelectedUser($index, $event)"/> + </el-form-item> + </template> + </el-table-column> + <el-table-column label="物料需求单号" align="center" prop="projectMaterialPlanNo" min-width="180" fixed="right"/> + </el-table> + <!-- 分页 --> + <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" /> + </el-form> + </el-card> + </el-col> + </el-row> + </el-card> + <div class="hl-footer text-center"> + <el-button @click="submitForm()" type="success" size="large">提 交</el-button> + <el-button style="margin-left: 20px" @click="withdraw()" type="danger" size="large">撤回</el-button> + </div> + </el-card> +</template> + +<script setup lang="ts"> +import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' +import download from '@/utils/download' +import * as ProcessBomApi from '@/api/heli/processbom' +import { useCommonStateWithOut } from '@/store/modules/common' +import UserSelect from "@/views/heli/hlvuestyle/userSelect.vue"; +import {inject, ref} from "vue"; +import * as UserGroupApi from "@/api/bpm/userGroup"; +import {exportStandard} from "@/api/heli/processbom"; +const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 + +defineOptions({ name: 'standard' }) +const reload: any = inject('reload') +const commonStore = useCommonStateWithOut() +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 +const router = useRouter() +const loading = ref(true) // 列表的加载中 +const list = ref([]) // 列表的数据 +const total = ref(0) // 列表的总页数 +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + code: undefined, + planCode: undefined, + projectCode: undefined, + customerName: undefined, + projectName: undefined, + projectSubName: undefined, + version: undefined, + bomStatus: undefined, + remark: undefined, + status: 0, + createTime: [], + ownerName:undefined, + materialName:undefined, + projectMaterialPlanNo:undefined +}) +const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 + +/** 查询列表 */ +const getList = async () => { + loading.value = true + try { + const data = await ProcessBomApi.getStandardPage(queryParams) + list.value = data.list + total.value = data.total + } finally { + loading.value = false + } +} +/** 导出按钮操作 */ +const handleExportDetail = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await ProcessBomApi.exportStandard(queryParams) + download.excel(data, '标准件物料需求计划.xlsx') + } catch { + } finally { + exportLoading.value = false + } +} + +/** 搜索按钮操作 */ +const handleQuery = () => { + queryParams.pageNo = 1 + getList() +} +const handleSelectedUser = (currentIndex, newValue: any) => { + list.value[currentIndex].duEmpId = newValue?.id +} +const submitForm = async () => { + const filteredList = list.value.filter(item => item.duEmpId !== null && item.duEmpId !== undefined); + if (filteredList.length <= 0) { + message.error("提交明细不能为空,请确认"); + return; + } + const firstProjectSubId = filteredList[0].projectSubId; + for (let i = 1; i < filteredList.length; i++) { + if (filteredList[i].projectSubId !== firstProjectSubId) { + message.error("标准件明细不属于同一个子项目,请确认"); + return; + } + } + + for (let i = 0; i < filteredList.length; i++) { + if (filteredList[i].projectMaterialPlanNo!=null){ + message.error("零件"+filteredList[i].materialName+"已生成物料需求计划,请确认") + return + } + if (filteredList[i].boomArriveDate==null){ + message.error("零件"+filteredList[i].materialName+"要求完成日期为空,请确认") + return + } + if (filteredList[i].duEmpId==null){ + message.error("零件"+filteredList[i].materialName+"责任人为空,请确认") + return + } + } + formLoading.value = true + try { + await ProcessBomApi.submitForm(filteredList) + message.success("提交成功") + // 发送操作成功的事件 + getList() + emit('success') + } finally { + formLoading.value = false + } +} +const withdraw = async () => { + if (queryParams.projectMaterialPlanNo==null){ + message.error("物料需求单号为空,不允许撤回") + return + + } + await ProcessBomApi.withdraw(queryParams.projectMaterialPlanNo) + message.success("撤回成功") + // 发送操作成功的事件 + getList() + emit('success') + +} +/** 重置按钮操作 */ +const resetQuery = () => { + queryFormRef.value.resetFields() + handleQuery() +} + + + +/** 导出按钮操作 */ +const handleExport = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await ProcessBomApi.exportProcessBom(queryParams) + download.excel(data, '工艺bom.xls') + } catch { + } finally { + exportLoading.value = false + } +} + + +/** 初始化 **/ +onMounted(() => { + getList() +}) +</script> +<style> +/* 占位样式 */ +</style> diff --git a/mes-ui/mini-app/src/pages/productionReport/components/dataItem.vue b/mes-ui/mini-app/src/pages/productionReport/components/dataItem.vue index e9ffcd5..46ccaa2 100644 --- a/mes-ui/mini-app/src/pages/productionReport/components/dataItem.vue +++ b/mes-ui/mini-app/src/pages/productionReport/components/dataItem.vue @@ -1,206 +1,299 @@ <script setup lang="ts"> - import { onMounted, computed, ref } from 'vue' - import { onLoad, onShow } from '@dcloudio/uni-app' - import { getListAPI, getDictAPI, getListWxAPI, getTaskDetailAPI } from '@/services/productionReport' - import { useLoginStore } from '@/stores/modules/login' - import { formatDate } from '@/utils/index' +import { onMounted, computed, ref } from "vue"; +import { onLoad, onShow } from "@dcloudio/uni-app"; +import { + getListAPI, + getDictAPI, + getListWxAPI, + getTaskDetailAPI, +} from "@/services/productionReport"; +import { useLoginStore } from "@/stores/modules/login"; +import { formatDate } from "@/utils/index"; - const userStore = useLoginStore() - const userId = userStore.userInfo.userId +const userStore = useLoginStore(); +const userId = userStore.userInfo.userId; - // 是否分页结束 - const isFinish = ref(false) - // 是否触发下拉刷新 - const isTriggered = ref(false) - // 定义 porps - const props = defineProps<{ - orderState : string - }>() - const noticeMsg = ref('') - const isOverBeforeProcedure = async (id : number) => { - //console.log(props.orderState) - const params = { - id, - } - const data = await getTaskDetailAPI(params) - console.log(data.testYn) - if (data.beforeProcedureStatus == 0) { - //如果上一道工序没结束 - noticeMsg.value = '上一道工序尚未完成报工!'; - return true; - }else { - return false; - } - } - const statusText = computed(() => { - const text = props.orderState == '0,1' ? '处理' : '查看' - return text - }) - // 是否加载中标记,用于防止滚动触底触发多次请求 - const isLoading = ref(false) - // 请求参数 - const queryParams : Required<any> = { - pageNo: 1, - pageSize: 5, - owner: userId, // - procedureStatusList: props.orderState, // 工序完成状态列表 - dispatchType: 'PRODUCTION', // 派工类型 - isReport: 1, // 是否需要报工 - //20250601新增,项目名称/子项目名称 - subOrDetailName:'', - } - const dataList = ref([]) - const getListData = async () => { - if(props.orderState == '2'){ - queryParams.subOrDetailName = ''; - } - // 如果数据出于加载中,退出函数 - if (isLoading.value) return - if (isFinish.value === true) { - return uni.showToast({ icon: 'none', title: '没有更多数据~' }) - } - isLoading.value = true - // 发送请求 - // const data = await getListAPI(queryParams) - const data = await getListWxAPI(queryParams) - isLoading.value = false - data.list.forEach((e) => { - e.orderTime = formatDate(e.orderTime, 'YYYY-MM-DD') - e.startTime = formatDate(e.startTime, 'YYYY-MM-DD') - e.endTime = formatDate(e.endTime, 'YYYY-MM-DD') - }) - // 数组追加 - dataList.value.push(...data.list) - // 分页条件 - if (queryParams.pageNo < data.total) { - // 页码累加 - queryParams.pageNo++ - } else { - // 分页已结束 - isFinish.value = true - } - } - const todayStr = ref(''); - onMounted(async () => { - const today = new Date(); - const year = today.getFullYear(); - const month = String(today.getMonth() + 1).padStart(2, '0'); - const day = String(today.getDate()).padStart(2, '0'); +// 是否分页结束 +const isFinish = ref(false); +// 是否触发下拉刷新 +const isTriggered = ref(false); +// 定义 porps +const props = defineProps<{ + orderState: string; +}>(); +const noticeMsg = ref(""); +const isOverBeforeProcedure = async (id: number) => { + //console.log(props.orderState) + const params = { + id, + }; + const data = await getTaskDetailAPI(params); + console.log(data.testYn); + if (data.beforeProcedureStatus == 0) { + //如果上一道工序没结束 + noticeMsg.value = "上一道工序尚未完成报工!"; + return true; + } else { + return false; + } +}; +const statusText = computed(() => { + const text = props.orderState == "0,1" ? "处理" : "查看"; + return text; +}); +// 是否加载中标记,用于防止滚动触底触发多次请求 +const isLoading = ref(false); +// 请求参数 +const queryParams: Required<any> = { + pageNo: 1, + pageSize: 5, + owner: userId, // + procedureStatusList: props.orderState, // 工序完成状态列表 + dispatchType: "PRODUCTION", // 派工类型 + isReport: 1, // 是否需要报工 + //20250601新增,项目名称/子项目名称 + subOrDetailName: "", +}; +const dataList = ref([]); +const getListData = async () => { + if (props.orderState == "2") { + queryParams.subOrDetailName = ""; + } + // 如果数据出于加载中,退出函数 + if (isLoading.value) return; + if (isFinish.value === true) { + return uni.showToast({ icon: "none", title: "没有更多数据~" }); + } + isLoading.value = true; + // 发送请求 + // const data = await getListAPI(queryParams) + const data = await getListWxAPI(queryParams); + isLoading.value = false; + data.list.forEach((e) => { + e.orderTime = formatDate(e.orderTime, "YYYY-MM-DD"); + e.startTime = formatDate(e.startTime, "YYYY-MM-DD"); + e.endTime = formatDate(e.endTime, "YYYY-MM-DD"); + }); + // 数组追加 + dataList.value.push(...data.list); + // 分页条件 + if (queryParams.pageNo < data.total) { + // 页码累加 + queryParams.pageNo++; + } else { + // 分页已结束 + isFinish.value = true; + } +}; +const todayStr = ref(""); +onMounted(async () => { + const today = new Date(); + const year = today.getFullYear(); + const month = String(today.getMonth() + 1).padStart(2, "0"); + const day = String(today.getDate()).padStart(2, "0"); - todayStr.value = `${year}-${month}-${day}`; - await getListData() - }) + todayStr.value = `${year}-${month}-${day}`; + await getListData(); +}); - onShow(async () => { - isFinish.value = false - isLoading.value = false - queryParams.pageNo = 1 - dataList.value = [] - await getListData() - }) +onShow(async () => { + isFinish.value = false; + isLoading.value = false; + queryParams.pageNo = 1; + dataList.value = []; + await getListData(); +}); - const handleDetail = async (item) => { - var isoverBefore = await isOverBeforeProcedure(item.id); - if (isoverBefore == true) { - uni.showToast({ - title: noticeMsg.value, - icon: 'none', - duration: 2000, - }) - return - } - const url = `/pages/productionReport/productionReport-detail?id=${item.id}` - uni.navigateTo({ url }) - } +const handleDetail = async (item) => { + var isoverBefore = await isOverBeforeProcedure(item.id); + if (isoverBefore == true) { + uni.showToast({ + title: noticeMsg.value, + icon: "none", + duration: 2000, + }); + return; + } + const url = `/pages/productionReport/productionReport-detail?id=${item.id}`; + uni.navigateTo({ url }); +}; - // 自定义下拉刷新被触发 - const onRefresherrefresh = async () => { - // 开始动画 - isTriggered.value = true - // 重置数据 - queryParams.pageNo = 1 - dataList.value = [] - isFinish.value = false - // 加载数据 - await getListData() - // 关闭动画 - isTriggered.value = false - } - const searchVal = ref('') - // const dataListDefault = ref([]) - const handleSearch = async (e) => { +// 自定义下拉刷新被触发 +const onRefresherrefresh = async () => { + // 开始动画 + isTriggered.value = true; + // 重置数据 + queryParams.pageNo = 1; + dataList.value = []; + isFinish.value = false; + // 加载数据 + await getListData(); + // 关闭动画 + isTriggered.value = false; +}; +const searchVal = ref(""); +// const dataListDefault = ref([]) +const handleSearch = async (e) => { + queryParams.subOrDetailName = e.inputValue; + queryParams.pageNo = 1; + isFinish.value = false; + dataList.value = []; + await getListData(); +}; - queryParams.subOrDetailName = e.inputValue; - queryParams.pageNo = 1; - isFinish.value = false; - dataList.value = [] - await getListData() - } + + +const handleScan = () => { + uni.scanCode({ + success: (res) => { + searchVal.value = res.result + handleSearch({ inputValue: res.result }) + }, + fail: () => { + uni.showToast({ title: '扫码失败', icon: 'none' }) + } + }) +} </script> <template> - <view class="cont"> - <view class="search" v-if="props.orderState == '0,1' "> + <view class="cont"> + <!-- <view class="search" v-if="props.orderState == '0,1' "> <spring-search-box :showScan="true" :showReset="true" bgColor="#E2F3FF" @input="(e) => handleSearch(e)" placeholderColor="#28A0F8" searchColor="#28A0F8" v-model="searchVal" :mode="3" @change="(e) => handleSearch(e)" placeholder="请输入项目或子项目名称" clearable></spring-search-box> - <!-- <spring-search-box :showScan="true" :showReset="true" bgColor="#E2F3FF" @input="(e) => handleSearch(e)" placeholderColor="#28A0F8" searchColor="#28A0F8" v-model="searchVal" :mode="3" @change="(e) => handleSearch(e)" placeholder="请输入项目或子项目名称"></spring-search-box --> -<!-- <input class="uni-input" v-model="searchVal" placeholder="请输入项目或子项目名称" /> - <button><uni-icons type="search" size="30" class="icons" @click="handleSearch"></uni-icons></button> --> - </view> - <scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered" - @refresherrefresh="onRefresherrefresh" @scrolltolower="getListData"> - <view class="item" v-for="item in dataList" :key="item.id" @click="handleDetail(item)"> - <view class="hd"> - <view class="num">派工单:</view> - <view class="statusLabel">{{ '(单号:'+ item.dispatchCode+') '}}</view> - <view class="num">{{ '下工序:'+ (item.nextProcedureName == null ? '无':item.nextProcedureName)}}</view> - <!-- <view class="statusLabel " ></view> --> - </view> - <view class="md"> - <view class="product-item">项目名称:{{ item.projectCode + ' ' + item.projectName }}</view> - <view class="product-item">子项目:{{ item.projectSubCode || '' }} {{' ' + item.projectSubName }}</view> - <view class="product-row"> - <view class="row-item"> - <view class="label">零件名称: {{ item.materialName }}</view> - </view> - <view class="row-item"> - <view class="label">派工工序: {{ item.procedureName }}</view> - </view> - </view> - <view class="product-row"> - <view class="row-item"> - <view class="label">派工数量</view> - <view class="val">{{ item.amount }}</view> - </view> - <view class="row-item"> - <view class="label">总报工数量</view> - <view class="val high-color">{{ item.totalReportAmount }}</view> - </view> - </view> - <view class="product-row"> - <view class="row-item"> - <view class="label">预计工时</view> - <view class="val">{{ item.workTime }}</view> - </view> - <view class="row-item"> - <view class="label">总报工工时</view> - <view class="val high-color">{{ item.totalWorkTime }}</view> - </view> - </view> - <view class="product-item" :style=" (item.endTime < todayStr)&&props.orderState != '2' ? 'color:red':null">预计生产日期:{{ item.startTime }} ~ {{ item.endTime }}</view> - </view> - <view class="statusText">{{ statusText }}</view> - </view> - <!-- 底部提示文字 --> - <view class="loading-text" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"> - {{ isFinish ? '没有更多数据~' : '正在加载...' }} - </view> - </scroll-view> - </view> + </view> --> + <view class="search" v-if="props.orderState == '0,1'"> + <view + style=" + width: 100%; + display: flex; + align-items: center; + background: #e2f3ff; + border-radius: 20rpx; + padding: 0 8rpx; + height: 50px; + " + > + <input + class="uni-input" + v-model="searchVal" + placeholder="请输入项目或子项目名称" + :placeholder-style="'color:#28A0F8;'" + style=" + flex: 1; + background: transparent; + border: none; + outline: none; + font-size: 25rpx; + color: #28a0f8; + height: 50px; + line-height: 50px; + " + @input="handleSearch({ inputValue: searchVal })" + clearable + /> + <view + style=" + background: none; + border: none; + padding: 0 10rpx; + height: 50px; + display: flex; + align-items: center; + " + @click="handleScan" + > + <uni-icons type="scan" size="28" color="#28A0F8"></uni-icons> + </view> + </view> + </view> + <scroll-view + enable-back-to-top + scroll-y + class="data-list" + refresher-enabled + :refresher-triggered="isTriggered" + @refresherrefresh="onRefresherrefresh" + @scrolltolower="getListData" + > + <view + class="item" + v-for="item in dataList" + :key="item.id" + @click="handleDetail(item)" + > + <view class="hd"> + <view class="num">派工单:</view> + <view class="statusLabel">{{ + "(单号:" + item.dispatchCode + ") " + }}</view> + <view class="num">{{ + "下工序:" + + (item.nextProcedureName == null ? "无" : item.nextProcedureName) + }}</view> + <!-- <view class="statusLabel " ></view> --> + </view> + <view class="md"> + <view class="product-item" + >项目名称:{{ item.projectCode + " " + item.projectName }}</view + > + <view class="product-item" + >子项目:{{ item.projectSubCode || "" }} + {{ " " + item.projectSubName }}</view + > + <view class="product-row"> + <view class="row-item"> + <view class="label">零件名称: {{ item.materialName }}</view> + </view> + <view class="row-item"> + <view class="label">派工工序: {{ item.procedureName }}</view> + </view> + </view> + <view class="product-row"> + <view class="row-item"> + <view class="label">派工数量</view> + <view class="val">{{ item.amount }}</view> + </view> + <view class="row-item"> + <view class="label">总报工数量</view> + <view class="val high-color">{{ item.totalReportAmount }}</view> + </view> + </view> + <view class="product-row"> + <view class="row-item"> + <view class="label">预计工时</view> + <view class="val">{{ item.workTime }}</view> + </view> + <view class="row-item"> + <view class="label">总报工工时</view> + <view class="val high-color">{{ item.totalWorkTime }}</view> + </view> + </view> + <view + class="product-item" + :style=" + item.endTime < todayStr && props.orderState != '2' + ? 'color:red' + : null + " + >预计生产日期:{{ item.startTime }} ~ {{ item.endTime }}</view + > + </view> + <view class="statusText">{{ statusText }}</view> + </view> + <!-- 底部提示文字 --> + <view + class="loading-text" + :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }" + > + {{ isFinish ? "没有更多数据~" : "正在加载..." }} + </view> + </scroll-view> + </view> </template> <style lang="scss"> - // 订单列表 +// 订单列表 .search { padding: 0rpx; width: 90%; @@ -223,237 +316,236 @@ } } - .data-list { +.data-list { + height: 90vh; - height: 90vh; + .item { + position: relative; + padding: 20rpx 0; + margin: 20rpx 20rpx; + border-radius: 10rpx; + background-color: #fff; - .item { - position: relative; - padding: 20rpx 0; - margin: 20rpx 20rpx; - border-radius: 10rpx; - background-color: #fff; + .hd { + padding: 10rpx; + font-size: 28rpx; + display: flex; - .hd { - padding: 10rpx; - font-size: 28rpx; - display: flex; + .statusLabel { + font-size: 24rpx; + color: #737d88; + } + } - .statusLabel { - font-size: 24rpx; - color: #737D88; - } - } + .md { + position: relative; + padding: 10rpx; + min-height: 100rpx; + font-size: 28rpx; + border-top: 2rpx solid #f2f2f2; - .md { - position: relative; - padding: 10rpx; - min-height: 100rpx; - font-size: 28rpx; - border-top: 2rpx solid #F2F2F2; + .product-item { + margin: 20rpx 0; + display: flex; + align-items: center; + color: #737d88; + } - .product-item { - margin: 20rpx 0; - display: flex; - align-items: center; - color: #737D88 - } + .product-row { + margin: 20rpx 0; + display: flex; + flex-direction: row; + justify-content: space-between; + color: #737d88; - .product-row { - margin: 20rpx 0; - display: flex; - flex-direction: row; - justify-content: space-between; - color: #737D88; + .row-item { + flex: 1; - .row-item { - flex: 1; + .label { + margin-bottom: 10rpx; + } - .label { - margin-bottom: 10rpx; - } + .val { + color: #1d2129; - .val { - color: #1D2129; + &.high-color { + color: #00b42a; + } + } + } + } + } - &.high-color { - color: #00B42A - } - } - } + .statusText { + position: absolute; + right: 30rpx; + top: 100rpx; + border-radius: 10rpx; + font-size: 24rpx; + padding: 10rpx 30rpx; + border-radius: 10rpx; + font-size: 24rpx; + background: linear-gradient(149deg, #2dace6 4%, #356899 98%); + color: #fff; + } - } - } + &:last-child { + padding-bottom: 40rpx; + } + } - .statusText { - position: absolute; - right: 30rpx; - top: 100rpx; - border-radius: 10rpx; - font-size: 24rpx; - padding: 10rpx 30rpx; - border-radius: 10rpx; - font-size: 24rpx; - background: linear-gradient(149deg, #2DACE6 4%, #356899 98%); - color: #fff; - } + .status { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 28rpx; + color: #999; + margin-bottom: 15rpx; - &:last-child { - padding-bottom: 40rpx; - } - } + .date { + color: #666; + flex: 1; + } - .status { - display: flex; - align-items: center; - justify-content: space-between; - font-size: 28rpx; - color: #999; - margin-bottom: 15rpx; + .primary { + color: #ff9240; + } - .date { - color: #666; - flex: 1; - } + .icon-delete { + line-height: 1; + margin-left: 10rpx; + padding-left: 10rpx; + border-left: 1rpx solid #e3e3e3; + } + } - .primary { - color: #ff9240; - } + .goods { + display: flex; + margin-bottom: 20rpx; - .icon-delete { - line-height: 1; - margin-left: 10rpx; - padding-left: 10rpx; - border-left: 1rpx solid #e3e3e3; - } - } + .cover { + width: 170rpx; + height: 170rpx; + margin-right: 20rpx; + border-radius: 10rpx; + overflow: hidden; + position: relative; - .goods { - display: flex; - margin-bottom: 20rpx; + .image { + width: 170rpx; + height: 170rpx; + } + } - .cover { - width: 170rpx; - height: 170rpx; - margin-right: 20rpx; - border-radius: 10rpx; - overflow: hidden; - position: relative; + .quantity { + position: absolute; + bottom: 0; + right: 0; + line-height: 1; + padding: 6rpx 4rpx 6rpx 8rpx; + font-size: 24rpx; + color: #fff; + border-radius: 10rpx 0 0 0; + background-color: rgba(0, 0, 0, 0.6); + } - .image { - width: 170rpx; - height: 170rpx; - } - } + .meta { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + } - .quantity { - position: absolute; - bottom: 0; - right: 0; - line-height: 1; - padding: 6rpx 4rpx 6rpx 8rpx; - font-size: 24rpx; - color: #fff; - border-radius: 10rpx 0 0 0; - background-color: rgba(0, 0, 0, 0.6); - } + .name { + height: 80rpx; + font-size: 26rpx; + color: #444; + } - .meta { - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - } + .type { + line-height: 1.8; + padding: 0 15rpx; + margin-top: 10rpx; + font-size: 24rpx; + align-self: flex-start; + border-radius: 4rpx; + color: #888; + background-color: #f7f7f8; + } - .name { - height: 80rpx; - font-size: 26rpx; - color: #444; - } + .more { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + font-size: 22rpx; + color: #333; + } + } - .type { - line-height: 1.8; - padding: 0 15rpx; - margin-top: 10rpx; - font-size: 24rpx; - align-self: flex-start; - border-radius: 4rpx; - color: #888; - background-color: #f7f7f8; - } + .payment { + display: flex; + justify-content: flex-end; + align-items: center; + line-height: 1; + padding: 20rpx 0; + text-align: right; + color: #999; + font-size: 28rpx; + border-bottom: 1rpx solid #eee; - .more { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - font-size: 22rpx; - color: #333; - } - } + .quantity { + font-size: 24rpx; + margin-right: 16rpx; + } - .payment { - display: flex; - justify-content: flex-end; - align-items: center; - line-height: 1; - padding: 20rpx 0; - text-align: right; - color: #999; - font-size: 28rpx; - border-bottom: 1rpx solid #eee; + .amount { + color: #444; + margin-left: 6rpx; + } - .quantity { - font-size: 24rpx; - margin-right: 16rpx; - } + .symbol { + font-size: 20rpx; + } + } - .amount { - color: #444; - margin-left: 6rpx; - } + .action { + display: flex; + justify-content: flex-end; + align-items: center; + padding-top: 20rpx; - .symbol { - font-size: 20rpx; - } - } + .button { + width: 180rpx; + height: 60rpx; + display: flex; + justify-content: center; + align-items: center; + margin-left: 20rpx; + border-radius: 60rpx; + border: 1rpx solid #ccc; + font-size: 26rpx; + color: #444; + } - .action { - display: flex; - justify-content: flex-end; - align-items: center; - padding-top: 20rpx; + .secondary { + color: #3775f6; + border-color: #3775f6; + } - .button { - width: 180rpx; - height: 60rpx; - display: flex; - justify-content: center; - align-items: center; - margin-left: 20rpx; - border-radius: 60rpx; - border: 1rpx solid #ccc; - font-size: 26rpx; - color: #444; - } + .primary { + color: #fff; + background-color: #3775f6; + border-color: #3775f6; + } + } - .secondary { - color: #3775F6; - border-color: #3775F6; - } + .loading-text { + text-align: center; + font-size: 28rpx; + color: #666; + padding: 20rpx 0; + } +} - .primary { - color: #fff; - background-color: #3775F6; - border-color: #3775F6; - } - } - - .loading-text { - text-align: center; - font-size: 28rpx; - color: #666; - padding: 20rpx 0; - } - } </style>import type { stringify } from 'querystring';