零件采购

This commit is contained in:
zhy 2025-06-28 02:39:50 +08:00
parent d5f25b6f66
commit 14350a1465
9 changed files with 209 additions and 18 deletions

View File

@ -94,5 +94,8 @@ public class MaterialPlanBoomRespVO extends PageParam {
@Schema(description = "物料id")
@ExcelProperty("物料id")
private Long matId;
@Schema(description = "采购单id")
@ExcelProperty("采购单id")
private Long projectPurchaseOrderMakeId;
}

View File

@ -1,9 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailRespVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.service.partpurchaseorder.PartPurchaseOrderService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -135,4 +132,11 @@ public class PurchaseOrderMakeController {
PageResult<PartPurchaseOrderPageRespVO> pageResult = partPurchaseOrderService.getDetail(partPurchaseOrderPageReqVO);
return success(pageResult);
}
@PostMapping("/createPurchaseOrderMakeAndDetail")
@Operation(summary = "零件采购单送审生成")
// @PreAuthorize("@ss.hasPermission('heli:material-plan:query')")
public CommonResult<Boolean> createPurchaseOrderMakeAndDetail(@Valid @RequestBody List<PurchaseOrderMakeSaveReqVO> saveReqVOs) {
return success(partPurchaseOrderService.createPurchaseOrderMakeAndDetailBatch(saveReqVOs));
}
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -79,4 +80,54 @@ public class PurchaseOrderMakeSaveReqVO {
@Schema(description = "驳回原因")
private String reason;
@Schema(description = "工艺boom明细id零件类型加工件")
private Long boomDetailId;
@Schema(description = "零件名称")
private String matName;
@Schema(description = "规格型号")
private String boomSpec;
@Schema(description = "系统单位")
private String unit;
@Schema(description = "材质")
private String compositionName;
@Schema(description = "采购数量")
private BigDecimal purchaseAmount;
@Schema(description = "预计到货日期")
private LocalDateTime arriveTime;
@Schema(description = "需求数量")
private BigDecimal boomAmount;
@Schema(description = "需求到货日期")
private LocalDateTime boomArriveDate;
@Schema(description = "供应商id")
private Long supplierId;
@Schema(description = "物料需求计划id")
private Long projectMaterialPlanId;
@Schema(description = "订单子项目id")
private Long projectPlanSubId;
@Schema(description = "子项目名称")
private String projectSubName;
@Schema(description = "子项目简码")
private String projectSubNameSim;
@Schema(description = "工序id")
private Long procedureId;
@Schema(description = "理论重量")
private BigDecimal theWeight;
/**
* 责任人id
*/
private Long duEmpId;
}

View File

@ -177,4 +177,23 @@ public class MaterialPlanBoomDO extends BaseDO {
*/
@TableField(exist = false)
private String brief;
/**
* 客户id
*/
@TableField(exist = false)
private Long customerId;
/**
* 项目简码
*/
@TableField(exist = false)
private String projectNameSim;
/**
* 子项目简码
*/
@TableField(exist = false)
private String projectSubNameSim;
}

View File

