添加批量审批

This commit is contained in:
z 2025-09-12 20:36:40 +08:00
parent ee32488786
commit c114c17a99
16 changed files with 515 additions and 218 deletions

View File

@ -269,6 +269,20 @@ public class ProcessBomController {
public CommonResult<Boolean> withdraw(@RequestParam("code") String code) { public CommonResult<Boolean> withdraw(@RequestParam("code") String code) {
return processBomService.withdraw(code); return processBomService.withdraw(code);
} }
@GetMapping("/updateById")
@Operation(summary = "修改生产任务单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:process-bom:query')")
public CommonResult<Boolean> updateById(@RequestParam("code") String code) {
return processBomService.updateById(code);
}
@GetMapping("/selectPlanTaskStatus")
@Operation(summary = "查看生产任务单状态")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:process-bom:query')")
public CommonResult<Boolean> selectPlanTaskStatus(@RequestParam("id") String id) {
return processBomService.selectPlanTaskStatus(id);
}
@GetMapping("/exportStandard") @GetMapping("/exportStandard")
@Operation(summary = "导出标准件物料需求计划Excel") @Operation(summary = "导出标准件物料需求计划Excel")
@OperateLog(type = EXPORT) @OperateLog(type = EXPORT)

View File

@ -171,9 +171,9 @@ public class PurchaseOrderMakeController {
public CommonResult<Boolean> rejects(@RequestParam("id") Long id) { public CommonResult<Boolean> rejects(@RequestParam("id") Long id) {
return success(partPurchaseOrderService.rejects(id)); return success(partPurchaseOrderService.rejects(id));
} }
@GetMapping("/approvals") @PostMapping("/approvals")
@Operation(summary = "采购单批准") @Operation(summary = "采购单批准")
public CommonResult<Boolean> approvals(@RequestParam("id") Long id) { public CommonResult<Boolean> approvals(@Valid @RequestBody List<PurchaseOrderMakeDetailDO> list) {
return success(partPurchaseOrderService.approvals(id)); return success(partPurchaseOrderService.approvals(list));
} }
} }

View File

@ -139,15 +139,19 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
// 校验存在 // 校验存在
DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId()); DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId());
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive()); OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive());
if(!oldDO.canOperate(operateTypeEnum)){ // if(!oldDO.canOperate(operateTypeEnum)){
throw exception(INVALID_OPERATE); // throw exception(INVALID_OPERATE);
} // }
// 超额校验
overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
// 更新 // 更新
DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class); DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class);
updateObj.setDeliverStatus(DeliverOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode()); updateObj.setDeliverStatus(DeliverOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode());
if (oldDO.getDeliverStatus()==2){
updateObj.setDeliverStatus(2);
}else {
// 超额校验
overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
}
deliverOrderMapper.updateById(updateObj); deliverOrderMapper.updateById(updateObj);
updateReqVO.setDeliverStatus(updateObj.getDeliverStatus()); updateReqVO.setDeliverStatus(updateObj.getDeliverStatus());

View File

@ -7,6 +7,7 @@ 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.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO; 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; import java.util.List;
@ -68,7 +69,7 @@ public interface PartPurchaseOrderService {
Long countReview(); Long countReview();
Boolean approvals(Long id); Boolean approvals(List<PurchaseOrderMakeDetailDO> list);
Boolean rejects(Long id); Boolean rejects(Long id);
} }

View File

