零件跟标准件物料需求计划

This commit is contained in:
z 2025-06-17 20:45:09 +08:00
parent d331c4675b
commit 9be047b579
39 changed files with 2726 additions and 593 deletions

View File

@ -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 = "小程序消息")

View File

@ -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));
}
}
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));
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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));
}
}

View File

@ -27,4 +27,6 @@ public class ProcessBoomPageReqVO extends PageParam {
@Schema(description = "生产计划子项目编号")
private String projectSubCode;
@Schema(description = "物料需求计划id")
private String projectMaterialPlanId;
}

View File

@ -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));
}
}

View File

@ -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;
}

View File

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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -151,5 +151,6 @@ public class ProcessDesignDO extends BaseDO {
@TableField(exist = false)
private String blueprintLink;
@TableField(exist = false)
private String brief;
}

View File

@ -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;
}

View File

@ -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())

View File

@ -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())

View File

@ -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);
}
}

View File

@ -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")

View File

@ -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);
}
}

View File

@ -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);
}
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);
}

View File

@ -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);
}
}

View File

@ -57,4 +57,5 @@ public interface MaterialPlanBoomService {
PageResult<ProcessBomDetailDO> getProcessBoomDetailList(ProcessBoomPageReqVO pageReqVO);
PageResult<MaterialPlanBoomDO> getMaterialPlanBoomPages(ProcessBoomPageReqVO pageReqVO);
}

View File

@ -154,4 +154,9 @@ public class MaterialPlanBoomServiceImpl implements MaterialPlanBoomService {
return processBomDetailDOPageResult;
}
@Override
public PageResult<MaterialPlanBoomDO> getMaterialPlanBoomPages(ProcessBoomPageReqVO pageReqVO) {
return materialPlanBoomMapper.getMaterialPlanBoomPages(pageReqVO);
}
}

View File

@ -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);
}

View File

@ -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);}

View File

@ -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());

View File

@ -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 })
}
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 })
}

View File

@ -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 })
}

View File

@ -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 })
}

View File

@ -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状态
}

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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) // 12
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>

View File

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