@ -206,10 +206,10 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
default PageResult<MaterialPlanBoomDO> getPartsPages(MaterialPlanPageReqVO pageReqVO){
MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialPlanBoomDO.class)
.select("p.project_name as projectName","p.name as projectSubName")
.select("d.blueprint_no as blueprintNo","d.unit as unit","f.name as supplierName")
.select("p.project_name as projectName","p.name as projectSubName","p.name_sim as projectSubNameSim")
.select("d.spec as boomSpec","d.blueprint_no as blueprintNo","d.unit as unit","f.name as supplierName")
.select("a.nickname as duEmpName","c.name as procedureName","e.name as compositionName")
.select(MaterialPlanDO::getBrief)
.select(MaterialPlanDO::getBrief, MaterialPlanDO::getCustomerId, MaterialPlanDO::getProjectId, MaterialPlanDO::getProjectNameSim)
.leftJoin(MaterialPlanDO.class, "p", MaterialPlanDO::getId,MaterialPlanBoomDO::getProjectMaterialPlanId)
.leftJoin(ProcessBomDetailDO.class,"d",ProcessBomDetailDO::getId,MaterialPlanBoomDO::getBoomDetailId)
.leftJoin(AdminUserDO.class, "a", AdminUserDO::getId, MaterialPlanBoomDO::getDuEmpId)
@ -226,7 +226,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.like(!StringUtils.isEmpty(pageReqVO.getDuEmpName()), AdminUserDO::getNickname, pageReqVO.getDuEmpName())
.eq(!StringUtils.isEmpty(pageReqVO.getMatType()), MaterialPlanDO::getMatType, pageReqVO.getMatType())
.eq(!StringUtils.isEmpty(pageReqVO.getStatus()), MaterialPlanBoomDO::getIsPurYard, pageReqVO.getStatus())
.in(Objects.nonNull(pageReqVO.getMplanStatus()), MaterialPlanBoomDO::getMplanStatus, pageReqVO.getMplanStatus() != 0 ? Arrays.asList(pageReqVO.getMplanStatus()) : Arrays.asList(0, 3))
.in(Objects.nonNull(pageReqVO.getMplanStatus()), MaterialPlanBoomDO::getMplanStatus, pageReqVO.getMplanStatus() != null && pageReqVO.getMplanStatus() != 0 ? Arrays.asList(pageReqVO.getMplanStatus()) : Arrays.asList(0, 3))
.eq(Objects.nonNull(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo());
PageResult<MaterialPlanBoomDO> pageResult = selectPage(pageReqVO, query);

View File

@ -3,11 +3,7 @@ package com.chanko.yunxi.mes.module.heli.service.partpurchaseorder;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakePageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailRespVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
import java.util.List;
@ -62,4 +58,6 @@ public interface PartPurchaseOrderService {
Boolean approval(Long id);
PageResult<PartPurchaseOrderPageRespVO> getDetail(PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO);
Boolean createPurchaseOrderMakeAndDetailBatch(List<PurchaseOrderMakeSaveReqVO> updateReqVOs);
}

View File

@ -12,17 +12,22 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.Pa
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailRespVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
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.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermake.PurchaseOrderMakeMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermakedetail.PurchaseOrderMakeDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordernodetail.PurchaseOrderNoDetailMapper;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -54,6 +59,10 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
private SerialNumberService serialNumberService;
@Resource
private MaterialPlanBoomMapper materialPlanBoomMapper;
@Resource
private PlanMapper planMapper;
@Autowired
private PlanSubMapper planSubMapper;
@Override
public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) {
@ -216,4 +225,80 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
return purchaseOrderMakeDetailMapper.getDetail(partPurchaseOrderPageReqVO);
}
@Override
public Boolean createPurchaseOrderMakeAndDetailBatch(List<PurchaseOrderMakeSaveReqVO> updateReqVOs) {
updateReqVOs.forEach(updateReqVO -> {
createPurchaseOrderMakeAndDetail(updateReqVO);
});
return true;
}
public Boolean createPurchaseOrderMakeAndDetail(PurchaseOrderMakeSaveReqVO updateReqVO) {
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
// 返回
// 月度流水号
SerialNumberDO serialNumberDO = new SerialNumberDO();
serialNumberDO = serialNumberService.getSerialNumber(PURCHASE_ORDER.name(), new SimpleDateFormat("yyyyMMdd").format(new Date()));
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
// 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO);
purchaseOrderMakeDO.setPurchaseNo(PURCHASE_ORDER.getCode(serialNumberDO.getSerialNumber().toString()));
purchaseOrderMakeDO.setGoodsType(2);
purchaseOrderMakeDO.setStatus(1);
purchaseOrderMakeDO.setSubmitUserId(getLoginUser().getId());
purchaseOrderMakeDO.setSubmitTime(LocalDateTime.now());
purchaseOrderMakeDO.setProjectId(updateReqVO.getProjectId());
PlanDO planDO = planMapper.selectOne("plan_no", updateReqVO.getProjectId());
purchaseOrderMakeDO.setProjectPlanId(planDO.getId());
purchaseOrderMakeDO.setCustomerId(updateReqVO.getCustomerId());
purchaseOrderMakeDO.setBrief(updateReqVO.getBrief());
purchaseOrderMakeDO.setProjectName(updateReqVO.getProjectName());
purchaseOrderMakeDO.setProjectNameSim(updateReqVO.getProjectNameSim());
purchaseOrderMakeMapper.insert(purchaseOrderMakeDO);
long purchaseOrderMakeId = purchaseOrderMakeDO.getId();
PurchaseOrderMakeDetailDO purchaseOrderMakeDetailDO = new PurchaseOrderMakeDetailDO();
purchaseOrderMakeDetailDO.setPurchaseOrderId(purchaseOrderMakeId);
purchaseOrderMakeDetailDO.setBoomDetailId(updateReqVO.getBoomDetailId());
purchaseOrderMakeDetailDO.setBoomName(updateReqVO.getMatName());
purchaseOrderMakeDetailDO.setBoomSpec(updateReqVO.getBoomSpec());
purchaseOrderMakeDetailDO.setBoomUnit(updateReqVO.getUnit());
purchaseOrderMakeDetailDO.setComposition(updateReqVO.getCompositionName());
purchaseOrderMakeDetailDO.setPurchaseAmount(updateReqVO.getPurchaseAmount());
purchaseOrderMakeDetailDO.setEstimatedPrice(updateReqVO.getEstimatedPrice());
purchaseOrderMakeDetailDO.setArriveTime(updateReqVO.getArriveTime());
purchaseOrderMakeDetailDO.setBoomAmount(updateReqVO.getBoomAmount());
purchaseOrderMakeDetailDO.setRequireTime(updateReqVO.getBoomArriveDate());
purchaseOrderMakeDetailDO.setSupplierId(updateReqVO.getSupplierId());
purchaseOrderMakeDetailDO.setProjectMaterialPlanId(updateReqVO.getProjectMaterialPlanId());
purchaseOrderMakeDetailDO.setProjectMaterialPlanBoomId(updateReqVO.getId());
purchaseOrderMakeDetailDO.setProjectPlanSubId(updateReqVO.getProjectPlanSubId());
purchaseOrderMakeDetailDO.setName(updateReqVO.getProjectSubName());
purchaseOrderMakeDetailDO.setNameSim(updateReqVO.getProjectSubNameSim());
purchaseOrderMakeDetailDO.setOrderStatus(1);
PlanSubDO planSubDO1= planSubMapper.selectById(updateReqVO.getProjectPlanSubId());
purchaseOrderMakeDetailDO.setProjectSubCode(planSubDO1.getProjectSubCode());
purchaseOrderMakeDetailDO.setProcedureId(updateReqVO.getProcedureId());
purchaseOrderMakeDetailDO.setDescription(updateReqVO.getDescription());
purchaseOrderMakeDetailDO.setTheWeight(updateReqVO.getTheWeight());
purchaseOrderMakeDetailDO.setDuEmpId(updateReqVO.getDuEmpId());
purchaseOrderMakeDetailMapper.insert(purchaseOrderMakeDetailDO);
long purchaseOrderMakeDetailId = purchaseOrderMakeDetailDO.getId();
MaterialPlanBoomDO materialPlanBoomDO = new MaterialPlanBoomDO();
materialPlanBoomDO.setId(updateReqVO.getId());
materialPlanBoomDO.setMplanStatus(1);
materialPlanBoomDO.setProjectPurchaseOrderMakeId(purchaseOrderMakeId);
materialPlanBoomDO.setPurchaseNo(purchaseOrderMakeDO.getPurchaseNo());
materialPlanBoomDO.setProjectPurchaseOrderMakeDetailId(purchaseOrderMakeDetailId);
materialPlanBoomMapper.updateById(materialPlanBoomDO);
return true;
}
}