@ -20,6 +20,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; 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.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO; 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.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
@ -29,6 +30,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper; 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.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermake.PurchaseOrderMakeMapper; 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.purchaseordermakedetail.PurchaseOrderMakeDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
@ -50,10 +52,8 @@ import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.Date; import java.util.stream.Collectors;
import java.util.List;
import java.util.Objects;
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.security.core.util.SecurityFrameworkUtils.getLoginUser; import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
@ -84,6 +84,8 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
private OrderYfService orderYfService; private OrderYfService orderYfService;
@Autowired @Autowired
private SupplierMapper supplierMapper; private SupplierMapper supplierMapper;
@Autowired
private ProcessBomDetailMapper processBomDetailMapper;
@Override @Override
public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) { public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) {
@ -190,16 +192,41 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
@Override @Override
public boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO) { public boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO) {
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO(); // PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
purchaseOrderMakeDO.setId(updateReqVO.getId()); // purchaseOrderMakeDO.setId(updateReqVO.getId());
purchaseOrderMakeDO.setStatus(3); // purchaseOrderMakeDO.setStatus(3);
purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO); // purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO); // purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO);
//
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>(); // LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId()); // wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId());
purchaseOrderMakeDetailMapper.delete(wrapper); // purchaseOrderMakeDetailMapper.delete(wrapper);
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", updateReqVO.getId()); // List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", updateReqVO.getId());
// materialPlanBoomDOs.forEach(materialPlanBoom -> {
// UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
// updateWrapper.eq("id", materialPlanBoom.getId())
// .set("mplan_status", 3)
// .set("project_purchase_order_make_id", null)
// .set("purchase_no", null)
// .set("project_purchase_order_make_detail_id", null)
// .set("rej_remark", updateReqVO.getReason());
// materialPlanBoomMapper.update(updateWrapper);
// });
// return true;
PurchaseOrderMakeDetailDO orderMakeDetailDO = purchaseOrderMakeDetailMapper.selectById(updateReqVO.getId());
if (ObjectUtil.isNotEmpty(orderMakeDetailDO)){
if (orderMakeDetailDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(orderMakeDetailDO.getPurchaseOrderId());
purchaseOrderMakeDetailMapper.deleteById(orderMakeDetailDO);
if (ObjectUtil.isNotEmpty(orderMakeDO)){
LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, orderMakeDO.getId());
if (purchaseOrderMakeDetailMapper.selectCount(wrapper) == 0){
purchaseOrderMakeMapper.deleteById(orderMakeDO.getId());
}
}
}
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", updateReqVO.getId());
materialPlanBoomDOs.forEach(materialPlanBoom -> { materialPlanBoomDOs.forEach(materialPlanBoom -> {
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>(); UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", materialPlanBoom.getId()) updateWrapper.eq("id", materialPlanBoom.getId())
@ -207,11 +234,14 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
.set("project_purchase_order_make_id", null) .set("project_purchase_order_make_id", null)
.set("purchase_no", null) .set("purchase_no", null)
.set("project_purchase_order_make_detail_id", null) .set("project_purchase_order_make_detail_id", null)
.set("rej_remark", updateReqVO.getReason()); .set("estimated_price", BigDecimal.ZERO)
.set("supplier_id", null)
.set("rej_remark", updateReqVO.getReason())
.set("mat_rest",null);
materialPlanBoomMapper.update(updateWrapper); materialPlanBoomMapper.update(updateWrapper);
}); });
return true; return true;
} }
@Override @Override
@ -307,7 +337,20 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
purchaseOrderMakeMapper.insert(purchaseOrderMakeDO); purchaseOrderMakeMapper.insert(purchaseOrderMakeDO);
long purchaseOrderMakeId = purchaseOrderMakeDO.getId(); long purchaseOrderMakeId = purchaseOrderMakeDO.getId();
String purchaseOrderMakeDOPurchaseNo = purchaseOrderMakeDO.getPurchaseNo(); String purchaseOrderMakeDOPurchaseNo = purchaseOrderMakeDO.getPurchaseNo();
Map<Long, String> groupedResult = updateReqVOs.stream()
.collect(Collectors.groupingBy(
MaterialPlanBoomDO::getBoomDetailId, // 根据 boomDetailId 分组
Collectors.collectingAndThen(
Collectors.toList(), // 将同组元素收集为 List
list -> list.get(0).getBoomSpec() // 取第一个元素的 boomSpec
)
));
groupedResult.forEach((boomDetailId, boomSpec) -> {
LambdaUpdateWrapper<ProcessBomDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(ProcessBomDetailDO::getId,boomDetailId);
lambdaUpdateWrapper.set(ProcessBomDetailDO::getSpec, boomSpec);
processBomDetailMapper.update(lambdaUpdateWrapper);
});
updateReqVOs.forEach(updateReq -> { updateReqVOs.forEach(updateReq -> {
createPurchaseOrderMakeAndDetail(updateReq,purchaseOrderMakeId, purchaseOrderMakeDOPurchaseNo,planDO.getId()); createPurchaseOrderMakeAndDetail(updateReq,purchaseOrderMakeId, purchaseOrderMakeDOPurchaseNo,planDO.getId());
}); });
@ -357,22 +400,31 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
} }
@Override @Override
public Boolean approvals(Long id) { public Boolean approvals(List<PurchaseOrderMakeDetailDO> list) {
PurchaseOrderMakeDetailDO orderMakeDetailDO = purchaseOrderMakeDetailMapper.selectById(id); if (ObjectUtil.isNotEmpty( list)){
if (ObjectUtil.isNotEmpty(orderMakeDetailDO)){ List<Long> ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList());
if (orderMakeDetailDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!")); LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
orderMakeDetailDO.setStatus(2); wrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
orderMakeDetailDO.setAuditTime(LocalDateTime.now()); wrapper.ne(PurchaseOrderMakeDetailDO::getStatus,1);
orderMakeDetailDO.setAuditor(getLoginUser().getId()); if (purchaseOrderMakeDetailMapper.selectCount(wrapper) > 0) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
purchaseOrderMakeDetailMapper.updateById(orderMakeDetailDO); LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
updateWrapper.set(PurchaseOrderMakeDetailDO::getStatus,2);
updateWrapper.set(PurchaseOrderMakeDetailDO::getAuditTime, LocalDateTime.now());
updateWrapper.set(PurchaseOrderMakeDetailDO::getAuditor, getLoginUser().getId());
purchaseOrderMakeDetailMapper.update(updateWrapper);
LambdaUpdateWrapper<MaterialPlanBoomDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(MaterialPlanBoomDO::getProjectPurchaseOrderMakeDetailId, ids);
lambdaUpdateWrapper.set(MaterialPlanBoomDO::getMplanStatus,2);
materialPlanBoomMapper.update(lambdaUpdateWrapper);
// List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", id);
// materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
// MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
// materialPlanBoom.setId(materialPlanBoomDO.getId());
// materialPlanBoom.setMplanStatus(2);
// materialPlanBoomMapper.updateById(materialPlanBoom);
// });
} }
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", id);
materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
materialPlanBoom.setId(materialPlanBoomDO.getId());
materialPlanBoom.setMplanStatus(2);
materialPlanBoomMapper.updateById(materialPlanBoom);
});
return true; return true;
} }

View File

@ -116,4 +116,8 @@ public interface ProcessBomService {
BigDecimal assemblyLaborCost(Long id, Long projectSubId); BigDecimal assemblyLaborCost(Long id, Long projectSubId);
CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo); CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo);
CommonResult<Boolean> updateById(String code);
CommonResult<Boolean> selectPlanTaskStatus(String id);
} }

View File

