零件采购收货

This commit is contained in:
z 2025-09-15 08:15:22 +08:00
parent c114c17a99
commit e9a3483cb1
19 changed files with 501 additions and 48 deletions

View File

@ -28,6 +28,8 @@ import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.error;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
@ -62,14 +64,24 @@ public class DeliverOrderController {
@Operation(summary = "创建发货订单")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:create')")
public CommonResult<Long> createDeliverOrder(@Valid @RequestBody DeliverOrderSaveReqVO createReqVO) {
return success(deliverOrderService.createDeliverOrder(createReqVO));
try {
return success(deliverOrderService.createDeliverOrder(createReqVO));
} catch (Exception e) {
return error(500, e.getMessage());
}
}
@PutMapping("/update")
@Operation(summary = "更新发货订单")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:update')")
public CommonResult<Boolean> updateDeliverOrder(@Valid @RequestBody DeliverOrderSaveReqVO updateReqVO) {
deliverOrderService.updateDeliverOrder(updateReqVO);
try {
deliverOrderService.updateDeliverOrder(updateReqVO);
} catch (Exception e) {
return error(500, e.getMessage());
}
return success(true);
}
@ -97,10 +109,14 @@ public class DeliverOrderController {
@Operation(summary = "操作项目订单")
@PreAuthorize("@ss.hasPermission('heli:delivery-order:update')")
@OperateLog(enable = false)
@Transactional(rollbackFor = Exception.class)
// @Transactional(rollbackFor = Exception.class)
public CommonResult<Long> operateProjectOrder(@Valid @RequestBody DeliverOrderSaveReqVO operateReqVO) {
LocalDateTime startTime = LocalDateTime.now();
deliverOrderService.operateProjectOrder(operateReqVO);
try {
deliverOrderService.operateProjectOrder(operateReqVO);
} catch (Exception e) {
return CommonResult.error(400, e.getMessage());
}
// 手动记录日志
operateLogFrameworkService.createOperateLog(request,
startTime,

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo.PurchaseOrderNoPageReqVO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -98,6 +99,13 @@ public class PurchaseOrderNoDetailController {
List<PurchaseOrderNoDetailDO> purchaseOrderNoDetail = purchaseOrderNoDetailService.getPurchaseOrderNoDetailById(id);
return success(purchaseOrderNoDetail);
}
@GetMapping("/getReceiveGoodDetail")
@Operation(summary = "获得采购订单明细分页")
@PreAuthorize("@ss.hasPermission('project:purchase-order-no-detail:query')")
public CommonResult<PageResult<PurchaseOrderNoDetailDO>> getReceiveGoodDetail(@Valid PurchaseOrderNoPageReqVO pageReqVO) {
PageResult<PurchaseOrderNoDetailDO> pageResult = purchaseOrderNoDetailService.getReceiveGoodDetail(pageReqVO);
return success(pageResult);
}
@PostMapping("/verification")
@Operation(summary = "收货校验")
@PreAuthorize("@ss.hasPermission('heli:process-bom:create')")

View File

@ -151,7 +151,8 @@ public class MaterialPlanBoomDO extends BaseDO {
//暂估价格
private BigDecimal estimatedPrice;
@TableField(exist = false)
private BigDecimal unitPrice;
//预估到时间
private LocalDateTime arriveTime;

View File

@ -65,6 +65,10 @@ public class PurchaseOrderMakeDetailDO extends BaseDO {
* 采购数量
*/
private BigDecimal purchaseAmount;
/**
* 预估单价
*/
private BigDecimal unitPrice;
/**
* 暂估价金额
*/
@ -173,8 +177,7 @@ public class PurchaseOrderMakeDetailDO extends BaseDO {
*/
@TableField(exist = false)
private String procedureName;
@TableField(exist = false)
private BigDecimal unitPrice;
/**
* 泡沫
*/

View File

@ -227,7 +227,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.select(" COALESCE(m.boom_spec, 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("COALESCE(m.the_weight, t.mat_weight) as theWeight","COALESCE(m.the_weight, t.mat_weight) as theWeight")
.select("COALESCE(m.purchase_amount, t.boom_amount) AS purchaseAmounts,m.supplier_id as supplierIds,m.estimated_price as estimatedPrices")
.select("COALESCE(m.purchase_amount, t.boom_amount) AS purchaseAmounts,m.supplier_id as supplierIds,m.estimated_price as estimatedPrices,m.unit_price as unitPrice")
.select("COALESCE(m.arrive_time, t.boom_arrive_date) as arriveTimes,COALESCE(m.description, t.description) as descriptions")
.select("m.is_foam as isFoams","m.foam_price as foamPrice")
.select("CASE \n" +

View File

@ -9,6 +9,7 @@ import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.PurchaseOrderMaterialPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo.PurchaseOrderNoPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
@ -238,4 +239,40 @@ public interface PurchaseOrderNoDetailMapper extends BaseMapperX<PurchaseOrderNo
.in(PurchaseOrderNoDetailDO::getReceivingStatus, 1,2);
return selectCount( query);
}
default PageResult<PurchaseOrderNoDetailDO> getReceiveGoodDetail(PurchaseOrderNoPageReqVO pageReqVO){
MPJLambdaWrapper<PurchaseOrderNoDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderNoDetailDO.class)
.select("t.composition as compositionName","t.purchase_rem_amount as purchaseRemAmounts","mat.code as matCode","pro.name as procedureName","bom.blueprint_no as blueprintNo","psub.id as projectSubId")
.select("ROUND(t.estimated_price / t.purchase_amount, 1) as unitPrice","bom.spec as matSpec")
.leftJoin(PurchaseOrderNoDO.class, "pb", PurchaseOrderNoDO::getId, PurchaseOrderBoomDO::getPurchaseOrderId)
.leftJoin(SupplierDO.class, "s", SupplierDO::getId, PurchaseOrderNoDO::getSupplierId)
.leftJoin(ProcessBomDetailDO.class,"bom", ProcessBomDetailDO::getId, PurchaseOrderNoDetailDO::getBoomDetailId)
.leftJoin(MaterialPlanBoomDO.class,"plan", MaterialPlanBoomDO::getId, PurchaseOrderNoDetailDO::getProjectMaterialPlanBoomId)
.leftJoin(ProcedureDO.class,"pro", ProcedureDO::getId, PurchaseOrderNoDetailDO::getProcedureId)
.leftJoin(CompositionDO.class, "com", CompositionDO::getId, PurchaseOrderNoDetailDO::getComposition)
.leftJoin(ProjectOrderSubDO.class,"sub",ProjectOrderSubDO::getId, PurchaseOrderNoDetailDO::getProjectPlanSubId)
.leftJoin(MaterialDO.class,"mat",MaterialDO::getId,PurchaseOrderNoDetailDO::getMaterialId)
.leftJoin(PlanSubDO.class,"psub",PlanSubDO::getProjectSubCode, PurchaseOrderNoDetailDO::getProjectSubCode)
.leftJoin(MaterialPlanDO.class, "m", MaterialPlanDO::getId, PurchaseOrderNoDO::getProjectMaterialPlanId)
.leftJoin(AdminUserDO.class,"u", AdminUserDO::getId, PurchaseOrderNoDetailDO::getDuEmpId)
.leftJoin(AdminUserDO.class,"u1", AdminUserDO::getId, PurchaseOrderNoDO::getCreator)
.disableSubLogicDel()
.groupBy(MaterialPlanDetailDO::getId);
query.like(!StringUtils.isEmpty(pageReqVO.getPurchaseNo()), PurchaseOrderDO::getPurchaseNo, pageReqVO.getPurchaseNo())
.like(!StringUtils.isEmpty(pageReqVO.getSupplierName()), "s.brief", pageReqVO.getSupplierName())
.like(!StringUtils.isEmpty(pageReqVO.getMaterialPlanNo()), "m.project_material_plan_no", pageReqVO.getMaterialPlanNo())
.eq(pageReqVO.getStatus() != null, PurchaseOrderNoDO::getStatus, pageReqVO.getStatus())
.eq(pageReqVO.getReceivingStatus() != null, PurchaseOrderNoDetailDO::getReceivingStatus, pageReqVO.getReceivingStatus())
.eq(pageReqVO.getPurchaseType() != null, PurchaseOrderNoDO::getPurchaseType, pageReqVO.getPurchaseType())
.eq(pageReqVO.getGoodsType() != null, PurchaseOrderNoDO::getGoodsType, pageReqVO.getGoodsType())
.like(!StringUtils.isEmpty(pageReqVO.getProjectName()), PurchaseOrderNoDetailDO::getProjectName, pageReqVO.getProjectName())
.like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), PurchaseOrderNoDetailDO::getName, pageReqVO.getProjectSubName())
.like(!StringUtils.isEmpty(pageReqVO.getUsername()), AdminUserDO::getNickname, pageReqVO.getUsername())
.like(!ObjectUtil.isEmpty(pageReqVO.getBoomName()), PurchaseOrderNoDetailDO::getBoomName, pageReqVO.getBoomName())
.like(!ObjectUtil.isEmpty(pageReqVO.getProcedureName()), ProcedureDO::getName, pageReqVO.getProcedureName())
.like(!ObjectUtil.isEmpty(pageReqVO.getBlueprintNo()), ProcessBomDetailDO::getBlueprintNo, pageReqVO.getBlueprintNo())
.orderByDesc(PurchaseOrderNoDetailDO::getCreateTime);
return selectPage(pageReqVO, query);
}
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.service.deliverorder;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import javax.validation.*;
@ -22,14 +23,14 @@ public interface DeliverOrderService {
* @param createReqVO 创建信息
* @return 编号
*/
Long createDeliverOrder(@Valid DeliverOrderSaveReqVO createReqVO);
Long createDeliverOrder(@Valid DeliverOrderSaveReqVO createReqVO) throws IOException;
/**
* 更新发货订单
*
* @param updateReqVO 更新信息
*/
void updateDeliverOrder(@Valid DeliverOrderSaveReqVO updateReqVO);
void updateDeliverOrder(@Valid DeliverOrderSaveReqVO updateReqVO) throws IOException;
/**
* 删除发货订单
@ -66,7 +67,7 @@ public interface DeliverOrderService {
*/
List<DeliverOrderSubDO> getDeliverOrderSubListByDeliveryOrderId(Long deliveryOrderId);
void operateProjectOrder(DeliverOrderSaveReqVO operateReqVO);
void operateProjectOrder(DeliverOrderSaveReqVO operateReqVO) throws IOException ;
List<StorageMatDO> operateProjectOrders(DeliverOrderSaveReqVO operateReqVO);

View File

@ -39,6 +39,7 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@ -85,8 +86,8 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long createDeliverOrder(DeliverOrderSaveReqVO createReqVO) {
// @Transactional(rollbackFor = Exception.class)
public Long createDeliverOrder(DeliverOrderSaveReqVO createReqVO) throws IOException{
if(OperateTypeEnum.valueOf(createReqVO.getActive()) == OperateTypeEnum.DELIVER){
// 超额校验
@ -134,8 +135,8 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateDeliverOrder(DeliverOrderSaveReqVO updateReqVO) {
// @Transactional(rollbackFor = Exception.class)
public void updateDeliverOrder(DeliverOrderSaveReqVO updateReqVO) throws IOException{
// 校验存在
DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId());
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive());
@ -166,7 +167,7 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
}
}
private void overageDeliverValidate(String saleOrderIds, List<DeliverOrderSubDO> thisTimeSubs) {
private void overageDeliverValidate(String saleOrderIds, List<DeliverOrderSubDO> thisTimeSubs) throws IOException {
List<DeliverOrderSubDO> thisTimeRelaSubList = thisTimeSubs.stream().filter(deliverOrderSubDO -> deliverOrderSubDO.getSaleOrderSubId() != null).collect(Collectors.toList());
if(!thisTimeRelaSubList.isEmpty()){
@ -197,16 +198,29 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
Map<Long, List<DeliverOrderSubDO>> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
// 关联额度-历史发货额度-本次发货额度 >= 0 则可通过
boolean allDeliverable = relaProjectOrderSubList.stream().allMatch(relaSub -> {
int relaAmount = relaSub.getAmount();
List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(relaSub.getId());
// boolean allDeliverable = relaProjectOrderSubList.stream().allMatch(relaSub -> {
// int relaAmount = relaSub.getAmount();
// List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(relaSub.getId());
// int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum();
// int thisTimeAmount = thisTimeSubsGroupBySaleSubId.get(relaSub.getId()).get(0).getAmount();
// return relaAmount-historyDeliveredAmount-thisTimeAmount >= 0;
// });
for (ProjectOrderSubDO projectOrderSubDO : relaProjectOrderSubList) {
int relaAmount = projectOrderSubDO.getAmount();
List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(projectOrderSubDO.getId());
int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum();
int thisTimeAmount = thisTimeSubsGroupBySaleSubId.get(relaSub.getId()).get(0).getAmount();
return relaAmount-historyDeliveredAmount-thisTimeAmount >= 0;
});
if(!allDeliverable){
throw exception(DELIVER_AMOUNT_OVERFLOW);
int thisTimeAmount = thisTimeSubsGroupBySaleSubId.get(projectOrderSubDO.getId()).get(0).getAmount();
if (relaAmount-historyDeliveredAmount-thisTimeAmount <0){
System.out.println("子项目"+projectOrderSubDO.getName());
System.out.println("已发货"+historyDeliveredAmount);
System.out.println(",本次发货"+thisTimeAmount);
System.out.println(",总数量"+relaAmount);
throw new RuntimeException("子项目"+projectOrderSubDO.getName()+"已发货"+historyDeliveredAmount+",本次发货"+thisTimeAmount+",大于总数量"+relaAmount);
}
}
// if(!allDeliverable){
// throw exception(DELIVER_AMOUNT_OVERFLOW);
// }
}
}
@ -304,8 +318,8 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void operateProjectOrder(DeliverOrderSaveReqVO operateReqVO) {
// @Transactional(rollbackFor = Exception.class)
public void operateProjectOrder(DeliverOrderSaveReqVO operateReqVO) throws IOException {
if(operateReqVO.getId() == null){
createDeliverOrder(operateReqVO);
}else{
@ -313,7 +327,7 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
}
}
@Override
@Transactional(rollbackFor = Exception.class)
// @Transactional(rollbackFor = Exception.class)
public List<StorageMatDO> operateProjectOrders(DeliverOrderSaveReqVO operateReqVO) {
operateReqVO.getId();
//定义存储剩余零件的List集合

View File

@ -230,7 +230,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
materialPlanBoomDOs.forEach(materialPlanBoom -> {
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", materialPlanBoom.getId())
.set("mplan_status", 3)
.set("mplan_status", updateReqVO.getStatus())
.set("project_purchase_order_make_id", null)
.set("purchase_no", null)
.set("project_purchase_order_make_detail_id", null)
@ -467,6 +467,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
purchaseOrderMakeDetailDO.setBoomName(updateReqVO.getMatName());
purchaseOrderMakeDetailDO.setBoomSpec(updateReqVO.getBoomSpec());
purchaseOrderMakeDetailDO.setBoomUnit(updateReqVO.getUnit());
purchaseOrderMakeDetailDO.setUnitPrice(updateReqVO.getUnitPrice());
purchaseOrderMakeDetailDO.setComposition(updateReqVO.getCompositionName());
purchaseOrderMakeDetailDO.setPurchaseAmount(updateReqVO.getPurchaseAmounts());
purchaseOrderMakeDetailDO.setEstimatedPrice(updateReqVO.getEstimatedPrices());

View File

@ -4,6 +4,7 @@ import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo.PurchaseOrderNoPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail.vo.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.storage.StorageController;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
@ -72,4 +73,6 @@ public interface PurchaseOrderNoDetailService {
Long getReceivingGoodsMessage();
CommonResult<Boolean> updateFrom(PurchaseOrderNoDetailDO detailDO);
PageResult<PurchaseOrderNoDetailDO> getReceiveGoodDetail(PurchaseOrderNoPageReqVO pageReqVO);
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo.PurchaseOrderNoPageReqVO;
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.material.MaterialDO;
@ -587,4 +588,10 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
return CommonResult.success(true);
}
@Override
public PageResult<PurchaseOrderNoDetailDO> getReceiveGoodDetail(PurchaseOrderNoPageReqVO pageReqVO) {
return purchaseOrderNoDetailMapper.getReceiveGoodDetail(pageReqVO);
}
}

View File

@ -91,3 +91,6 @@ export const exportOutsourcing = async (params) => {
export const updateFrom= async (data) => {
return await request.post({ url: `/heli/purchase-order-no-detail/updateFrom`, data })
}
export const getReceiveGoodDetail = async (params) => {
return await request.get({ url: `/heli/purchase-order-no-detail/getReceiveGoodDetail`, params })
}

View File

@ -218,7 +218,7 @@
<template #header> <span class="hl-table_header">*</span>重量(T)</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.weight`" :rules="subFormRules.weight" class="mb-0px!">
<el-input :disabled="detailDisabled || flag" v-model="row.weight" @blur="yunFei()" placeholder="请输入重量(T)" />
<el-input :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.weight" @blur="yunFei()" placeholder="请输入重量(T)" />
</el-form-item>
</template>
</el-table-column>
@ -272,7 +272,7 @@
<template #header> <span class="hl-table_header">*</span>名称 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="subFormRules.name" class="mb-0px!">
<el-input :disabled="detailDisabled || flag" v-model="row.name" />
<el-input :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.name" />
</el-form-item>
</template>
</el-table-column>
@ -280,7 +280,7 @@
<template #header> <span class="hl-table_header">*</span>所属类型 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subType`" :rules="subFormRules.subType" class="mb-0px!">
<el-select :disabled="detailDisabled || flag" v-model="row.subType" placeholder="请选择子项类型">
<el-select :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.subType" placeholder="请选择子项类型">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.HELI_DELIVER_MATERIAL_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -290,7 +290,7 @@
<template #header> <span class="hl-table_header">*</span>本次发货数量 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input-number :disabled="detailDisabled || row.id || flag" v-model="row.amount" placeholder="请输入本次发货数量" style="width: 100%" :min="1" :precision="0"/><!-- :precision="0" -->
<el-input-number :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.amount" placeholder="请输入本次发货数量" style="width: 100%" :min="1" :precision="0"/><!-- :precision="0" -->
</el-form-item>
</template>
</el-table-column>
@ -298,7 +298,7 @@
<template #header> <span class="hl-table_header">*</span>单位 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!">
<el-select :disabled="detailDisabled || flag" v-model="row.unit" placeholder="请选择单位">
<el-select :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.unit" placeholder="请选择单位">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -307,13 +307,13 @@
<el-table-column label="备注" min-width="150" align="center">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input :disabled="detailDisabled || flag" v-model="row.remark" placeholder="请输入备注" />
<el-input :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1" link type="danger" size="small" @click.prevent="onDeleteItem2(scope.$index)">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1 &&formData.deliverStatus != 2" link type="danger" size="small" @click.prevent="onDeleteItem2(scope.$index)">
删除
</el-button>
</template>

View File

@ -145,11 +145,20 @@
</el-select>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center" prop="unitPrice">
<template #header><span class="hl-table_header">*</span>预估单价</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unitPrice`" class="mb-0px!" >
<el-input-number v-model="row.unitPrice" type="number" :precision="2" @change="changeUnitPrice(row)" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center" prop="estimatedPrices">
<template #header><span class="hl-table_header">*</span>预估总价</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.estimatedPrices`" class="mb-0px!" >
<el-input-number v-model="row.estimatedPrices" type="number" :precision="2" />
<el-input-number v-model="row.estimatedPrices" type="number" :precision="2" @change="changeEstimatedPrices(row)"
/>
</el-form-item>
</template>
</el-table-column>
@ -189,6 +198,15 @@
</el-table-column>
<el-table-column label="打回原因" align="center" prop="rejRemark" min-width="120" />
<el-table-column label="采购单号" align="center" prop="purchaseNo" min-width="120" />
<el-table-column fixed="right" label="操作" align="center" min-width="100" >
<template #default="scope">
<el-button
v-if="scope.row.mplanStatus==1" link type="danger"
size="small" @click="handleDelete(scope.row.projectPurchaseOrderMakeDetailId)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
@ -208,7 +226,7 @@ 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 {ElButton, ElTable, ElTableColumn} from "element-plus";
import {useUserStore} from "@/store/modules/user";
import * as supplierApi from "@/api/heli/supplier";
const formLoading = ref(false) // 12
@ -258,7 +276,22 @@ const queryParams1 = reactive({
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
const data={
id:id,
status:0
}
//
await PartPurchaseOrderApi.updatePurchaseOrderMakeNo(data)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 查询列表 */
const getList = async () => {
loading.value = true
@ -394,6 +427,13 @@ const floatMul = (a, b) => {
} catch (f) {}
return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}
const changeUnitPrice =(row:any)=>{
row.estimatedPrices=parseFloat((row.unitPrice* row.purchaseAmounts).toFixed(1))
}
const changeEstimatedPrices =(row:any)=>{
row.unitPrice=parseFloat((row.estimatedPrices/row.purchaseAmounts).toFixed(1))
}
const change1 =(row:any)=>{
if (flag.value) {
var bomDetails = list.value;
@ -490,6 +530,10 @@ const submitForm = async () => {
message.error("预计到货日期为空");
break;
}
if (list[i].unitPrice === null) {
message.error("预估单价为空");
break;
}
if (list[i].estimatedPrices === null) {
message.error("预估总价为空");
break;

View File

@ -31,6 +31,7 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
status:3,
reason: undefined,
})
const formRules = reactive({

View File

@ -80,7 +80,7 @@ class="!w-250px" :disabled="alterDisabled || detailDisabled || priceDisabled"
<el-form-item label="项目开始日期" prop="projectStartTime">
<el-date-picker
class="!w-250px" v-model="formData.projectStartTime"
type="date" value-format="x" placeholder="选择项目开始日期"
type="date" value-format="x" placeholder="选择项目开始日期" @change="changeTime"
:disabled="alterDisabled || detailDisabled || priceDisabled" />
</el-form-item>
</el-col>
@ -189,7 +189,8 @@ class="!w-250px" v-model="formData.businessMan"
class="!w-250px"
:class="{ 'alter-class': fieldHasAlter('projectEndTime') }"
v-model="formData.projectEndTime" type="date" value-format="x"
placeholder="选择项目结束日期" :disabled="detailDisabled || priceDisabled" />
placeholder="选择项目结束日期" :disabled="detailDisabled || priceDisabled"
@change="changeTime"/>
<span
style="position: absolute; left: 0; top: 30px"
v-if="formData.projectStartTime && formData.projectEndTime">{{
@ -1609,6 +1610,13 @@ type="textarea" v-model="formData.activeOpinion" placeholder="请输入打回原
//
formLoading.value = true
try {
if(formData.value.projectStartTime&&formData.value.projectEndTime ){
var endTime = new Date(formData.value.projectEndTime);
if(new Date(formData.value.projectStartTime).getTime() > endTime.getTime()) {
message.error("项目开始日期不能大于项目结束日期,请确认!")
return
}
}
// 退
if (active != 'REPULSE') {
formData.value.activeOpinion = ''
@ -1775,7 +1783,14 @@ type="textarea" v-model="formData.activeOpinion" placeholder="请输入打回原
// console.log('', successfulUploadsCount.value)
}
const changeTime = () =>{
if(formData.value.projectStartTime&&formData.value.projectEndTime ){
var endTime = new Date(formData.value.projectEndTime);
if(new Date(formData.value.projectStartTime).getTime() > endTime.getTime()) {
message.error("项目开始日期不能大于项目结束日期,请确认!")
}
}
}
//
const handleError = (error: Error, file: UploadUserFile) => {
failedUploadsCount.value++

View File

@ -96,7 +96,7 @@
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="receiveGoods()" type="primary" size="large" >收货</el-button>
<!-- <el-button @click="receiveGoods()" type="primary" size="large" >收货</el-button>-->
<el-button @click="isPrint()" type="primary" size="large" :loading="printLoading">打印</el-button>
<el-button @click="deleteForm()" type="danger" size="large" >删除</el-button>
<el-button @click="cancel" size="large"> </el-button>

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="purchaseNo">-->
<!-- <el-input-->
<!--v-model="queryParams.purchaseNo" 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="supplierName">
<el-input
v-model="queryParams.supplierName" placeholder="供应商" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="责任人" prop="username">
<el-input
v-model="queryParams.username" placeholder="责任人" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="收货状态" prop="receivingStatus">
<el-select v-model="queryParams.receivingStatus" placeholder="下拉选择" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PURCHASE_RECEIVING_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="零件" prop="boomName">
<el-input
v-model="queryParams.boomName" placeholder="请输入零件" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="工序" prop="procedureName">
<el-input
v-model="queryParams.procedureName" placeholder="请输入工序" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="图号" prop="blueprintNo">
<el-input
v-model="queryParams.blueprintNo" placeholder="请输入图号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item style="margin-left:50px">
<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>
<!-- 列表 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">订单明细</span>
<el-button style="margin-left: 20px" @click="receiveGoods" type="success" size="large">收货</el-button>
</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" :stripe="true" :show-overflow-tooltip="true" class="hl-table" ref="multipleTable" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="收货状态" align="center" prop="receivingStatus" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PURCHASE_RECEIVING_STATUS" :value="scope.row.receivingStatus" />
</template>
</el-table-column>
<el-table-column prop="projectSubCode" min-width="150" label="子项目编码" align="center"/>
<el-table-column prop="blueprintNo" min-width="100" label="图号" align="center"/>
<el-table-column prop="boomName" min-width="120" label="零件名称" align="center"/>
<el-table-column prop="procedureName" min-width="120" label="工序" align="center"/>
<el-table-column prop="compositionName" min-width="100" label="材质" align="center"/>
<el-table-column prop="purchaseAmount" min-width="100" label="采购数量" align="center" />
<el-table-column prop="purchaseRemAmount" min-width="100" label="剩余数量" align="center"/>
<el-table-column prop="purchaseAmount" min-width="180" align="center">
<template #header><span class="hl-table_header">*</span>入库数量</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.purchaseRemAmounts`" class="mb-0px!">
<el-input-number style="width: 100%" v-model="scope.row.purchaseRemAmounts" placeholder="入库数量" :min="0" :precision="2" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="estimatedPrice" min-width="180" label="预估总价(元)" align="center">
<template #header><span class="hl-table_header">*</span>预估总价()</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.estimatedPrice`" class="mb-0px!">
<el-input-number style="width: 100%" v-model="scope.row.estimatedPrice" placeholder="预估总价" :min="0" :precision="2" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="requireTime" min-width="150" label="需要完成日期" align="center" :formatter="dateFormatter1"/>
<el-table-column prop="arriveTime" min-width="150" label="预计到货日期" align="center" :formatter="dateFormatter1" />
<el-table-column prop="description" min-width="150" label="技术要求" align="center"/>
<el-table-column prop="theWeight" min-width="100" label="理论重量" align="center"/>
<el-table-column label="操作" align="center" fixed="right" min-width="200">
<template #default="scope">
<el-button link type="primary" v-if="scope.row.receivingStatus!=3" @click="receiveGood(scope.row)">
收货
</el-button>
<el-button link type="primary" @click="updateFrom(scope.row)" v-if="scope.row.receivingStatus==3">
总价修改
</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>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import download from '@/utils/download'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
import * as PurchaseOrderNoApi from '@/api/heli/purchaseorderno'
import { ElTable } from 'element-plus'
import {useUserStore} from "@/store/modules/user";
import routeParamsCache from '@/utils/routeParamsCache'
import {dateFormatter1, dateFormatter2} from "@/utils/formatTime";
import * as PurchaseOrderNoDetailApi from "@/api/heli/purchaseordernodetail";
defineOptions({ name: 'purchaseordernopartReceived' })
const userStore = useUserStore()
const username = userStore.getUser.nickname
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,
id: undefined,
ids: undefined,
purchaseNo: undefined,
supplierId: undefined,
contractNo: undefined,
purchaseType: undefined,
projectMaterialPlanId: undefined,
goodsType: 2,
currencyType: undefined,
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
submitUserId: undefined,
submitTime: [],
auditor: undefined,
auditTime: [],
description: undefined,
creator: undefined,
createTime: undefined,
receivingStatus:1,
projectName:undefined,
projectSubName:undefined,
username:username,
supplierName:undefined,
boomName:undefined,
blueprintNo:undefined,
procedureName:undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
queryParams.ids = undefined
const data = await PurchaseOrderNoDetailApi.getReceiveGoodDetail(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const updateFrom = async (row) => {
await PurchaseOrderNoDetailApi.updateFrom(row)
loading.value = true;
message.success("修改成功");
getList(); //
emit('success');
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const multipleTable: any = ref<InstanceType<typeof ElTable>>()
const multipleSelection: any = ref([])
const handleSelectionChange = (val: PurchaseOrderApi.PurchaseOrderVO[]) => {
multipleTable.value = val
}
const receiveGood = async (row) => {
multipleTable.value=[]
multipleTable.value.push(row)
receiveGoods();
}
const receiveGoods = async () => {
try {
const list = multipleTable.value|| []; //
// 1.
if (!list || list.length==null||list.length==0) {
message.error("采购单信息未选择,请确认");
return;
}
for (let i = 0; i < list.length; i++) {
if (list[i].purchaseRemAmounts==null||list[i].purchaseRemAmounts==0){
message.error("零件"+list[i].boomName+"入库数量为空或数量为0,请确认")
return
}
if (list[i].estimatedPrice==null||list[i].estimatedPrice==0){
message.error("零件"+list[i].boomName+"预估总价为空或数量为0,请确认")
return
}
}
await PurchaseOrderNoDetailApi.verification(list)
const res = await Promise.race([
PurchaseOrderNoDetailApi.receiveGoods(list),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("请求超时")), 30000)
)
]);
loading.value = true;
message.success("收货成功");
getList(); //
emit('success');
} catch (error) {
} finally {
loading.value = false;
}
}
/** 初始化 **/
const route = useRoute()
const routeValue = ref('')
onMounted(async () => {
getList()
})
</script>

View File

@ -55,11 +55,26 @@ class="!w-260px" v-model="formData.requiredCompletedDate" type="date" value-form
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="formData.remark" :disabled="true" />
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="备注" prop="remark">-->
<!-- <el-input type="textarea" v-model="formData.remark" :disabled="true" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="6">
<el-form-item label="客户名称" prop="customerName">
<el-input class="!w-260px" v-model="formData.customerName" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="项目名称" prop="projectName">
<el-input class="!w-260px" v-model="formData.projectName" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="子项目名称" prop="projectSubName">
<el-input class="!w-260px" v-model="formData.projectSubName" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<!-- <el-card class="hl-card-info" v-if="dispatchType == 'ASSEMBLE'">-->
@ -716,7 +731,10 @@ const formData = ref({
taskDispatchDetails: [],
operateLogs: [],
active: undefined,
activeOpinion: ''
activeOpinion: '',
customerName:undefined,
projectSubName:undefined,
projectName:undefined
})
const formRef = ref() // Ref