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';