@ -13,6 +13,7 @@ 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;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
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.security.core.util.SecurityFrameworkUtils; import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomImportExcelVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomImportExcelVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO;
@ -29,6 +30,7 @@ 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.purchaseordernodetail.PurchaseOrderNoDetailDO;
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.shenhe.ShenheDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.shenhe.ShenheDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
@ -51,6 +53,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService; import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService;
@ -65,6 +68,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper; import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper;
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 org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -85,6 +89,7 @@ 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.framework.common.pojo.CommonResult.success;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.MATERIAL_PLAN; 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.*;
@ -486,10 +491,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<PlanTaskBomDO> planTaskBomDOS = planTaskBomMapper.selectList(wrapper); List<PlanTaskBomDO> planTaskBomDOS = planTaskBomMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(planTaskBomDOS)){ if (ObjectUtil.isNotEmpty(planTaskBomDOS)){
List<Long> collect = planTaskBomDOS.stream().map(PlanTaskBomDO::getTaskId).distinct().collect(Collectors.toList()); List<Long> collect = planTaskBomDOS.stream().map(PlanTaskBomDO::getTaskId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty( collect)){
LambdaQueryWrapper<PlanTaskDO> planTaskDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PlanTaskDO> planTaskDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
planTaskDOLambdaQueryWrapper.in(PlanTaskDO::getId, collect); planTaskDOLambdaQueryWrapper.in(PlanTaskDO::getId, collect);
planTaskDOLambdaQueryWrapper.eq(PlanTaskDO::getStatus, 2); planTaskDOLambdaQueryWrapper.eq(PlanTaskDO::getStatus, 2);
if (planTaskMapper.selectCount(planTaskDOLambdaQueryWrapper) > 0) throw exception(new ErrorCode(1_007_9999,"该生产任务单状态已提交请先取消再修改BOM")); if (planTaskMapper.selectCount(planTaskDOLambdaQueryWrapper) > 0) throw exception(new ErrorCode(1_007_9999,"该生产任务单状态已提交请先取消再修改BOM"));
}
} }
//标准件不管材质非标准件材质必填 //标准件不管材质非标准件材质必填
@ -559,13 +567,21 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper); List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
if (ObjectUtil.isNotEmpty(list)){ if (ObjectUtil.isNotEmpty(list)){
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList()); List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty( collect)) {
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect); wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper); List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(detailDOS)) {
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList()); List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect1)) {
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1); taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改零件名称")); if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper) > 0)
throw exception(new ErrorCode(1_007_9988, "物料" + po.getMaterialName() + "已报工,不允许修改零件名称"));
}
}
}
} }
} }
if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) { if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) {
@ -578,14 +594,19 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper); List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
if (ObjectUtil.isNotEmpty(list)){ if (ObjectUtil.isNotEmpty(list)){
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList()); List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect)){
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect); wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper); List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList()); List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect1)){
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1); taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改图号")); if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改图号"));
} }
}
}
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus()); vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
} }
if (!vo.getAmount().equals(po.getAmount())) { if (!vo.getAmount().equals(po.getAmount())) {
@ -595,11 +616,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper); List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
if (ObjectUtil.isNotEmpty(list)){ if (ObjectUtil.isNotEmpty(list)){
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList()); List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty( collect)){
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect); wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
wrapper.eq(TaskDispatchDetailDO::getProcedureStatus, 2); wrapper.eq(TaskDispatchDetailDO::getProcedureStatus, 2);
if (taskDispatchDetailMapper.selectCount(wrapper)>0) throw exception(new ErrorCode(1_007_9998,"该零件"+po.getMaterialName()+"工序已报工完成,不允许修改")); if (taskDispatchDetailMapper.selectCount(wrapper)>0) throw exception(new ErrorCode(1_007_9998,"该零件"+po.getMaterialName()+"工序已报工完成,不允许修改"));
} }
}
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus()); vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
} }
} }
@ -1530,6 +1553,26 @@ public class ProcessBomServiceImpl implements ProcessBomService {
return CommonResult.error(400,"boom明细不存在,请刷新页面"); return CommonResult.error(400,"boom明细不存在,请刷新页面");
} }
@Override
public CommonResult<Boolean> updateById(String code) {
LambdaUpdateWrapper<PlanTaskDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(PlanTaskDO::getProcessBomId, code);
wrapper.set(PlanTaskDO ::getStatus,1);
planTaskMapper.update(wrapper);
return success( true);
}
@Override
public CommonResult<Boolean> selectPlanTaskStatus(String id) {
LambdaQueryWrapper<PlanTaskDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlanTaskDO::getProcessBomId, id);
PlanTaskDO planTaskDO = planTaskMapper.selectOne(lambdaQueryWrapper);
if (ObjectUtil.isNotEmpty(planTaskDO)){
if (planTaskDO.getStatus()==2) return CommonResult.success(true);
}
return success(false);
}
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();

View File

