From cb2a2b40e35c702964846b1fe27313b8f0d8ef7c Mon Sep 17 00:00:00 2001 From: zengchenxi Date: Thu, 1 Feb 2024 18:13:37 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=9C=80=E6=B1=82=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E3=80=91=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E5=8F=91=E8=B4=A7?= =?UTF-8?q?=E4=B8=8E=E4=BB=93=E5=82=A8=E4=BA=A4=E4=BA=92=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/banner.txt | 2 +- .../module/heli/enums/MaterialTypeEnum.java | 27 +++ .../module/heli/enums/StockOutTypeEnum.java | 25 +++ .../mes/module/heli/enums/StockTypeEnum.java | 23 +++ .../module/heli/enums/StorageStatusEnum.java | 19 ++ .../mes/module/heli/enums/YesOrNoEnum.java | 2 +- .../deliverorder/DeliverOrderController.java | 2 +- .../vo/DeliverOrderSaveReqVO.java | 2 +- .../deliverorder/DeliverOrderSubDO.java | 2 +- .../projectorder/ProjectOrderDO.java | 2 +- .../deliverorder/DeliverOrderMapper.java | 2 - .../deliverorder/DeliverOrderSubMapper.java | 13 +- .../dal/mysql/material/MaterialMapper.java | 3 +- .../heli/manager/CrossOrderManager.java | 193 ++++++++++++++++++ .../heli/manager/CrossOrderStatusManager.java | 81 -------- .../deliverorder/DeliverOrderService.java | 2 +- .../deliverorder/DeliverOrderServiceImpl.java | 16 +- .../projectorder/ProjectOrderServiceImpl.java | 19 +- .../src/views/heli/material/index.vue | 2 +- sql/v1.3.0/1.structure.sql | 5 +- 20 files changed, 331 insertions(+), 111 deletions(-) create mode 100644 mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/MaterialTypeEnum.java create mode 100644 mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockOutTypeEnum.java create mode 100644 mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockTypeEnum.java create mode 100644 mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StorageStatusEnum.java create mode 100644 mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderManager.java delete mode 100644 mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderStatusManager.java diff --git a/mes-framework/mes-spring-boot-starter-banner/src/main/resources/banner.txt b/mes-framework/mes-spring-boot-starter-banner/src/main/resources/banner.txt index bd231a86..f797d735 100644 --- a/mes-framework/mes-spring-boot-starter-banner/src/main/resources/banner.txt +++ b/mes-framework/mes-spring-boot-starter-banner/src/main/resources/banner.txt @@ -1,4 +1,4 @@ -芋道源码 http://www.iocoder.cn +上海长江云息数字科技有限公司 Application Version: ${mes.info.version} Spring Boot Version: ${spring-boot.version} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/MaterialTypeEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/MaterialTypeEnum.java new file mode 100644 index 00000000..fa34b4c7 --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/MaterialTypeEnum.java @@ -0,0 +1,27 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 物料类型 + * @author chenxi + * @date 2024-02-01 04:42 + */ +@Getter +public enum MaterialTypeEnum { + + RAW("1", "原材料"), + ACCESSORY("2", "副资材"), + OFFICE("3", "办公/劳保"), + GIVING("4", "赠送物品"), + STANDARD("5", "标准件"), + MOULD("6", "模具"); + + private String code; + private String description; + + MaterialTypeEnum(String code, String description) { + this.code = code; + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockOutTypeEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockOutTypeEnum.java new file mode 100644 index 00000000..dce68a03 --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockOutTypeEnum.java @@ -0,0 +1,25 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 出库类型 + * @author chenxi + * @date 2024-02-01 02:31 + */ +@Getter +public enum StockOutTypeEnum { + + RECEIVE(1, "领料出库"), + SALE(2, "销售出库"), + LOSS(3, "盘亏出库"), + OTHER(4, "其他出库"); + + private int code; + private String description; + + StockOutTypeEnum(int code, String description) { + this.code = code; + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockTypeEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockTypeEnum.java new file mode 100644 index 00000000..e682923a --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StockTypeEnum.java @@ -0,0 +1,23 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 库表类型 + * @author chenxi + * @date 2024-02-01 02:28 + */ +@Getter +public enum StockTypeEnum { + + IN(1, "入库"), + OUT(2, "出库"); + + private int code; + private String description; + + StockTypeEnum(int code, String description) { + this.code = code; + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StorageStatusEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StorageStatusEnum.java new file mode 100644 index 00000000..20bc10bc --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/StorageStatusEnum.java @@ -0,0 +1,19 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +@Getter +public enum StorageStatusEnum { + + SAVE(1, "保存"), + SUBMIT(2, "提交"), + INVALID(3, "作废"); + + private int code; + private String description; + + StorageStatusEnum(int code, String description) { + this.code = code; + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java index e1e6de4e..9f00e404 100644 --- a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; @Getter public enum YesOrNoEnum { - YES(1), NO(0); + Y(1), N(0); private int code; diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/DeliverOrderController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/DeliverOrderController.java index f25df945..d2946d85 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/DeliverOrderController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/deliverorder/DeliverOrderController.java @@ -33,7 +33,7 @@ import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEn import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.heli.service.deliverorder.DeliverOrderService; @Tag(name = "管理后台 - 发货订单") 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 e61dc76a..1790ca63 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 @@ -1,6 +1,6 @@ package com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/deliverorder/DeliverOrderSubDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/deliverorder/DeliverOrderSubDO.java index 05c6e7f0..3d32f97a 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/deliverorder/DeliverOrderSubDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/deliverorder/DeliverOrderSubDO.java @@ -1,4 +1,4 @@ -package com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub; +package com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder; import lombok.*; import java.util.*; diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java index a7bdd709..62b3d49c 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java @@ -243,7 +243,7 @@ public class ProjectOrderDO extends BaseDO { } public boolean canDelete(){ - return this.orderStatus.intValue() == ProjectOrderStatusEnum.SAVE.getCode() && this.hasAlter.intValue() == YesOrNoEnum.NO.getCode(); + return this.orderStatus.intValue() == ProjectOrderStatusEnum.SAVE.getCode() && this.hasAlter.intValue() == YesOrNoEnum.N.getCode(); } public boolean canOperate(OperateTypeEnum operateTypeEnum){ diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderMapper.java index 8611003b..96cecc20 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderMapper.java @@ -6,8 +6,6 @@ import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; -import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.DeptDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderSubMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderSubMapper.java index 6b4e39b2..2e9a27bc 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderSubMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/deliverorder/DeliverOrderSubMapper.java @@ -1,14 +1,11 @@ -package com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub; +package com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder; -import java.util.*; - -import com.chanko.yunxi.mes.framework.common.pojo.PageResult; -import com.chanko.yunxi.mes.framework.common.pojo.PageParam; -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.dal.dataobject.deliverordersub.DeliverOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 发货订单子项 Mapper * @@ -25,4 +22,4 @@ public interface DeliverOrderSubMapper extends BaseMapperX { return delete(DeliverOrderSubDO::getDeliveryOrderId, deliveryOrderId); } -} \ No newline at end of file +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/material/MaterialMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/material/MaterialMapper.java index ca39905c..d03ac8e7 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/material/MaterialMapper.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/material/MaterialMapper.java @@ -32,7 +32,8 @@ public interface MaterialMapper extends BaseMapperX { query.like(!StringUtils.isEmpty(reqVO.getName()), MaterialDO::getName, reqVO.getName()) .like(!StringUtils.isEmpty(reqVO.getCode()), MaterialDO::getCode, reqVO.getCode()) .eq(!StringUtils.isEmpty(reqVO.getMaterialType()), MaterialDO::getMaterialType, reqVO.getMaterialType()) - .eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus()); + .eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus()) + .eq(!StringUtils.isEmpty(reqVO.getVirtualPart()), MaterialDO::getVirtualPart, reqVO.getVirtualPart()); return selectPage(reqVO, query); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderManager.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderManager.java new file mode 100644 index 00000000..98cd3cf3 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderManager.java @@ -0,0 +1,193 @@ +package com.chanko.yunxi.mes.module.heli.manager; + +import cn.hutool.core.lang.UUID; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; +import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper; +import com.chanko.yunxi.mes.module.heli.enums.*; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN; + +/** + * 跨订单状态交互管理器 + * + * @author chenxi + * @date 2024-01-31 10:03 + */ +@Component +public class CrossOrderManager { + + @Resource + private ProjectOrderMapper projectOrderMapper; + @Resource + private ProjectOrderSubMapper projectOrderSubMapper; + @Resource + private DeliverOrderSubMapper deliverOrderSubMapper; + @Resource + private StorageMapper storageMapper; + @Resource + private StorageMatMapper storageMatMapper; + @Resource + private StorageLogMapper storageLogMapper; + @Resource + private MaterialMapper materialMapper; + + /** + * 刷新项目订单发货状态 + * @param projectOrderIds + */ + @Transactional(rollbackFor = Exception.class) + public void refreshProjectOrderDeliverStatus(String... projectOrderIds) { + // 锁定订单 + for (String projectOrderId : projectOrderIds) { + ProjectOrderDO projectOrderDO = projectOrderMapper.selectOne(new LambdaQueryWrapper() {{ + eq(ProjectOrderDO::getId, projectOrderId); + last("LIMIT 1 FOR UPDATE"); + }}); + + // 查询关联子项 + List projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderDO.getId()); + + // 查询发货记录 + MPJLambdaWrapper historyDeliveredSubQuery = new MPJLambdaWrapper<>(); + historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class) + .leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId) + .eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode()) + .in(DeliverOrderSubDO::getSaleOrderSubId, projectOrderSubDOList.stream().map(ProjectOrderSubDO::getId).collect(Collectors.toSet())); + List historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery); + if(historyDeliveredSubList.isEmpty()) return; + Map> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId)); + + // 考虑变更订单情况 只需判断历史发货是否大于等于订单子项数量 + boolean allDone = projectOrderSubDOList.stream().allMatch(projectOrderSubDO -> { + List historySubList = historyDeliveredSubsGroupBySaleSubId.get(projectOrderSubDO.getId()); + int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum(); + return historyDeliveredAmount >= projectOrderSubDO.getAmount(); + }); + + if(allDone){ + projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.ALL.getCode()); + }else{ + projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.PART.getCode()); + } + projectOrderMapper.updateById(projectOrderDO); + + } + + } + + /** + * 生成出货单 + * @param updateReqVO + */ + @Transactional(rollbackFor = Exception.class) + public void generateStockOutOrder(DeliverOrderSaveReqVO updateReqVO) { + + // 出库表处理 + StorageDO storageDO = new StorageDO(); + storageDO.setStockType(StockTypeEnum.OUT.getCode()) + .setStockOutType(StockOutTypeEnum.SALE.getCode()) + .setStockNo(UUID.fastUUID().toString(true)) + .setHeaderNo(updateReqVO.getCode()) + .setStatus(StorageStatusEnum.SUBMIT.getCode()) + .setCreateTime(updateReqVO.getDeliverDate()) + .setDescription(String.format("由发货单%s操作发货后自动生成", updateReqVO.getCode())); + storageMapper.insert(storageDO); + storageDO.setStockNo(STOCK_IN.getCode(storageDO.getId().toString())); + storageMapper.updateById(storageDO); + + // 查询物料id + Set materialCodeList = updateReqVO.getDeliverOrderSubs().stream().map(deliverOrderSubDO -> { + return String.format("%s-%s", deliverOrderSubDO.getSaleOrderCode(), deliverOrderSubDO.getName()); + }).collect(Collectors.toSet()); + List subMaterialDOList = materialMapper.selectList(new LambdaQueryWrapper() {{ + in(MaterialDO::getCode, materialCodeList); + eq(MaterialDO::getVirtualPart, YesOrNoEnum.Y.name()); + }}); + Map> materialGroupByCode = subMaterialDOList.stream().collect(Collectors.groupingBy(MaterialDO::getCode)); + + // 出库物料明细 + ArrayList storageMatDOList = new ArrayList<>(16); + for (DeliverOrderSubDO deliverOrderSub : updateReqVO.getDeliverOrderSubs()) { + MaterialDO materialDO = materialGroupByCode.get(String.format("%s-%s", deliverOrderSub.getSaleOrderCode(), deliverOrderSub.getName())).get(0); + StorageMatDO storageMatDO = new StorageMatDO(); + storageMatDO.setStockId(storageDO.getId()) + .setMatId(materialDO.getId()) + .setStorageOkQty(new BigDecimal(deliverOrderSub.getAmount())); + storageMatDOList.add(storageMatDO); + } + storageMatMapper.insertBatch(storageMatDOList); + + // 将物料信息转化日志信息 + List logList = BeanUtils.toBean(storageMatDOList,StorageLogDO.class); + // 同步库存单状态到日志,便于以后统计 + for (StorageLogDO log : logList){ + log.setStatus(storageDO.getStatus()); + } + // 批量保存当前库存物料日志信息 + storageLogMapper.insertBatch(logList); + + } + + /** + * 生成虚拟物料 + * @author chenxi + * @date 2024-02-01 05:32 + */ + @Transactional(rollbackFor = Exception.class) + public void generateVirtualMaterial(String projectOrderCode, List projectOrderSubs) { + ArrayList pendingDOList = new ArrayList<>(16); + projectOrderSubs.forEach(projectOrderSubDO -> { + MaterialDO materialDO = new MaterialDO(); + materialDO.setCode(String.format("%s-%s", projectOrderCode, projectOrderSubDO.getName())) + .setName(projectOrderSubDO.getName()) + .setMaterialType(MaterialTypeEnum.MOULD.getCode()) + .setUnit(projectOrderSubDO.getUnit()) + .setVirtualPart(YesOrNoEnum.Y.name()); + pendingDOList.add(materialDO); + }); + + // 判断是否存在对应的编码 如存在则更新 不存在则插入 + Map> historyGroupByCode = new HashMap<>(16); + List historyDOList = materialMapper.selectList(new LambdaQueryWrapper() {{ + in(MaterialDO::getCode, pendingDOList.stream().map(MaterialDO::getCode).collect(Collectors.toSet())); + }}); + if(historyDOList != null && !historyDOList.isEmpty()){ + historyGroupByCode.putAll(historyDOList.stream().collect(Collectors.groupingBy(MaterialDO::getCode))); + } + + pendingDOList.forEach(thisTimeMaterialDO -> { + List historyMaterialList = historyGroupByCode.get(thisTimeMaterialDO.getCode()); + if(historyMaterialList != null && !historyMaterialList.isEmpty()){ + MaterialDO historyMaterialDO = historyMaterialList.get(0); + thisTimeMaterialDO.setId(historyMaterialDO.getId()).setCreateTime(historyMaterialDO.getCreateTime()); + materialMapper.updateById(thisTimeMaterialDO); + }else{ + materialMapper.insert(thisTimeMaterialDO); + } + }); + } +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderStatusManager.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderStatusManager.java deleted file mode 100644 index 4194a5f6..00000000 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/manager/CrossOrderStatusManager.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.chanko.yunxi.mes.module.heli.manager; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; -import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub.DeliverOrderSubMapper; -import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; -import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; -import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum; -import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderDeliverStatusEnum; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 跨订单状态交互管理器 - * - * @author chenxi - * @date 2024-01-31 10:03 - */ -@Component -public class CrossOrderStatusManager { - - @Resource - private ProjectOrderMapper projectOrderMapper; - @Resource - private ProjectOrderSubMapper projectOrderSubMapper; - @Resource - private DeliverOrderSubMapper deliverOrderSubMapper; - - /** - * 刷新项目订单发货状态 - * @param projectOrderIds - */ - @Transactional(rollbackFor = Exception.class) - public void refreshProjectOrderDeliverStatus(String... projectOrderIds) { - // 锁定订单 - for (String projectOrderId : projectOrderIds) { - ProjectOrderDO projectOrderDO = projectOrderMapper.selectOne(new LambdaQueryWrapper() {{ - eq(ProjectOrderDO::getId, projectOrderId); - last("LIMIT 1 FOR UPDATE"); - }}); - - // 查询关联子项 - List projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderDO.getId()); - - // 查询发货记录 - MPJLambdaWrapper historyDeliveredSubQuery = new MPJLambdaWrapper<>(); - historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class) - .leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId) - .eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode()) - .in(DeliverOrderSubDO::getSaleOrderSubId, projectOrderSubDOList.stream().map(ProjectOrderSubDO::getId).collect(Collectors.toSet())); - List historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery); - if(historyDeliveredSubList.isEmpty()) return; - Map> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId)); - - // 考虑变更订单情况 只需判断历史发货是否大于等于订单子项数量 - boolean allDone = projectOrderSubDOList.stream().allMatch(projectOrderSubDO -> { - List historySubList = historyDeliveredSubsGroupBySaleSubId.get(projectOrderSubDO.getId()); - int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum(); - return historyDeliveredAmount >= projectOrderSubDO.getAmount(); - }); - - if(allDone){ - projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.ALL.getCode()); - }else{ - projectOrderDO.setDeliveryStatus(ProjectOrderDeliverStatusEnum.PART.getCode()); - } - projectOrderMapper.updateById(projectOrderDO); - - } - - } -} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderService.java index 6b8b211c..b4adf17c 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/deliverorder/DeliverOrderService.java @@ -4,7 +4,7 @@ import java.util.*; import javax.validation.*; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageParam; 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 6b3267b7..1b4278e3 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 @@ -7,18 +7,18 @@ import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderMapper; -import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub.DeliverOrderSubMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderDeliverStatusEnum; -import com.chanko.yunxi.mes.module.heli.manager.CrossOrderStatusManager; +import com.chanko.yunxi.mes.module.heli.manager.CrossOrderManager; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.springframework.stereotype.Service; @@ -57,7 +57,7 @@ public class DeliverOrderServiceImpl implements DeliverOrderService { @Resource private ProjectOrderSubMapper projectOrderSubMapper; @Resource - private CrossOrderStatusManager crossOrderStatusManager; + private CrossOrderManager crossOrderManager; @Override @Transactional(rollbackFor = Exception.class) @@ -85,7 +85,7 @@ public class DeliverOrderServiceImpl implements DeliverOrderService { OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(createReqVO.getActive()); if(operateTypeEnum == OperateTypeEnum.DELIVER) { - crossOrderStatusManager.refreshProjectOrderDeliverStatus(createReqVO.getSaleOrderIds().split(",")); + crossOrderManager.refreshProjectOrderDeliverStatus(createReqVO.getSaleOrderIds().split(",")); } // 返回 return deliverOrder.getId(); @@ -155,8 +155,10 @@ public class DeliverOrderServiceImpl implements DeliverOrderService { // 更新子表 updateDeliverOrderSubList(updateReqVO.getId(), updateReqVO.getDeliverOrderSubs(), updateReqVO.getDeliverOrderOtherSubs()); - if(operateTypeEnum == OperateTypeEnum.DELIVER) { - crossOrderStatusManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(",")); + if(updateObj.getDeliverStatus().intValue() == DeliverOrderStatusEnum.DELIVER.getCode()) { + crossOrderManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(",")); + + crossOrderManager.generateStockOutOrder(updateReqVO); } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java index b4a19f04..8ba43167 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java @@ -15,6 +15,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMa import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; +import com.chanko.yunxi.mes.module.heli.manager.CrossOrderManager; import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; @@ -30,7 +31,10 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -64,6 +68,9 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { @Resource private FileService fileService; + @Resource + private CrossOrderManager crossOrderManager; + @Override @Transactional(rollbackFor = Exception.class) public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) { @@ -97,7 +104,7 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name(), projectOrder.getCode()); serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1); projectOrder.setId(null) - .setIsSnapshot(YesOrNoEnum.YES.getCode()) + .setIsSnapshot(YesOrNoEnum.Y.getCode()) .setSnapshotId(createReqVO.getId()) .setSnapshotCode(createReqVO.getCode()) .setSnapshotOrderTime(createReqVO.getOrderTime()) @@ -132,7 +139,8 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) { // 校验存在 ProjectOrderDO oldDO = validateProjectOrderExists(updateReqVO.getId()); - if(!oldDO.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){ + OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive()); + if(!oldDO.canOperate(operateTypeEnum)){ throw exception(INVALID_OPERATE); } // 更新 @@ -143,6 +151,11 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { // 更新子表 updateProjectOrderSubList(updateReqVO.getId(), updateReqVO.getProjectOrderSubs()); + + // 如已启动 按子项目生成虚拟物料数据 + if(updateObj.getOrderStatus().intValue() == ProjectOrderStatusEnum.APPROVE.getCode()){ + crossOrderManager.generateVirtualMaterial(updateReqVO.getCode(), updateReqVO.getProjectOrderSubs()); + } } @Override diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/material/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/material/index.vue index acc33dd8..46d14632 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/material/index.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/material/index.vue @@ -189,7 +189,7 @@ const queryParams = reactive({ invUpperLimit: undefined, invLowerLimit: undefined, barcode: undefined, - virtualPart: undefined, + virtualPart: "N", logo: undefined, }) const queryFormRef = ref() // 搜索的表单 diff --git a/sql/v1.3.0/1.structure.sql b/sql/v1.3.0/1.structure.sql index cfcc806c..b2bb6c55 100644 --- a/sql/v1.3.0/1.structure.sql +++ b/sql/v1.3.0/1.structure.sql @@ -1,4 +1,7 @@ ALTER table wms_storage MODIFY column header_no VARCHAR(128); ALTER table wms_storage_mat MODIFY column wh_id BIGINT(20) null; ALTER table wms_storage_mat MODIFY column rg_id BIGINT(20) null; -ALTER table wms_storage_mat MODIFY column pn_id BIGINT(20) null; \ No newline at end of file +ALTER table wms_storage_mat MODIFY column pn_id BIGINT(20) null; + +UPDATE base_material set virtual_part = 'N'; +ALTER TABLE base_material MODIFY COLUMN virtual_part CHAR ( 1 ) NOT NULL DEFAULT 'N' COMMENT '虚拟物料标识,只能填写Y和N,Y表示虚拟物料,N表示反之';