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

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)); BeanUtils.toBean(list, bdgzsomthingRespVO.class));
} }
@Scheduled(fixedRate = 10800000) // @Scheduled(fixedRate = 10800000)
public void scheduledTask() { public void scheduledTask() {
bdgzsomthingService.selectds(); bdgzsomthingService.selectds();
} }
@ -159,15 +159,15 @@ public class bdgzsomthingController {
//@Scheduled(cron = "0 2 0 * * ?") //每天十天执行一次 //@Scheduled(cron = "0 2 0 * * ?") //每天十天执行一次
@PostConstruct @PostConstruct
public void init() { public void init() {
selectHasPrice(); // selectHasPrice();
selectSafeStorageAndDeliverOneYear(); // selectSafeStorageAndDeliverOneYear();
} }
@Scheduled(cron = "0 0 2 * * ?") // @Scheduled(cron = "0 0 2 * * ?")
public void selectHasPrice(){ public void selectHasPrice(){
bdgzsomthingService.selectHasPrice(); bdgzsomthingService.selectHasPrice();
} }
@Scheduled(cron = "0 0 0 * * ?") // @Scheduled(cron = "0 0 0 * * ?")
public void selectSafeStorageAndDeliverOneYear(){bdgzsomthingService.selectSafeStorageAndDeliverOneYear();} public void selectSafeStorageAndDeliverOneYear(){bdgzsomthingService.selectSafeStorageAndDeliverOneYear();}
@PostMapping("/getMessage") @PostMapping("/getMessage")
@Operation(summary = "小程序消息") @Operation(summary = "小程序消息")

View File

@ -1,5 +1,7 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.materialplan; 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 org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -91,5 +93,51 @@ public class MaterialPlanController {
ExcelUtils.write(response, "物料需求计划.xls", "数据", MaterialPlanRespVO.class, ExcelUtils.write(response, "物料需求计划.xls", "数据", MaterialPlanRespVO.class,
BeanUtils.toBean(list, 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 = "创建时间") @Schema(description = "创建时间")
private String createTime; 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("创建时间") @ExcelProperty("创建时间")
private LocalDateTime createTime; 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); PageResult<ProcessBomDetailDO> pageResult = materialPlanBoomService.getProcessBoomDetailList(pageReqVO);
return success(BeanUtils.toBean(pageResult, ProcessBomDetailDO.class)); 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 = "生产计划子项目编号") @Schema(description = "生产计划子项目编号")
private String projectSubCode; 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.annotations.OperateLog;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; 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.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.controller.admin.processbom.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; 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.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.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
@ -230,4 +233,35 @@ public class ProcessBomController {
processBomService.deleteProcessBomDetailNew(id); processBomService.deleteProcessBomDetailNew(id);
return success(true); 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 = "项目名称") @Schema(description = "项目名称")
private String projectName; private String projectName;
@Schema(description = "零件名称")
private String materialName;
@Schema(description = "责任人")
private String ownerName;
@Schema(description = "物料需求单号")
private String projectMaterialPlanNo;
@Schema(description = "审核人") @Schema(description = "审核人")
private Long userId; private Long userId;

View File

@ -68,6 +68,14 @@ public class MaterialPlanDO extends BaseDO {
* 备注 * 备注
*/ */
private String description; 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 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 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) @TableField(exist = false)
private String materialName; private String materialName;
@TableField(exist = false) @TableField(exist = false)
@ -69,5 +105,7 @@ public class MaterialPlanBoomDO extends BaseDO {
private Long compositionId; private Long compositionId;
@TableField(exist = false) @TableField(exist = false)
private String projectMaterialPlanNo; private String projectMaterialPlanNo;
@TableField(exist = false)
private String nickname;
} }

View File

@ -116,7 +116,9 @@ public class PlanDO extends BaseDO {
*要求设计结束日期 *要求设计结束日期
* */ * */
private LocalDateTime changeEndTime; private LocalDateTime changeEndTime;
@TableField(exist = false)
private String name; private String name;
@TableField(exist = false)
private String brief; private String brief;
/** /**
* 子项目id * 子项目id

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*; import lombok.*;
import org.apache.poi.hpsf.Date;
import org.apache.poi.hpsf.Decimal; import org.apache.poi.hpsf.Decimal;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -78,6 +79,10 @@ public class ProcessBomDetailDO extends BaseDO {
* 备注 * 备注
*/ */
private String remark; private String remark;
/**
* 其他件物料编码
*/
private String otherMaterialCode;
/** /**
* 状态,1表示正常2表示禁用 * 状态,1表示正常2表示禁用
*/ */
@ -104,6 +109,13 @@ public class ProcessBomDetailDO extends BaseDO {
* 操作次数 * 操作次数
* */ * */
private Integer bomOperateCount; 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; private BigDecimal price;
@TableField(exist = false) @TableField(exist = false)
private String matUnitId; 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) @TableField(exist = false)
private String blueprintLink; 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 com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.security.SecurityScheme;
import lombok.*; import lombok.*;
import org.apache.poi.hpsf.Date;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -96,6 +97,9 @@ public class TaskDispatchDetailDO extends BaseDO {
private Long dispatchType; private Long dispatchType;
private String postId; private String postId;
private String isOutsourcing; private String isOutsourcing;
private String projectMaterialPlanNo;
private Long projectMaterialPlanDetailId;
private Integer planStatus;
/** /**
* 工序状态 默认 已提交 已完成 0 1 2 * 工序状态 默认 已提交 已完成 0 1 2
*/ */
@ -157,7 +161,8 @@ public class TaskDispatchDetailDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private Integer wgType; private Integer wgType;
@TableField(exist = false)
private Integer boomAmount;
@TableField(exist = false) @TableField(exist = false)
private String deviceName; private String deviceName;
@ -194,4 +199,32 @@ public class TaskDispatchDetailDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String nextProcedureName; 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.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.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; 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.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; 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); 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) { // default PageResult<MaterialPlanDO> selectPage(MaterialPlanPageReqVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanDO>() // return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanDO>()
// .eqIfPresent(MaterialPlanDO::getId, reqVO.getId()) // .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.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.enums.BoomDetailTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.BoomDetailTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum; 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 com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.*; 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); 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) { // default PageResult<MaterialPlanBoomDO> selectPage(MaterialPlanBoomPageReqVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanBoomDO>() // return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanBoomDO>()
// .eqIfPresent(MaterialPlanBoomDO::getId, reqVO.getId()) // .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.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; 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.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.ProcessBoomPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomRespVO; import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plantaskbom.vo.PlanTaskBomPageReqVO; 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.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; 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.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.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO; 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.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; 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.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import org.bouncycastle.eac.EACCertificateBuilder;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Arrays; import java.util.Arrays;
@ -39,7 +45,9 @@ import java.util.List;
@Mapper @Mapper
public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO> { public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO> {
// default List<ProcessBomDetailDO> selectListByBomId(Long bomId) {
// default List<ProcessBomDetailDO> selectListByBomId(Long bomId) {
// //
// MPJLambdaWrapper<ProcessBomDetailDO> query = new MPJLambdaWrapper<>(); // MPJLambdaWrapper<ProcessBomDetailDO> query = new MPJLambdaWrapper<>();
// //
@ -186,4 +194,48 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
.eq(ProcessBomDetailDO::getType,'1'); .eq(ProcessBomDetailDO::getType,'1');
return selectPage(reqVO,query); 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<>(); MPJLambdaWrapper<ProcessDesignDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProcessDesignDO.class) query.selectAll(ProcessDesignDO.class)
.select("a.status as planStatus") .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("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("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") .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.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; 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.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.TaskDispatchDetailPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskDispatchDetailTotalVO; 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.taskdispatch.vo.TaskPlanJDBaoBiaoPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.ygjx.vo.YgjxPageReqVO; 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.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.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.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; 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.projectorder.ProjectOrderSubDO;
@ -23,6 +28,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.math.BigDecimal; 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

@ -2,10 +2,15 @@ package com.chanko.yunxi.mes.module.heli.service.materialplan;
import java.util.*; import java.util.*;
import javax.validation.*; 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.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.module.heli.dal.dataobject.materialplan.MaterialPlanDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; 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 接口 * 物料需求计划 Service 接口
@ -52,4 +57,13 @@ public interface MaterialPlanService {
*/ */
PageResult<MaterialPlanDO> getMaterialPlanPage(MaterialPlanPageReqVO pageReqVO); 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 cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.common.util.object.ObjectUtils;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils; 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.attentiontodo.AttentiontodoDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO; 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.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.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.attentiontodo.AttentiontodoService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; 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.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.dal.mysql.user.AdminUserMapper;
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService; import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -60,7 +70,13 @@ public class MaterialPlanServiceImpl implements MaterialPlanService {
@Resource @Resource
private AdminUserService adminUserService; private AdminUserService adminUserService;
@Resource @Resource
private MaterialPlanBoomMapper materialPlanBoomMapper;
@Resource
private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper; private com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper bdgzsomthingMapper;
@Resource
private ProcessBomDetailMapper processBomDetailMapper;
@Resource
private TaskDispatchDetailMapper taskDispatchDetailMapper;
@Override @Override
public Long createMaterialPlan(MaterialPlanSaveReqVO createReqVO) { public Long createMaterialPlan(MaterialPlanSaveReqVO createReqVO) {
// 插入 // 插入
@ -197,5 +213,116 @@ public class MaterialPlanServiceImpl implements MaterialPlanService {
public PageResult<MaterialPlanDO> getMaterialPlanPage(MaterialPlanPageReqVO pageReqVO) { public PageResult<MaterialPlanDO> getMaterialPlanPage(MaterialPlanPageReqVO pageReqVO) {
return materialPlanMapper.selectPage(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<ProcessBomDetailDO> getProcessBoomDetailList(ProcessBoomPageReqVO pageReqVO);
PageResult<MaterialPlanBoomDO> getMaterialPlanBoomPages(ProcessBoomPageReqVO pageReqVO);
} }

View File

@ -154,4 +154,9 @@ public class MaterialPlanBoomServiceImpl implements MaterialPlanBoomService {
return processBomDetailDOPageResult; 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; 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.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.ProcessBomPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO;
@ -91,4 +92,10 @@ public interface ProcessBomService {
void deleteProcessBomDetailNew(Long id); void deleteProcessBomDetailNew(Long id);
ProcessBomDetailDO selectProcessBomDetail(Long id); ProcessBomDetailDO selectProcessBomDetail(Long id);
void updateProcessBomDetail(ProcessBomDetailDO processBomDetailDO); 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 cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.generator.IFill; import com.baomidou.mybatisplus.generator.IFill;
import com.chanko.yunxi.mes.framework.common.enums.BomEditStatusEnum; 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.enums.StatusEnum;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode; 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.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; 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.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; 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.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.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO; 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.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO; 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.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.dataobject.shenhe.ShenheDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.attentiontodo.AttentiontodoMapper; 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.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.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plantask.PlanTaskMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plantask.PlanTaskMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; 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.composition.CompositionService;
import com.chanko.yunxi.mes.module.heli.service.material.MaterialService; 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.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.api.user.AdminUserApi;
import com.chanko.yunxi.mes.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import com.chanko.yunxi.mes.module.system.controller.admin.dict.vo.data.DictDataPageReqVO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.dict.DictDataDO; 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.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; 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.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.error; 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.*; import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/** /**
@ -108,6 +117,12 @@ public class ProcessBomServiceImpl implements ProcessBomService {
private AdminUserService adminUserService; private AdminUserService adminUserService;
@Resource @Resource
private PlanMapper planMapper; private PlanMapper planMapper;
@Resource
private SerialNumberService serialNumberService;
@Resource
private MaterialPlanMapper materialPlanMapper;
@Resource
private MaterialPlanBoomMapper materialPlanBoomMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createProcessBom(ProcessBomSaveReqVO createReqVO) { public Long createProcessBom(ProcessBomSaveReqVO createReqVO) {
@ -987,6 +1002,82 @@ public class ProcessBomServiceImpl implements ProcessBomService {
public void updateProcessBomDetail(ProcessBomDetailDO processBomDetailDO){ public void updateProcessBomDetail(ProcessBomDetailDO processBomDetailDO){
processBomDetailMapper.updateById(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) { private void createProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list,Integer num) {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
/*list.forEach(o -> {o.setBomId(bomId);o.setUpdateTimes(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.setThingname(thingname);
// BdgzsomthingDO.setThings(things); // BdgzsomthingDO.setThings(things);
BdgzsomthingDO.setAttr4("1"); BdgzsomthingDO.setAttr4("1");
BdgzsomthingDO.setAttr6(processDesignDO.getCustomerName()); BdgzsomthingDO.setAttr6(processDesignDO.getBrief());
BdgzsomthingDO.setAttr7(processDesignDO.getProjectName()); BdgzsomthingDO.setAttr7(processDesignDO.getProjectName());
BdgzsomthingDO.setAttr8(processDesignDO.getProjectSubName()); BdgzsomthingDO.setAttr8(processDesignDO.getProjectSubName());
BdgzsomthingDO.setAttr9(processDesignProgressDO.getRemark()); BdgzsomthingDO.setAttr9(processDesignProgressDO.getRemark());

View File

@ -1,5 +1,8 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface MaterialPlanVO { export interface MaterialPlanVO {
id: number id: number
projectMaterialPlanNo: string projectMaterialPlanNo: string
@ -42,3 +45,25 @@ export const deleteMaterialPlan = async (id: number) => {
export const exportMaterialPlan = async (params) => { export const exportMaterialPlan = async (params) => {
return await request.download({ url: `/heli/material-plan/export-excel`, 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) => { export const exportMaterialPlanBoom = async (params) => {
return await request.download({ url: `/heli/material-plan-boom/export-excel`, 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) { export async function operateProcessBom(data: ProcessBomVO) {
return await request.post({ url: `/heli/process-bom/operate`, data }) 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_PG_PLANTYPE = 'heli_pg_planType',//生产进度报表中派工是否完成状态
HELI_GRADE='heli_grade', HELI_GRADE='heli_grade',
HELI_CGTYPE='heli_cgType', 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"> <script setup lang="ts">
import { onMounted, computed, ref } from 'vue' import { onMounted, computed, ref } from "vue";
import { onLoad, onShow } from '@dcloudio/uni-app' import { onLoad, onShow } from "@dcloudio/uni-app";
import { getListAPI, getDictAPI, getListWxAPI, getTaskDetailAPI } from '@/services/productionReport' import {
import { useLoginStore } from '@/stores/modules/login' getListAPI,
import { formatDate } from '@/utils/index' getDictAPI,
getListWxAPI,
getTaskDetailAPI,
} from "@/services/productionReport";
import { useLoginStore } from "@/stores/modules/login";
import { formatDate } from "@/utils/index";
const userStore = useLoginStore() const userStore = useLoginStore();
const userId = userStore.userInfo.userId const userId = userStore.userInfo.userId;
// //
const isFinish = ref(false) const isFinish = ref(false);
// //
const isTriggered = ref(false) const isTriggered = ref(false);
// porps // porps
const props = defineProps<{ const props = defineProps<{
orderState : string orderState: string;
}>() }>();
const noticeMsg = ref('') const noticeMsg = ref("");
const isOverBeforeProcedure = async (id : number) => { const isOverBeforeProcedure = async (id: number) => {
//console.log(props.orderState) //console.log(props.orderState)
const params = { const params = {
id, id,
} };
const data = await getTaskDetailAPI(params) const data = await getTaskDetailAPI(params);
console.log(data.testYn) console.log(data.testYn);
if (data.beforeProcedureStatus == 0) { if (data.beforeProcedureStatus == 0) {
// //
noticeMsg.value = '上一道工序尚未完成报工!'; noticeMsg.value = "上一道工序尚未完成报工!";
return true; return true;
}else { } else {
return false; return false;
} }
} };
const statusText = computed(() => { const statusText = computed(() => {
const text = props.orderState == '0,1' ? '处理' : '查看' const text = props.orderState == "0,1" ? "处理" : "查看";
return text return text;
}) });
// //
const isLoading = ref(false) const isLoading = ref(false);
// //
const queryParams : Required<any> = { const queryParams: Required<any> = {
pageNo: 1, pageNo: 1,
pageSize: 5, pageSize: 5,
owner: userId, // owner: userId, //
procedureStatusList: props.orderState, // procedureStatusList: props.orderState, //
dispatchType: 'PRODUCTION', // dispatchType: "PRODUCTION", //
isReport: 1, // isReport: 1, //
//20250601/ //20250601/
subOrDetailName:'', subOrDetailName: "",
} };
const dataList = ref([]) const dataList = ref([]);
const getListData = async () => { const getListData = async () => {
if(props.orderState == '2'){ if (props.orderState == "2") {
queryParams.subOrDetailName = ''; queryParams.subOrDetailName = "";
} }
// 退 // 退
if (isLoading.value) return if (isLoading.value) return;
if (isFinish.value === true) { if (isFinish.value === true) {
return uni.showToast({ icon: 'none', title: '没有更多数据~' }) return uni.showToast({ icon: "none", title: "没有更多数据~" });
} }
isLoading.value = true isLoading.value = true;
// //
// const data = await getListAPI(queryParams) // const data = await getListAPI(queryParams)
const data = await getListWxAPI(queryParams) const data = await getListWxAPI(queryParams);
isLoading.value = false isLoading.value = false;
data.list.forEach((e) => { data.list.forEach((e) => {
e.orderTime = formatDate(e.orderTime, 'YYYY-MM-DD') e.orderTime = formatDate(e.orderTime, "YYYY-MM-DD");
e.startTime = formatDate(e.startTime, 'YYYY-MM-DD') e.startTime = formatDate(e.startTime, "YYYY-MM-DD");
e.endTime = formatDate(e.endTime, 'YYYY-MM-DD') e.endTime = formatDate(e.endTime, "YYYY-MM-DD");
}) });
// //
dataList.value.push(...data.list) dataList.value.push(...data.list);
// //
if (queryParams.pageNo < data.total) { if (queryParams.pageNo < data.total) {
// //
queryParams.pageNo++ queryParams.pageNo++;
} else { } else {
// //
isFinish.value = true isFinish.value = true;
} }
} };
const todayStr = ref(''); const todayStr = ref("");
onMounted(async () => { onMounted(async () => {
const today = new Date(); const today = new Date();
const year = today.getFullYear(); const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0'); const month = String(today.getMonth() + 1).padStart(2, "0");
const day = String(today.getDate()).padStart(2, '0'); const day = String(today.getDate()).padStart(2, "0");
todayStr.value = `${year}-${month}-${day}`; todayStr.value = `${year}-${month}-${day}`;
await getListData() await getListData();
}) });
onShow(async () => { onShow(async () => {
isFinish.value = false isFinish.value = false;
isLoading.value = false isLoading.value = false;
queryParams.pageNo = 1 queryParams.pageNo = 1;
dataList.value = [] dataList.value = [];
await getListData() await getListData();
}) });
const handleDetail = async (item) => { const handleDetail = async (item) => {
var isoverBefore = await isOverBeforeProcedure(item.id); var isoverBefore = await isOverBeforeProcedure(item.id);
if (isoverBefore == true) { if (isoverBefore == true) {
uni.showToast({ uni.showToast({
title: noticeMsg.value, title: noticeMsg.value,
icon: 'none', icon: "none",
duration: 2000, duration: 2000,
}) });
return return;
} }
const url = `/pages/productionReport/productionReport-detail?id=${item.id}` const url = `/pages/productionReport/productionReport-detail?id=${item.id}`;
uni.navigateTo({ url }) uni.navigateTo({ url });
} };
// //
const onRefresherrefresh = async () => { const onRefresherrefresh = async () => {
// //
isTriggered.value = true isTriggered.value = true;
// //
queryParams.pageNo = 1 queryParams.pageNo = 1;
dataList.value = [] dataList.value = [];
isFinish.value = false isFinish.value = false;
// //
await getListData() await getListData();
// //
isTriggered.value = false isTriggered.value = false;
} };
const searchVal = ref('') const searchVal = ref("");
// const dataListDefault = ref([]) // const dataListDefault = ref([])
const handleSearch = async (e) => { 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> </script>
<template> <template>
<view class="cont"> <view class="cont">
<view class="search" v-if="props.orderState == '0,1' "> <!-- <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="请输入项目或子项目名称" 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 --> </view> -->
<!-- <input class="uni-input" v-model="searchVal" placeholder="请输入项目或子项目名称" /> <view class="search" v-if="props.orderState == '0,1'">
<button><uni-icons type="search" size="30" class="icons" @click="handleSearch"></uni-icons></button> --> <view
</view> style="
<scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered" width: 100%;
@refresherrefresh="onRefresherrefresh" @scrolltolower="getListData"> display: flex;
<view class="item" v-for="item in dataList" :key="item.id" @click="handleDetail(item)"> align-items: center;
<view class="hd"> background: #e2f3ff;
<view class="num">派工单</view> border-radius: 20rpx;
<view class="statusLabel">{{ '(单号:'+ item.dispatchCode+') '}}</view> padding: 0 8rpx;
<view class="num">{{ '下工序:'+ (item.nextProcedureName == null ? '无':item.nextProcedureName)}}</view> height: 50px;
<!-- <view class="statusLabel " ></view> --> "
</view> >
<view class="md"> <input
<view class="product-item">项目名称{{ item.projectCode + ' ' + item.projectName }}</view> class="uni-input"
<view class="product-item">子项目{{ item.projectSubCode || '' }} {{' ' + item.projectSubName }}</view> v-model="searchVal"
<view class="product-row"> placeholder="请输入项目或子项目名称"
<view class="row-item"> :placeholder-style="'color:#28A0F8;'"
<view class="label">零件名称: {{ item.materialName }}</view> style="
</view> flex: 1;
<view class="row-item"> background: transparent;
<view class="label">派工工序: {{ item.procedureName }}</view> border: none;
</view> outline: none;
</view> font-size: 25rpx;
<view class="product-row"> color: #28a0f8;
<view class="row-item"> height: 50px;
<view class="label">派工数量</view> line-height: 50px;
<view class="val">{{ item.amount }}</view> "
</view> @input="handleSearch({ inputValue: searchVal })"
<view class="row-item"> clearable
<view class="label">总报工数量</view> />
<view class="val high-color">{{ item.totalReportAmount }}</view> <view
</view> style="
</view> background: none;
<view class="product-row"> border: none;
<view class="row-item"> padding: 0 10rpx;
<view class="label">预计工时</view> height: 50px;
<view class="val">{{ item.workTime }}</view> display: flex;
</view> align-items: center;
<view class="row-item"> "
<view class="label">总报工工时</view> @click="handleScan"
<view class="val high-color">{{ item.totalWorkTime }}</view> >
</view> <uni-icons type="scan" size="28" color="#28A0F8"></uni-icons>
</view> </view>
<view class="product-item" :style=" (item.endTime < todayStr)&&props.orderState != '2' ? 'color:red':null">预计生产日期{{ item.startTime }} {{ item.endTime }}</view> </view>
</view> </view>
<view class="statusText">{{ statusText }}</view> <scroll-view
</view> enable-back-to-top
<!-- 底部提示文字 --> scroll-y
<view class="loading-text" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"> class="data-list"
{{ isFinish ? '没有更多数据~' : '正在加载...' }} refresher-enabled
</view> :refresher-triggered="isTriggered"
</scroll-view> @refresherrefresh="onRefresherrefresh"
</view> @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> </template>
<style lang="scss"> <style lang="scss">
// //
.search { .search {
padding: 0rpx; padding: 0rpx;
width: 90%; 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 { .hd {
position: relative; padding: 10rpx;
padding: 20rpx 0; font-size: 28rpx;
margin: 20rpx 20rpx; display: flex;
border-radius: 10rpx;
background-color: #fff;
.hd { .statusLabel {
padding: 10rpx; font-size: 24rpx;
font-size: 28rpx; color: #737d88;
display: flex; }
}
.statusLabel { .md {
font-size: 24rpx; position: relative;
color: #737D88; padding: 10rpx;
} min-height: 100rpx;
} font-size: 28rpx;
border-top: 2rpx solid #f2f2f2;
.md { .product-item {
position: relative; margin: 20rpx 0;
padding: 10rpx; display: flex;
min-height: 100rpx; align-items: center;
font-size: 28rpx; color: #737d88;
border-top: 2rpx solid #F2F2F2; }
.product-item { .product-row {
margin: 20rpx 0; margin: 20rpx 0;
display: flex; display: flex;
align-items: center; flex-direction: row;
color: #737D88 justify-content: space-between;
} color: #737d88;
.product-row { .row-item {
margin: 20rpx 0; flex: 1;
display: flex;
flex-direction: row;
justify-content: space-between;
color: #737D88;
.row-item { .label {
flex: 1; margin-bottom: 10rpx;
}
.label { .val {
margin-bottom: 10rpx; color: #1d2129;
}
.val { &.high-color {
color: #1D2129; color: #00b42a;
}
}
}
}
}
&.high-color { .statusText {
color: #00B42A 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 { .status {
position: absolute; display: flex;
right: 30rpx; align-items: center;
top: 100rpx; justify-content: space-between;
border-radius: 10rpx; font-size: 28rpx;
font-size: 24rpx; color: #999;
padding: 10rpx 30rpx; margin-bottom: 15rpx;
border-radius: 10rpx;
font-size: 24rpx;
background: linear-gradient(149deg, #2DACE6 4%, #356899 98%);
color: #fff;
}
&:last-child { .date {
padding-bottom: 40rpx; color: #666;
} flex: 1;
} }
.status { .primary {
display: flex; color: #ff9240;
align-items: center; }
justify-content: space-between;
font-size: 28rpx;
color: #999;
margin-bottom: 15rpx;
.date { .icon-delete {
color: #666; line-height: 1;
flex: 1; margin-left: 10rpx;
} padding-left: 10rpx;
border-left: 1rpx solid #e3e3e3;
}
}
.primary { .goods {
color: #ff9240; display: flex;
} margin-bottom: 20rpx;
.icon-delete { .cover {
line-height: 1; width: 170rpx;
margin-left: 10rpx; height: 170rpx;
padding-left: 10rpx; margin-right: 20rpx;
border-left: 1rpx solid #e3e3e3; border-radius: 10rpx;
} overflow: hidden;
} position: relative;
.goods { .image {
display: flex; width: 170rpx;
margin-bottom: 20rpx; height: 170rpx;
}
}
.cover { .quantity {
width: 170rpx; position: absolute;
height: 170rpx; bottom: 0;
margin-right: 20rpx; right: 0;
border-radius: 10rpx; line-height: 1;
overflow: hidden; padding: 6rpx 4rpx 6rpx 8rpx;
position: relative; font-size: 24rpx;
color: #fff;
border-radius: 10rpx 0 0 0;
background-color: rgba(0, 0, 0, 0.6);
}
.image { .meta {
width: 170rpx; flex: 1;
height: 170rpx; display: flex;
} flex-direction: column;
} justify-content: center;
}
.quantity { .name {
position: absolute; height: 80rpx;
bottom: 0; font-size: 26rpx;
right: 0; color: #444;
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);
}
.meta { .type {
flex: 1; line-height: 1.8;
display: flex; padding: 0 15rpx;
flex-direction: column; margin-top: 10rpx;
justify-content: center; font-size: 24rpx;
} align-self: flex-start;
border-radius: 4rpx;
color: #888;
background-color: #f7f7f8;
}
.name { .more {
height: 80rpx; flex: 1;
font-size: 26rpx; display: flex;
color: #444; align-items: center;
} justify-content: center;
font-size: 22rpx;
color: #333;
}
}
.type { .payment {
line-height: 1.8; display: flex;
padding: 0 15rpx; justify-content: flex-end;
margin-top: 10rpx; align-items: center;
font-size: 24rpx; line-height: 1;
align-self: flex-start; padding: 20rpx 0;
border-radius: 4rpx; text-align: right;
color: #888; color: #999;
background-color: #f7f7f8; font-size: 28rpx;
} border-bottom: 1rpx solid #eee;
.more { .quantity {
flex: 1; font-size: 24rpx;
display: flex; margin-right: 16rpx;
align-items: center; }
justify-content: center;
font-size: 22rpx;
color: #333;
}
}
.payment { .amount {
display: flex; color: #444;
justify-content: flex-end; margin-left: 6rpx;
align-items: center; }
line-height: 1;
padding: 20rpx 0;
text-align: right;
color: #999;
font-size: 28rpx;
border-bottom: 1rpx solid #eee;
.quantity { .symbol {
font-size: 24rpx; font-size: 20rpx;
margin-right: 16rpx; }
} }
.amount { .action {
color: #444; display: flex;
margin-left: 6rpx; justify-content: flex-end;
} align-items: center;
padding-top: 20rpx;
.symbol { .button {
font-size: 20rpx; 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 { .secondary {
display: flex; color: #3775f6;
justify-content: flex-end; border-color: #3775f6;
align-items: center; }
padding-top: 20rpx;
.button { .primary {
width: 180rpx; color: #fff;
height: 60rpx; background-color: #3775f6;
display: flex; border-color: #3775f6;
justify-content: center; }
align-items: center; }
margin-left: 20rpx;
border-radius: 60rpx;
border: 1rpx solid #ccc;
font-size: 26rpx;
color: #444;
}
.secondary { .loading-text {
color: #3775F6; text-align: center;
border-color: #3775F6; 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'; </style>import type { stringify } from 'querystring';