@ -73,6 +73,6 @@ export const obtainReviewDetails = async (id:number) => {
export const rejects = async (id:number) => { export const rejects = async (id:number) => {
return await request.get({ url: `/heli/purchase-order-make/rejects?id=` +id }) return await request.get({ url: `/heli/purchase-order-make/rejects?id=` +id })
} }
export const approvals = async (id: number) => { export const approvals = async (data) => {
return await request.get({ url: `/heli/purchase-order-make/approvals?id=` + id }) return await request.post({ url: `/heli/purchase-order-make/approvals`,data })
} }

View File

@ -104,3 +104,9 @@ export const planBZJPage = async (params) => {
export const delMaterialPlan = async (id: number,projectMaterialPlanNo:string) => { export const delMaterialPlan = async (id: number,projectMaterialPlanNo:string) => {
return await request.delete({ url: `/heli/process-bom/delMaterialPlan?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo}) return await request.delete({ url: `/heli/process-bom/delMaterialPlan?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo})
} }
export const updateById = async (code) => {
return await request.get({ url: `/heli/process-bom/updateById?code=` + code })
}
export const selectPlanTaskStatus = async (id) => {
return await request.get({ url: `/heli/process-bom/selectPlanTaskStatus?id=` + id })
}

View File

@ -243,7 +243,7 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" min-width="100"> <el-table-column label="操作" align="center" min-width="100">
<template #default="scope"> <template #default="scope">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1" link type="danger" size="small" @click.prevent="onDeleteItem(scope.$index)"> <el-button v-if="'update,create,deliver'.indexOf(active) > -1 &&formData.deliverStatus != 2" link type="danger" size="small" @click.prevent="onDeleteItem(scope.$index)">
删除 删除
</el-button> </el-button>
</template> </template>
@ -344,7 +344,7 @@
<el-table-column prop="createTime" align="center" label="上传时间" :formatter="dateFormatter" /> <el-table-column prop="createTime" align="center" label="上传时间" :formatter="dateFormatter" />
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)"> <el-button v-if="'update,create,deliver'.indexOf(active) > -1 && formData.deliverStatus != 2" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
删除 删除
</el-button> </el-button>
<el-button v-if="!!scope.row.id" link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)"> <el-button v-if="!!scope.row.id" link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)">
@ -362,9 +362,9 @@
<template #header> <template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span> <div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="goback" size="large" style="margin-left: 5rem"> </el-button> <el-button @click="goback" size="large" style="margin-left: 5rem"> </el-button>
<el-button v-if="active != 'detail' && formData.deliverStatus == 1" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button> <el-button v-if="active != 'detail'" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="(((active != 'detail' && formData.id) || active == 'deliver') && formData.deliverStatus == 1)" @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"> </el-button> <el-button v-if="(((active != 'detail' && formData.id) || active == 'deliver') && formData.deliverStatus == 1)" @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="active == 'detail' && formData.deliverStatus == 2 && formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button> <el-button v-if=" formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button>
</template> </template>
<el-row> <el-row>
<el-col> <el-col>
@ -912,7 +912,7 @@ const queryData = async (type: string, id?: number) => {
dialogTitle.value = t('action.' + type) dialogTitle.value = t('action.' + type)
// //
formLoading.value = true formLoading.value = true
formData.value.deliverDate = new Date().getTime() // formData.value.deliverDate = new Date().getTime()
try { try {
if (id) { if (id) {
formData.value = await DeliverOrderApi.getDeliverOrder(id) formData.value = await DeliverOrderApi.getDeliverOrder(id)

View File

@ -0,0 +1,80 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" @close="cancel">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="驳回原因" prop="reason">
<el-input type="textarea" :rows="5" v-model="formData.reason" placeholder="请输入驳回原因" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
import {updatePurchaseOrderMakeNo} from "@/api/heli/partpurchaseorder";
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
reason: undefined,
})
const formRules = reactive({
reason: [{ required: true, message: '驳回原因不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (id?: number) => {
dialogVisible.value = true
resetForm()
formData.value.id=id
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
dialogVisible.value = false
await PartPurchaseOrderApi.updatePurchaseOrderMakeNo(formData.value)
//
message.success("驳回成功");
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
reason:undefined,
}
formRef.value?.resetFields()
}
</script>

View File

@ -64,16 +64,23 @@
</el-form> </el-form>
</ContentWrap> </ContentWrap>
<!-- 列表 --> <el-card class="hl-card-info">
<ContentWrap> <template #header>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table" show-summary :summary-method="getSummaries"> <el-button style="margin-left: 20px" @click="approves()" type="success" size="large">全部审核</el-button>
</template>
<el-row>
<el-col>
<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" show-summary :summary-method="getSummaries" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName">
<el-table-column type="selection" width="70"/>
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" /> <el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
<el-table-column label="送审日期" align="center" prop="createTime" min-width="150px" :formatter="dateFormatter1"/> <el-table-column label="送审日期" align="center" prop="createTime" min-width="150px" :formatter="dateFormatter1"/>
<el-table-column label="客户简称" align="center" prop="brief" min-width="100px" /> <!-- <el-table-column label="客户简称" align="center" prop="brief" min-width="100px" />-->
<el-table-column label="子项目编码" align="center" prop="projectSubCode" min-width="250px" /> <el-table-column label="子项目编码" align="center" prop="projectSubCode" min-width="250px" />
<el-table-column label="图号" align="center" prop="blueprintNo" min-width="120px" /> <el-table-column label="图号" align="center" prop="blueprintNo" min-width="120px" />
<el-table-column label="零件名称" align="center" prop="boomName" min-width="180px" /> <el-table-column label="零件名称" align="center" prop="boomName" min-width="180px" />
<el-table-column label="规格" align="center" prop="boomSpec" min-width="120px" /> <el-table-column label="规格" align="center" prop="boomSpec" min-width="120px" />
<el-table-column label="材料" align="center" prop="composition" min-width="120px" />
<el-table-column label="工序" align="center" prop="procedureName" min-width="120px" /> <el-table-column label="工序" align="center" prop="procedureName" min-width="120px" />
<el-table-column label="需求数量" align="center" prop="boomAmount" min-width="100px" /> <el-table-column label="需求数量" align="center" prop="boomAmount" min-width="100px" />
<el-table-column label="采购数量" align="center" prop="purchaseAmount" min-width="100px" fixed="right" /> <el-table-column label="采购数量" align="center" prop="purchaseAmount" min-width="100px" fixed="right" />
@ -93,11 +100,11 @@
v-if="scope.row.status != 2" v-if="scope.row.status != 2"
link link
type="primary" type="primary"
@click="approve(scope.row.id)" @click="approve(scope.row)"
> >
审核 审核
</el-button> </el-button>
<el-button link type="danger" @click="reject(scope.row.id)" v-if="scope.row.status != 2"> <el-button link type="danger" @click="openForm(scope.row.id)" v-if="scope.row.status != 2">
驳回 驳回
</el-button> </el-button>
</template> </template>
@ -106,22 +113,32 @@
<!-- 分页 --> <!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" /> @pagination="getList" />
</ContentWrap> </el-form>
</el-col>
</el-row>
</el-card>
<Form ref="formRef" @success="getList" />
</el-card> </el-card>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict' import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as MaterialPlanApi from '@/api/heli/materialplan' import * as MaterialPlanApi from '@/api/heli/materialplan'
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder"; import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
import Form from "./Form.vue"
import {dateFormatter1} from "@/utils/formatTime"; import {dateFormatter1} from "@/utils/formatTime";
import {approvals, review} from "@/api/heli/partpurchaseorder"; import {ref} from "vue";
import {ElTable, ElTableColumn} from "element-plus";
defineOptions({ name: 'PartPurchaseCheck' }) defineOptions({ name: 'PartPurchaseCheck' })
const router = useRouter() const router = useRouter()
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
const formLoading = ref(false) // 12
const updateParams = reactive({
id: undefined,
reason: undefined
})
const loading = ref(true) // const loading = ref(true) //
const list = ref([]) // const list = ref([]) //
@ -155,6 +172,7 @@ const queryParams = reactive({
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
const multipleTable = ref<InstanceType<typeof ElTable>>()
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
@ -162,27 +180,77 @@ const getList = async () => {
try { try {
const data = await PartPurchaseOrderApi.getPartCheckPages(queryParams) const data = await PartPurchaseOrderApi.getPartCheckPages(queryParams)
list.value = data.list list.value = data.list
list.value.forEach(item=>{
item.isSelected=false
})
total.value = data.total total.value = data.total
} finally { } finally {
loading.value = false loading.value = false
} }
} }
const approve = async (id:number) => { const approve = async (row) => {
await PartPurchaseOrderApi.approvals(id) multipleTable.value=[]
message.success("审批成功"); multipleTable.value.push(row)
getList(); approves();
}
const approves = async () => {
try{
const list = multipleTable.value|| []; //
// 1.
if (!list || list.length==null) {
message.error("提交明细不能为空,请确认");
return;
}
formLoading.value = true;
// 5.
const res = await Promise.race([
PartPurchaseOrderApi.approvals(list),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("请求超时")), 30000)
)
]);
message.success("审批成功");
getList(); //
emit('success');
} catch (error) {
console.error("提交失败:", error);
} finally {
formLoading.value = false;
} }
const reject = async (id:number) => {
await PartPurchaseOrderApi.rejects(id)
message.success("驳回成功");
getList();
} }
/** 添加/修改操作 */
const formRef = ref()
const openForm = (id?: number) => {
formRef.value.open( id)
}
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {
queryParams.pageNo = 1 queryParams.pageNo = 1
getList() getList()
} }
const handleSelectionChange = (val) => {
// isSelected false
list.value.forEach(row => {
row.isSelected = false;
});
// isSelected true
val.forEach(selectedRow => {
//
const targetRow = list.value.find(row => row.id === selectedRow.id);
if (targetRow) {
targetRow.isSelected = true;
}
});
multipleTable.value=val
}
const tableRowClassName = ({ row }) => {
return row.isSelected ? 'selected-row' : '';
}
const getSummaries = (param: SummaryMethodProps) => { const getSummaries = (param: SummaryMethodProps) => {
const summaryField = ["boomAmount","purchaseAmount","estimatedPrice"]; const summaryField = ["boomAmount","purchaseAmount","estimatedPrice"];
const { columns, data } = param; const { columns, data } = param;
@ -256,28 +324,28 @@ const floatMul = (a, b) => {
} }
/** 添加/修改操作 */ /** 添加/修改操作 */
const openForm = (type: string, id?: number) => { // const openForm = (type: string, id?: number) => {
//
switch (type) { // switch (type) {
case 'create': // case 'create':
router.push({ path: '/purchase/materialplanadd', query: { id: id } }) // router.push({ path: '/purchase/materialplanadd', query: { id: id } })
break; // break;
case 'update': // case 'update':
router.push({ path: '/purchase/materialplanedit', query: { id: id } }) // router.push({ path: '/purchase/materialplanedit', query: { id: id } })
break; // break;
case 'detail': // case 'detail':
router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} }) // router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
// window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self'); // // window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
break; // break;
case 'check': // case 'check':
router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} }) // router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
// window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self'); // // window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
break; // break;
default: // default:
break; // break;
} // }
//
} // }
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (id: number) => { const handleDelete = async (id: number) => {
@ -297,7 +365,12 @@ const userInit = ref()
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
// //
// userInit.value = await UserApi.getSimpleUserList()
getList() getList()
}) })
</script> </script>
<style>
.selected-row {
background-color: #ffe6cc !important;
}
</style>