View File

@ -55,3 +55,8 @@ export const approval = async (id: number) => {
export const getDetail = async (params) => {
return await request.get({ url: `/heli/purchase-order-make/getDetail`, params })
}
// 零件采购单送审生成
export const createPurchaseOrderMakeAndDetail = async (params) => {
return await request.post({ url: `/heli/purchase-order-make/createPurchaseOrderMakeAndDetail`, params })
}

View File

@ -69,7 +69,7 @@
</el-button>
</template>
</el-table-column>
<el-table-column label="客户简称" align="center" prop="customerBriefName" min-width="180" />
<el-table-column label="客户简称" align="center" prop="brief" min-width="180" />
<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 min-width="200px" align="center">
@ -159,12 +159,15 @@ import { useCommonStateWithOut } from '@/store/modules/common'
import UserSelect from "@/views/heli/materialplan/userSelectNew.vue";
import {inject, ref} from "vue";
import * as MaterialPlanApi from "@/api/heli/materialplan";
import * as MaterialPlanBoomApi from "@/api/heli/materialplanboom";
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
import {ElTable} from "element-plus";
import {useUserStore} from "@/store/modules/user";
import {dateFormatter1} from "@/utils/formatTime";
import {getPartPurchasePages} from "@/api/heli/materialplan";
import SupplierSelect from "@/views/heli/hlvuestyle/supplierSelect.vue";
import {getMaterialPlanBoom} from "@/api/heli/materialplanboom";
import {createPurchaseOrderMake} from "@/api/heli/partpurchaseorder";
const formLoading = ref(false) // 12
defineOptions({ name: 'standard' })
@ -271,7 +274,8 @@ const submitForm = async () => {
return;
}
for (let i = 0; i < list.length; i++) {
let i;
for (i = 0; i < list.length; i++) {
if (list[i].purchaseAmount === null || list[i].purchaseAmount === 0) {
message.error("采购数量为0或空");
break;
@ -290,11 +294,33 @@ const submitForm = async () => {
}
}
if (i < list.length){
return;
}
// 2.
const firstSupplierId = list[0].supplierId;
if (list.some(item => item.supplierId !== firstSupplierId)) {
message.error("零件采购订单不属于同一个供应商,请确认");
// 2.
const firstProjectName = list[0].projectName;
if (list.some(item => item.projectName !== firstProjectName)) {
message.error("不同项目不能同时生成采购单");
return;
}
//3.
const checkMaterialPlans = async () => {
for (const item of list) {
const checkParams = await MaterialPlanBoomApi.getMaterialPlanBoom(item.id);
if (checkParams.projectPurchaseOrderMakeId !== null) {
message.warning("存在零件清单已生成采购订单,请刷新界面!");
return false; //
}
}
return true; //
};
//
const allValid = await checkMaterialPlans();
if (!allValid) {
//
return;
}
@ -303,7 +329,7 @@ const submitForm = async () => {
// 5.
const res = await Promise.race([
PartPurchaseOrderApi.submitForm(list),
PartPurchaseOrderApi.createPurchaseOrderMakeAndDetail(list),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("请求超时")), 30000)
)