diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/vo/DeliverOrderSaveReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/vo/DeliverOrderSaveReqVO.java index 1790ca63..eee61882 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/vo/DeliverOrderSaveReqVO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/vo/DeliverOrderSaveReqVO.java @@ -46,7 +46,6 @@ public class DeliverOrderSaveReqVO { private String deliverPersonMobile; @Schema(description = "发货方式", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "发货方式不能为空") private String deliverMode; @Schema(description = "收货人电话", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderServiceImpl.java index 20490f24..250f4758 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderServiceImpl.java @@ -62,6 +62,10 @@ public class DeliverOrderServiceImpl implements DeliverOrderService { @Override @Transactional(rollbackFor = Exception.class) public Long createDeliverOrder(DeliverOrderSaveReqVO createReqVO) { + + // 超额校验 + overageDeliverValidate(createReqVO.getSaleOrderIds(), createReqVO.getDeliverOrderSubs()); + // 插入 DeliverOrderDO deliverOrder = BeanUtils.toBean(createReqVO, DeliverOrderDO.class); // 月度流水号 @@ -100,51 +104,8 @@ public class DeliverOrderServiceImpl implements DeliverOrderService { if(!oldDO.canOperate(operateTypeEnum)){ throw exception(INVALID_OPERATE); } - // 校验数据 不容许超额发货 - if(operateTypeEnum == OperateTypeEnum.DELIVER){ - List thisTimeSubs = updateReqVO.getDeliverOrderSubs(); - List thisTimeRelaSubList = thisTimeSubs.stream().filter(deliverOrderSubDO -> deliverOrderSubDO.getSaleOrderSubId() != null).collect(Collectors.toList()); - - if(!thisTimeRelaSubList.isEmpty()){ - // 锁定订单 - LambdaQueryWrapper projectQuery = new LambdaQueryWrapper<>(); - projectQuery.in(ProjectOrderDO::getId, updateReqVO.getSaleOrderIds().split(",")).last("FOR UPDATE"); - List projectOrderDOList = projectOrderMapper.selectList(projectQuery); - - // 状态判断 已发货不容许操作 - boolean anyoneDone = projectOrderDOList.stream().anyMatch(projectOrderDO -> { - return projectOrderDO.getOrderStatus().intValue() == ProjectOrderDeliverStatusEnum.ALL.getCode(); - }); - if(anyoneDone){ - throw exception(RELATION_PROJECT_ORDER_HAS_DONE); - } - - // 查询关联子项目信息判断额度 - Map> thisTimeSubsGroupBySaleSubId = thisTimeRelaSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId)); - List relaProjectOrderSubList = projectOrderSubMapper.selectBatchIds(thisTimeSubsGroupBySaleSubId.keySet()); - - // 查询历史发货信息 - MPJLambdaWrapper historyDeliveredSubQuery = new MPJLambdaWrapper<>(); - historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class) - .leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId) - .eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode()) - .in(DeliverOrderSubDO::getSaleOrderSubId, thisTimeSubsGroupBySaleSubId.keySet()); - List historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery); - Map> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId)); - - // 关联额度-历史发货额度-本次发货额度 >= 0 则可通过 - boolean allDeliverable = relaProjectOrderSubList.stream().allMatch(relaSub -> { - int relaAmount = relaSub.getAmount(); - List 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; - }); - if(!allDeliverable){ - throw exception(DELIVER_AMOUNT_OVERFLOW); - } - } - } + // 超额校验 + overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs()); // 更新 DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class); @@ -157,11 +118,54 @@ public class DeliverOrderServiceImpl implements DeliverOrderService { if(updateObj.getDeliverStatus().intValue() == DeliverOrderStatusEnum.DELIVER.getCode()) { crossOrderManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(",")); - crossOrderManager.generateStockOutOrder(updateReqVO); } } + private void overageDeliverValidate(String saleOrderIds, List thisTimeSubs) { + List thisTimeRelaSubList = thisTimeSubs.stream().filter(deliverOrderSubDO -> deliverOrderSubDO.getSaleOrderSubId() != null).collect(Collectors.toList()); + + if(!thisTimeRelaSubList.isEmpty()){ + // 锁定订单 + LambdaQueryWrapper projectQuery = new LambdaQueryWrapper<>(); + projectQuery.in(ProjectOrderDO::getId, saleOrderIds.split(",")).last("FOR UPDATE"); + List projectOrderDOList = projectOrderMapper.selectList(projectQuery); + + // 状态判断 已发货不容许操作 + boolean anyoneDone = projectOrderDOList.stream().anyMatch(projectOrderDO -> { + return projectOrderDO.getOrderStatus().intValue() == ProjectOrderDeliverStatusEnum.ALL.getCode(); + }); + if(anyoneDone){ + throw exception(RELATION_PROJECT_ORDER_HAS_DONE); + } + + // 查询关联子项目信息判断额度 + Map> thisTimeSubsGroupBySaleSubId = thisTimeRelaSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId)); + List relaProjectOrderSubList = projectOrderSubMapper.selectBatchIds(thisTimeSubsGroupBySaleSubId.keySet()); + + // 查询历史发货信息 + MPJLambdaWrapper historyDeliveredSubQuery = new MPJLambdaWrapper<>(); + historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class) + .leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId) + .eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode()) + .in(DeliverOrderSubDO::getSaleOrderSubId, thisTimeSubsGroupBySaleSubId.keySet()); + List historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery); + Map> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId)); + + // 关联额度-历史发货额度-本次发货额度 >= 0 则可通过 + boolean allDeliverable = relaProjectOrderSubList.stream().allMatch(relaSub -> { + int relaAmount = relaSub.getAmount(); + List 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; + }); + if(!allDeliverable){ + throw exception(DELIVER_AMOUNT_OVERFLOW); + } + } + } + @Override @Transactional(rollbackFor = Exception.class) public void deleteDeliverOrder(Long id) { diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/deliverorder/detail.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/deliverorder/detail.vue index 0b57c4a2..cca8f2c9 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/deliverorder/detail.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/deliverorder/detail.vue @@ -86,7 +86,7 @@ - + @@ -456,7 +456,6 @@ const formRules = reactive({ deliverStatus: [{ required: true, message: '发货单状态不能为空', trigger: 'blur' }], deliverPerson: [{ required: true, message: '发货人不能为空', trigger: 'blur' }], deliverPersonMobile: [{ required: true, message: '发货人电话不能为空', trigger: 'blur' }], - deliverMode: [{ required: true, message: '发货方式不能为空', trigger: 'change' }], receivePersonMobile: [{ required: true, message: '收货人电话不能为空', trigger: 'blur' }], receivePersonName: [{ required: true, message: '收货人姓名不能为空', trigger: 'blur' }], receiveAddress: [{ required: true, message: '收货详细地址不能为空', trigger: 'blur' }] diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/hlvuestyle/productionPrint.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/hlvuestyle/productionPrint.vue index 9582d5ad..248c450b 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/hlvuestyle/productionPrint.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/hlvuestyle/productionPrint.vue @@ -7,7 +7,7 @@
- +
@@ -72,10 +72,7 @@
自客户提供资料:
-
+
@@ -104,9 +101,11 @@ -
子项目信息:
+ + +
子项目信息:
+ + 序号 名称/编号 @@ -163,22 +162,16 @@ -
+ "> 说明: - 1.每个项目的零部件制作工艺,材料材质,硬度要求必须统一,出现任何问题,各工程师负责! - 2.模具调试,试模需要根据客户要求,自己安排调试,我司根据需要安排人员参与配合。 + 1.每个项目的零部件制作工艺,材料材质,硬度要求必须统一,出现任何问题,各工程师负责! + 2.模具调试,试模需要根据客户要求,自己安排调试,我司根据需要安排人员参与配合。
@@ -211,7 +204,7 @@
- +
@@ -264,9 +257,11 @@ -
子项目信息:
+ + +
子项目信息:
+ + 序号 名称/编号 @@ -306,22 +301,16 @@ -
+ "> 说明: - 1.每个项目的零部件制作工艺,材料材质,硬度要求必须统一,出现任何问题,各工程师负责! - 2.模具调试,试模需要根据客户要求,自己安排调试,我司根据需要安排人员参与配合。 + 1.每个项目的零部件制作工艺,材料材质,硬度要求必须统一,出现任何问题,各工程师负责! + 2.模具调试,试模需要根据客户要求,自己安排调试,我司根据需要安排人员参与配合。
@@ -358,6 +347,8 @@ diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/projectorder/startprint.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/projectorder/startprint.vue index 6d802efb..206adfdc 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/projectorder/startprint.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/projectorder/startprint.vue @@ -170,6 +170,9 @@ import { betweenDay, dateFormatter, formatDate } from '@/utils/formatTime' import { Check } from '@element-plus/icons-vue' import { getCustomer } from '@/api/heli/customer' import { getOperateLogPage } from '@/api/system/operatelog' +import urlimg from '@/assets/imgs/exlogo.png' +const logoDataUrl = ref('') // 存储Logo的Base64编码数据URL + const dialogVisible = ref(false) // 弹窗的是否展示 const onPrint = () => { @@ -314,6 +317,20 @@ const formData = ref({ }) /** 打开弹窗 */ const open = async (id: number) => { + //图片处理 + // 在组件挂载后,将Logo图片转换为Base64编码数据URL + const logoImage = new Image() + logoImage.src = urlimg // 替换为Logo图片路径 + logoImage.onload = () => { + const canvas = document.createElement('canvas') + canvas.width = logoImage.width + canvas.height = logoImage.height + const context = canvas.getContext('2d') + context.drawImage(logoImage, 0, 0) + const base64String = canvas.toDataURL('image/png') + logoDataUrl.value = base64String + } + dialogVisible.value = true resetForm() formData.value = await ProjectOrderApi.getProjectOrder(id) @@ -390,22 +407,7 @@ const resetForm = () => { } } - -const logoDataUrl = ref('') // 存储Logo的Base64编码数据URL -onMounted(() => { - // 在组件挂载后,将Logo图片转换为Base64编码数据URL - const logoImage = new Image() - logoImage.onload = () => { - const canvas = document.createElement('canvas') - canvas.width = logoImage.width - canvas.height = logoImage.height - const context = canvas.getContext('2d') - context.drawImage(logoImage, 0, 0) - const base64String = canvas.toDataURL('image/png') - logoDataUrl.value = base64String - } - logoImage.src = '/src/assets/imgs/exlogo.png' // 替换为Logo图片路径 -}) +onMounted(() => {})