View File

@ -5,15 +5,15 @@
<table border="2" cellspacing="0" id="table" style="height: 27.2cm;"> <table border="2" cellspacing="0" id="table" style="height: 27.2cm;">
<tbody> <tbody>
<tr> <tr>
<td colspan="2"> <td colspan="2" >
<div style="width: 100px; text-align: center"> <div style="width: 100px; text-align: center">
<img :src="logoDataUrl" style="width: 100%" alt="" /> <img :src="logoDataUrl" style="width: 100%" alt="" />
</div> </div>
</td> </td>
<td colspan="6"> <td colspan="6" >
<span style="font-size: 20px; font-weight: 700">模具生产计划单</span> <span style="font-size: 20px; font-weight: 700">模具生产计划单</span>
</td> </td>
<td colspan="2" style="padding: 5px 0"> <td colspan="2" style="padding: 5px 0;" >
<div style="border-bottom: 1px solid #666; padding-bottom: 5px;font-size: 16px" >项目编号</div> <div style="border-bottom: 1px solid #666; padding-bottom: 5px;font-size: 16px" >项目编号</div>
<div style="padding-top: 5px; font-size: 16px" >{{ formData.code }}</div> <div style="padding-top: 5px; font-size: 16px" >{{ formData.code }}</div>
</td> </td>
@ -22,10 +22,9 @@
<tbody class="masterClass"> <tbody class="masterClass">
<tr> <tr>
<td colspan="2" style="font-size: 16px"> 客户名称 </td> <td colspan="2" style="font-size: 16px"> 客户名称 </td>
<td colspan="5"> <td colspan="6">
<span style="font-size: 16px">{{ formData.customerName }}</span> <span style="font-size: 16px">{{ formData.customerName }}({{ formData.customer.brief}})</span>
</td> </td>
<td colspan="1" style="font-size: 16px">{{ formData.customer.brief }}</td>
<td style="font-size: 16px"> 编码 </td> <td style="font-size: 16px"> 编码 </td>
<td style="font-size: 16px">{{ formData.customer.code }} </td> <td style="font-size: 16px">{{ formData.customer.code }} </td>
</tr> </tr>
@ -41,12 +40,12 @@
</tr> </tr>
<tr> <tr>
<td colspan="2" style="font-size: 16px"> 项目工期 </td> <td colspan="2" style="font-size: 16px"> 项目工期 </td>
<td colspan="1" style="padding: 0 5px"> </td> <td colspan="1" style="padding: 0 5px; width: 40px"> </td>
<td colspan="1" style="min-width: 70px;">{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</td> <td colspan="1" style="min-width: 90px; font-size: 16px">{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</td>
<td colspan="1" style="min-width: 70px;"></td> <td colspan="1" style="min-width: 70px;"></td>
<td colspan="1" style="min-width: 70px;">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td> <td colspan="1" style="min-width: 90px; font-size: 16px ">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td>
<td style="min-width: 70px;">天数</td> <td style="min-width: 70px;">天数</td>
<td colspan="1">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) +1 }}</td> <td colspan="1" width="60px">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) +1 }}</td>
<td colspan="1"> 是否有价格 </td> <td colspan="1"> 是否有价格 </td>
<td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.hasPrice) }} </td> <td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.hasPrice) }} </td>
</tr> </tr>
@ -117,17 +116,25 @@
</tr> </tr>
<tr> <tr>
<td class="xh"> 序号 </td> <td class="xh"> 序号 </td>
<td colspan="3"> 名称/编号 </td> <td colspan="2"> 名称 </td>
<td> 设备型号 </td> <td> 设备型号 </td>
<td> 数量 </td> <td> 数量 </td>
<td> 主要材料 </td> <td> 主要材料 </td>
<td style="width:160px"> 毛坯日期 </td> <td colspan="2"> 毛坯日期 </td>
<td> 2D/日期 </td> <td> 2D/日期 </td>
<td> 3D/日期 </td> <td> 3D/日期 </td>
<!-- <td class="xh" style="width:10%" > 序号 </td>-->
<!-- <td colspan="3" style="width: 15%"> 名称/编号 </td>-->
<!-- <td style="width: 10%"> 设备型号 </td>-->
<!-- <td style="width: 10%"> 数量 </td>-->
<!-- <td style="width: 10%"> 主要材料 </td>-->
<!-- <td style="width: 50%"> 毛坯日期 </td>-->
<!-- <td style="width: 10%"> 2D/日期 </td>-->
<!-- <td style="width: 10%"> 3D/日期 </td>-->
</tr> </tr>
<tr v-for="(item,idx) in formData.projectOrderSubs.slice(0, 6)" :key="idx"> <tr v-for="(item,idx) in formData.projectOrderSubs" :key="idx">
<td class="xh"> {{ idx+1 }} </td> <td class="xh"> {{ idx+1 }} </td>
<td colspan="3" style="padding: 0 0"> <td colspan="2" style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between"> <div style="display: flex; flex-direction: column; justify-content: space-between">
<span> {{item.name}} </span> <span> {{item.name}} </span>
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>--> <!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
@ -138,7 +145,7 @@
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td> <td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>
<td>{{item.amount}} </td> <td>{{item.amount}} </td>
<td>{{ item.compositionName }} </td> <td>{{ item.compositionName }} </td>
<td> <td colspan="2">
<span v-if="!item.blankDate"> &nbsp;</span> <span v-if="!item.blankDate"> &nbsp;</span>
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span> <span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>
</td> </td>
@ -167,27 +174,26 @@
<tbody v-if="formData.projectOrderSubs.length<6"> <tbody v-if="formData.projectOrderSubs.length<6">
<tr v-for="item in (6-formData.projectOrderSubs.length)" :key="item"> <tr v-for="item in (6-formData.projectOrderSubs.length)" :key="item">
<td> {{item+(formData.projectOrderSubs.length)}}</td> <td> {{item+(formData.projectOrderSubs.length)}}</td>
<td colspan="3">&nbsp; </td> <td colspan="2">&nbsp; </td>
<td> &nbsp; </td> <td> &nbsp; </td>
<td> &nbsp; </td> <td> &nbsp; </td>
<td>&nbsp; </td> <td>&nbsp; </td>
<td> &nbsp; </td> <td colspan="2"> &nbsp; </td>
<td> &nbsp; </td> <td> &nbsp; </td>
<td>&nbsp; </td> <td>&nbsp; </td>
</tr> </tr>
</tbody> </tbody>
<tbody class="masterClass"> <tbody>
<tr> <tr>
<td class="xh"> 序号 </td> <td class="xhs"> 序号 </td>
<td colspan="2" style="width: 200px"> 工艺流程 </td> <td colspan="2"> 工艺流程 </td>
<td colspan="2"> 开始日期 </td> <td colspan="2"> 开始日期 </td>
<td colspan="2"> 结束日期 </td> <td colspan="2"> 结束日期 </td>
<td> 责任人 </td> <td> 责任人 </td>
<td colspan="2"> 备注 </td> <td colspan="2"> 备注 </td>
</tr> </tr>
<tr v-for="(its,index) in planData.craftInfos" :key="its.index"> <tr v-for="(its,index) in planData.craftInfos" :key="its.index">
<td class="xh"> {{ index+1 }} </td> <td class="xhs"> {{ index+1 }} </td>
<td colspan="2"> {{ its.name }}</td> <td colspan="2"> {{ its.name }}</td>
<td colspan="2"> <td colspan="2">
@ -215,7 +221,7 @@ style="
"> ">
<span>说明:</span> <span>说明:</span>
<span>1.每个项目的零部件制作工艺材料材质硬度要求必须统一出现任何问题各工程师负责!</span> <span>1.每个项目的零部件制作工艺材料材质硬度要求必须统一出现任何问题各工程师负责!</span>
<span>2.模具调试试模需要根据客户要求自己安排调试我司根据需要安排人员参与配合</span> <!-- <span>2.模具调试试模需要根据客户要求自己安排调试我司根据需要安排人员参与配合</span>-->
</div> </div>
</td> </td>
</tr> </tr>
@ -259,9 +265,9 @@ style="
</tbody> </tbody>
</table> </table>
<div v-if="formData.projectOrderSubs.length>6"> <!-- <div v-if="formData.projectOrderSubs.length>6">-->
<!-- 附页是否开启需要判断 根据子项目信息--> <!-- &lt;!&ndash; 附页是否开启需要判断 根据子项目信息&ndash;&gt;-->
<table border="2" cellspacing="0" id="table" style="height:27.2cm;"> <!-- <table border="2" cellspacing="0" id="table" style="height:27.2cm;">-->
<!-- <tbody >--> <!-- <tbody >-->
<!-- <tr>--> <!-- <tr>-->
<!-- <td colspan="2">--> <!-- <td colspan="2">-->
@ -318,24 +324,24 @@ style="
<!-- </td>--> <!-- </td>-->
<!-- </tr>--> <!-- </tr>-->
<tbody > <!-- <tbody >-->
<tr> <!-- <tr>-->
<td colspan="10" style="height: 30px"> <!-- <td colspan="10" style="height: 30px">-->
<div style="text-align: left; width: 100%">子项目信息:</div> <!-- <div style="text-align: left; width: 100%">子项目信息:</div>-->
</td> <!-- </td>-->
</tr> <!-- </tr>-->
<tr> <!-- <tr>-->
<td class="xh" style="width:20%" > 序号 </td> <!-- <td class="xh" style="width:20%" > 序号 </td>-->
<td colspan="3" style="width: 25%"> 名称/编号 </td> <!-- <td colspan="3" style="width: 25%"> 名称/编号 </td>-->
<td style="width: 10%"> 设备型号 </td> <!-- <td style="width: 10%"> 设备型号 </td>-->
<td style="width: 10%"> 数量 </td> <!-- <td style="width: 10%"> 数量 </td>-->
<td style="width: 10%"> 主要材料 </td> <!-- <td style="width: 10%"> 主要材料 </td>-->
<td style="width: 10%"> 毛坯日期 </td> <!-- <td style="width: 10%"> 毛坯日期 </td>-->
<td style="width: 10%"> 2D/日期 </td> <!-- <td style="width: 10%"> 2D/日期 </td>-->
<td style="width: 10%"> 3D/日期 </td> <!-- <td style="width: 10%"> 3D/日期 </td>-->
</tr> <!-- </tr>-->
</tbody> <!-- </tbody>-->
<tbody> <!-- <tbody>-->
<!-- <tr v-for="(item, idx) in formData.projectOrderSubs.slice(6)" :key="idx">--> <!-- <tr v-for="(item, idx) in formData.projectOrderSubs.slice(6)" :key="idx">-->
<!-- <td class="xh"> {{ idx+7 }} </td>--> <!-- <td class="xh"> {{ idx+7 }} </td>-->
<!-- <td colspan="3" style="padding: 0 0">--> <!-- <td colspan="3" style="padding: 0 0">-->
@ -373,56 +379,56 @@ style="
<!-- </div>--> <!-- </div>-->
<!-- </td>--> <!-- </td>-->
<!-- </tr>--> <!-- </tr>-->
<tr v-for="(item,idx) in formData.projectOrderSubs.slice(6)" :key="idx" > <!--<tr v-for="(item,idx) in formData.projectOrderSubs.slice(6)" :key="idx" >-->
<td class="xh"> {{ idx+7 }} </td> <!-- <td class="xh"> {{ idx+7 }} </td>-->
<td colspan="3" style="padding: 0 0"> <!-- <td colspan="3" style="padding: 0 0">-->
<div style="display: flex; flex-direction: column; justify-content: space-between"> <!-- <div style="display: flex; flex-direction: column; justify-content: space-between">-->
<span> {{item.name}} </span> <!-- <span> {{item.name}} </span>-->
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>--> <!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
<!-- <span v-if="!item.projectSubShortName">&nbsp;</span>--> <!-- <span v-if="!item.projectSubShortName">&nbsp;</span>-->
<!-- <span v-else style="font-size: 10px">{{ formData.code+'-'+formData.customer.code+'-'+ item.projectSubShortName}}</span>--> <!-- <span v-else style="font-size: 10px">{{ formData.code+'-'+formData.customer.code+'-'+ item.projectSubShortName}}</span>-->
</div> <!-- </div>-->
</td> <!-- </td>-->
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td> <!-- <td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>-->
<td>{{item.amount}} </td> <!-- <td>{{item.amount}} </td>-->
<td>{{ item.compositionName }} </td> <!-- <td>{{ item.compositionName }} </td>-->
<td> <!-- <td>-->
<span v-if="!item.blankDate"> &nbsp;</span> <!-- <span v-if="!item.blankDate"> &nbsp;</span>-->
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span> <!-- <span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>-->
</td> <!-- </td>-->
<td style="padding: 0 0"> <!-- <td style="padding: 0 0">-->
<div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px"> <!-- <div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">-->
<span v-if="!item.twoDimDate" style="border-bottom: 1px solid #666">&nbsp;</span> <!-- <span v-if="!item.twoDimDate" style="border-bottom: 1px solid #666">&nbsp;</span>-->
<span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.twoDimDate), 'YYYY-MM-DD') }} </span> <!-- <span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.twoDimDate), 'YYYY-MM-DD') }} </span>-->
<span v-if="userInit.find((user) => user.id === item.twoDimOwner)?.nickname">{{ userInit.find((user) => user.id == item.twoDimOwner)?.nickname }}</span> <!-- <span v-if="userInit.find((user) => user.id === item.twoDimOwner)?.nickname">{{ userInit.find((user) => user.id == item.twoDimOwner)?.nickname }}</span>-->
<span v-else>&nbsp;</span> <!-- <span v-else>&nbsp;</span>-->
</div> <!-- </div>-->
</td> <!-- </td>-->
<td style="padding: 0 0"> <!-- <td style="padding: 0 0">-->
<div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px"> <!-- <div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">-->
<span v-if="!item.threeDimDate" style="border-bottom: 1px solid #666">&nbsp;</span> <!-- <span v-if="!item.threeDimDate" style="border-bottom: 1px solid #666">&nbsp;</span>-->
<span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.threeDimDate), 'YYYY-MM-DD') }} </span> <!-- <span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.threeDimDate), 'YYYY-MM-DD') }} </span>-->
<span v-if="userInit.find((user) => user.id === item.threeDimOwner)?.nickname"> <!-- <span v-if="userInit.find((user) => user.id === item.threeDimOwner)?.nickname">-->
{{ userInit.find((user) => user.id === item.threeDimOwner)?.nickname }} <!-- {{ userInit.find((user) => user.id === item.threeDimOwner)?.nickname }}-->
</span> <!-- </span>-->
<span v-else>&nbsp;</span> <!-- <span v-else>&nbsp;</span>-->
</div> <!-- </div>-->
</td> <!-- </td>-->
</tr> <!--</tr>-->
</tbody> <!-- </tbody>-->
<tbody> <!-- <tbody>-->
<tr v-for="item in num" :key="item"> <!-- <tr v-for="item in num" :key="item">-->
<td> {{item+(formData.projectOrderSubs.length)}}</td> <!-- <td> {{item+(formData.projectOrderSubs.length)}}</td>-->
<td colspan="3">&nbsp; </td> <!-- <td colspan="3">&nbsp; </td>-->
<td> &nbsp; </td> <!-- <td> &nbsp; </td>-->
<td> &nbsp; </td> <!-- <td> &nbsp; </td>-->
<td>&nbsp; </td> <!-- <td>&nbsp; </td>-->
<td> &nbsp; </td> <!-- <td> &nbsp; </td>-->
<td> &nbsp; </td> <!-- <td> &nbsp; </td>-->
<td>&nbsp; </td> <!-- <td>&nbsp; </td>-->
</tr> <!-- </tr>-->
</tbody> <!-- </tbody>-->
<!-- <tbody>--> <!-- <tbody>-->
<!-- <tr>--> <!-- <tr>-->
@ -480,8 +486,8 @@ style="
<!-- </td>--> <!-- </td>-->
<!-- </tr>--> <!-- </tr>-->
<!-- </tbody>--> <!-- </tbody>-->
</table> <!-- </table>-->
</div> <!-- </div>-->
</div> </div>
<template #footer> <template #footer>
<!-- 打印 --> <!-- 打印 -->
@ -589,6 +595,9 @@ const onPrint = () => {
width: 50px !important; width: 50px !important;
} }
.xh { .xh {
height: 40px !important;
}
.xhs {
height: 20px !important; height: 20px !important;
} }
.checkbox { .checkbox {
@ -613,7 +622,6 @@ const onPrint = () => {
document.body.removeChild(newIframe) // document.body.removeChild(newIframe) //
dialogVisible.value = false dialogVisible.value = false
}, 100) }, 100)
} }
// const onPrint = () => { // const onPrint = () => {
// const printNode = document.querySelector('.print-wrap'); // const printNode = document.querySelector('.print-wrap');

View File

@ -367,23 +367,21 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict' import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime' import { dateFormatter} from '@/utils/formatTime'
import BomImportForm from './bomImportForm.vue' import BomImportForm from './bomImportForm.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { inject } from 'vue' import { inject } from 'vue'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { useCommonStore } from '@/store/modules/common' import { useCommonStore } from '@/store/modules/common'
import MaterialSelect from '@/views/heli/hlvuestyle/materialSelect.vue'
import CompositionSelect from '@/views/heli/hlvuestyle/compositionSelect.vue' import CompositionSelect from '@/views/heli/hlvuestyle/compositionSelect.vue'
import * as ProcessBomApi from '@/api/heli/processbom' import * as ProcessBomApi from '@/api/heli/processbom'
import * as storageApi from '@/api/heli/storage' import * as storageApi from '@/api/heli/storage'
import { getOperateLogPage } from '@/api/system/operatelog' import { getOperateLogPage } from '@/api/system/operatelog'
import { deleteProcessBomDetail } from "@/api/heli/processbom";
import printDialog from './printDialog.vue' import printDialog from './printDialog.vue'
import { UploadUserFile } from 'element-plus' import { UploadUserFile } from 'element-plus'
import { getAccessToken, getTenantId } from '@/utils/auth' import { getAccessToken, getTenantId } from '@/utils/auth'
import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file' import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
import { Row } from 'element-plus/es/components/table-v2/src/components' import {selectBomStatus, selectPlanTaskStatus} from "@/api/heli/processbom";
defineOptions({ name: 'ProcessBomDetail' }) defineOptions({ name: 'ProcessBomDetail' })
@ -438,7 +436,17 @@ const formRef = ref() // 表单 Ref
const subFormRef = ref() const subFormRef = ref()
//20250601 //20250601
const importFormRef = ref() const importFormRef = ref()
const handleImport = () => { const handleImport = async () => {
if (formData.value.processBomDetails!=null){
var status
await ProcessBomApi.selectPlanTaskStatus(formData.value.id).then(data=>{
status=data
});
if (status){
await message.confirm("是否取消提交生产任务单")
await ProcessBomApi.updateById(formData.value.id)
}
}
importFormRef.value.open(formData.value.id) importFormRef.value.open(formData.value.id)
} }

View File

@ -35,6 +35,7 @@ import DOMPurify from 'dompurify';
defineOptions({ name: 'BomImportForm' }) defineOptions({ name: 'BomImportForm' })
const message = useMessage() // const message = useMessage() //
import * as ProcessBomApi from '@/api/heli/processbom'
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
@ -72,7 +73,7 @@ const submitForm = async () => {
/** 文件上传成功 */ /** 文件上传成功 */
const emits = defineEmits(['success']) const emits = defineEmits(['success'])
const submitFormSuccess = (response: any) => { const submitFormSuccess = async (response: any) => {
if (response.code == 500) { if (response.code == 500) {
uploadRef.value!.clearFiles() uploadRef.value!.clearFiles()
let formattedMsg = response.msg let formattedMsg = response.msg
@ -89,11 +90,10 @@ const submitFormSuccess = (response: any) => {
showClose: false, showClose: false,
center: true center: true
}); });
}else { }else{
message.error(response.msg) message.error(response.msg)
} }
formLoading.value = false formLoading.value = false
return return
} }

View File

@ -110,7 +110,7 @@
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="零件采购订单" prop="planStatus" min-width="180" align="center"> <el-table-column v-if="activeIndex == 'first'" label="零件采购订单" prop="planStatus" min-width="180" align="center">
<template #default="{ row }"> <template #default="{ row }">
{{ row.receivingStatus ?(row.receivingStatus== 1?'已生成':(row.receivingStatus == 2? '部分收货':(row.planStatus == 3? '已收货':''))):''}} {{ row.receivingStatus ?(row.receivingStatus== 1?'已生成':(row.receivingStatus == 2? '部分收货':(row.receivingStatus == 3? '已收货':''))):''}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'second'" label="生产报工" prop="procedureStatus" min-width="180" align="center"> <el-table-column v-if="activeIndex == 'second'" label="生产报工" prop="procedureStatus" min-width="180" align="center">
@ -182,7 +182,11 @@ const handleClick = async(tab: TabsPaneContext, event: Event) => {
var tabIndex = tab.props.name; var tabIndex = tab.props.name;
queryParams.pageNo = 1; queryParams.pageNo = 1;
activeIndex.value = tabIndex; activeIndex.value = tabIndex;
if (allConditionsEmpty.value) {
message.error("必须输入查询条件查询")
}else{
await getList(tabIndex); await getList(tabIndex);
}
} }
/** 查询列表 */ /** 查询列表 */