From 57a06c7fee4cc3499b45165e51b892c7adafdac9 Mon Sep 17 00:00:00 2001 From: zxy Date: Wed, 20 May 2026 16:16:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(biz):=20=E6=96=B0=E5=A2=9E=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/SaleDeliveryDetailSaveReqVO.java | 4 + .../storehouse/StoreHouseController.java | 2 - .../dal/dataobject/orderitem/OrderItemDO.java | 5 + .../dataobject/prostorage/ProStorageDO.java | 6 +- .../ProStorageInventoryDO.java | 4 + .../prostoragemat/ProStorageMatDO.java | 18 +- .../SaleDeliveryDetailDO.java | 1 + .../dal/mysql/orderitem/OrderItemMapper.java | 13 +- .../mysql/prostorage/ProStorageMapper.java | 9 + .../biz/service/order/OrderServiceImpl.java | 1 + .../service/prostorage/ProStorageService.java | 2 + .../prostorage/ProStorageServiceImpl.java | 19 ++ .../saledelivery/SaleDeliveryServiceImpl.java | 169 +++++++++++++++++- .../biz/saledelivery/OrderSelectDialog.vue | 3 +- .../biz/saledelivery/SaleDeliveryForm.vue | 24 ++- 15 files changed, 242 insertions(+), 38 deletions(-) diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledeliverydetail/vo/SaleDeliveryDetailSaveReqVO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledeliverydetail/vo/SaleDeliveryDetailSaveReqVO.java index 42f7609..5867df7 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledeliverydetail/vo/SaleDeliveryDetailSaveReqVO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledeliverydetail/vo/SaleDeliveryDetailSaveReqVO.java @@ -53,4 +53,8 @@ public class SaleDeliveryDetailSaveReqVO { private String unit; + private BigDecimal stockQty; + + private Integer stockBag; + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/storehouse/StoreHouseController.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/storehouse/StoreHouseController.java index ade3650..80c29c8 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/storehouse/StoreHouseController.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/storehouse/StoreHouseController.java @@ -98,6 +98,4 @@ public class StoreHouseController { List list = storeHouseService.getStoreHouseSelect(storeType); return success(BeanUtils.toBean(list, StoreHouseRespVO.class)); } - - } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/orderitem/OrderItemDO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/orderitem/OrderItemDO.java index 3b01e3f..a0d4a0a 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/orderitem/OrderItemDO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/orderitem/OrderItemDO.java @@ -81,4 +81,9 @@ public class OrderItemDO extends BaseDO { */ private String ordItemStatus; + /** + * 发货状态(1 未发货 2 部分发货 3 全部发货) + */ + private String deliveryStatus; + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorage/ProStorageDO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorage/ProStorageDO.java index 95d9b1b..fb6ede5 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorage/ProStorageDO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorage/ProStorageDO.java @@ -35,7 +35,7 @@ public class ProStorageDO extends BaseDO { /** * 操作类型 1为入库,2为出库 */ - private Boolean operatorType; + private Integer operatorType; /** * 业务类型 (10 生产入库,11 盘盈入库,12 其它入库 21 成品出库 22 盘亏出库 23生产退库) */ @@ -47,7 +47,7 @@ public class ProStorageDO extends BaseDO { /** * 状态:1 已创建;2 提交 */ - private Boolean status; + private Integer status; /** * 业务日期 */ @@ -55,7 +55,7 @@ public class ProStorageDO extends BaseDO { /** * 操作人id */ - private Integer operatorId; + private String operatorId; /** * 操作人 */ diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorageinventory/ProStorageInventoryDO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorageinventory/ProStorageInventoryDO.java index 931e753..a93a398 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorageinventory/ProStorageInventoryDO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostorageinventory/ProStorageInventoryDO.java @@ -117,5 +117,9 @@ public class ProStorageInventoryDO extends BaseDO { * 生产计划号 */ private String proNo; + /** + * 盘点单号 + */ + private String inventBillNo; } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostoragemat/ProStorageMatDO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostoragemat/ProStorageMatDO.java index 20b8a91..80a74f7 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostoragemat/ProStorageMatDO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/prostoragemat/ProStorageMatDO.java @@ -1,12 +1,12 @@ package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostoragemat; -import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; /** * 成品入/出库子 DO @@ -91,11 +91,11 @@ public class ProStorageMatDO extends BaseDO { /** * 来源单号id */ - private Integer sourceId; + private Long sourceId; /** * 关联单号id */ - private Integer relarionId; + private Long relarionId; /** * 单袋规格 */ @@ -113,4 +113,6 @@ public class ProStorageMatDO extends BaseDO { */ private String proNo; + private String inventBillNo; + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/saledeliverydetail/SaleDeliveryDetailDO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/saledeliverydetail/SaleDeliveryDetailDO.java index 5abb96b..d6f63d4 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/saledeliverydetail/SaleDeliveryDetailDO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/dataobject/saledeliverydetail/SaleDeliveryDetailDO.java @@ -81,4 +81,5 @@ public class SaleDeliveryDetailDO extends BaseDO { */ private Integer deliveriedBagQty; + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/orderitem/OrderItemMapper.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/orderitem/OrderItemMapper.java index d2329be..398e775 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/orderitem/OrderItemMapper.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/orderitem/OrderItemMapper.java @@ -68,19 +68,12 @@ public interface OrderItemMapper extends BaseMapperX { // LEFT JOIN 主表 .leftJoin(OrderDO.class, OrderDO::getId, OrderItemDO::getSaleOrdId) // 查询条件 - 子表 - .like(StringUtils.hasText(pageReqVO.getMaterialCode()), OrderItemDO::getMaterialCode, pageReqVO.getMaterialCode()) - .like(StringUtils.hasText(pageReqVO.getMaterialName()), OrderItemDO::getMaterialName, pageReqVO.getMaterialName()) - .eq(StringUtils.hasText(pageReqVO.getOrdItemStatus()), OrderItemDO::getOrdItemStatus, pageReqVO.getOrdItemStatus()) + .ne(OrderItemDO::getDeliveryStatus, "3") + // 查询条件 - 主表 + .eq( OrderDO::getOrdStatus, "2") .like(StringUtils.hasText(pageReqVO.getSaleOrdNo()), OrderDO::getSaleOrdNo, pageReqVO.getSaleOrdNo()) - .eq(pageReqVO.getCustId() != null, OrderDO::getCustId, pageReqVO.getCustId()) .like(StringUtils.hasText(pageReqVO.getCustName()), OrderDO::getCustName, pageReqVO.getCustName()) - .eq(pageReqVO.getSaleMan() != null, OrderDO::getSaleMan, pageReqVO.getSaleMan()) - .eq(pageReqVO.getSaleDeptId() != null, OrderDO::getSaleDeptId, pageReqVO.getSaleDeptId()) - .eq(StringUtils.hasText(pageReqVO.getOrdType()), OrderDO::getOrdType, pageReqVO.getOrdType()) - .eq(StringUtils.hasText(pageReqVO.getOrdStatus()), OrderDO::getOrdStatus, pageReqVO.getOrdStatus()) - .eq(StringUtils.hasText(pageReqVO.getProStatus()), OrderDO::getProStatus, pageReqVO.getProStatus()) - .eq(StringUtils.hasText(pageReqVO.getDeliveryStatus()), OrderDO::getDeliveryStatus, pageReqVO.getDeliveryStatus()) .orderByDesc(OrderItemDO::getId); return selectJoinPage(pageReqVO, OrderItemWithOrderRespVO.class, wrapper); diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/prostorage/ProStorageMapper.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/prostorage/ProStorageMapper.java index 761c5fd..da23d7f 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/prostorage/ProStorageMapper.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/prostorage/ProStorageMapper.java @@ -1,5 +1,6 @@ package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorage; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult; import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX; import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -34,4 +35,12 @@ public interface ProStorageMapper extends BaseMapperX { .orderByDesc(ProStorageDO::getId)); } + default String selectMaxBillNo() { + ProStorageDO proStorage = selectOne(new LambdaQueryWrapper() + .orderByDesc(ProStorageDO::getBillNo) + .last("LIMIT 1")); + return proStorage != null ? proStorage.getBillNo() : null; + } + + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/order/OrderServiceImpl.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/order/OrderServiceImpl.java index 5dbab6e..835c44c 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/order/OrderServiceImpl.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/order/OrderServiceImpl.java @@ -107,6 +107,7 @@ public class OrderServiceImpl implements OrderService { List orderItems = BeanUtils.toBean(list, OrderItemDO.class); orderItems.forEach(item -> item.setSaleOrdId(saleOrdId) + .setDeliveryStatus("1") .setId(null) ); orderItemMapper.insertBatch(orderItems); diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageService.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageService.java index 9b041af..1c96bf3 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageService.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageService.java @@ -52,4 +52,6 @@ public interface ProStorageService { */ PageResult getProStoragePage(ProStoragePageReqVO pageReqVO); + String generateSaleDeliveryNo(); + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageServiceImpl.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageServiceImpl.java index 4dba5da..5a48bd4 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageServiceImpl.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/prostorage/ProStorageServiceImpl.java @@ -10,6 +10,8 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -67,4 +69,21 @@ public class ProStorageServiceImpl implements ProStorageService { return proStorageMapper.selectPage(pageReqVO); } + @Override + public String generateSaleDeliveryNo() { + String ym = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM")); + + String maxBillNo = proStorageMapper.selectMaxBillNo(); + + if (maxBillNo == null || maxBillNo.length() < 9 + || !maxBillNo.substring(2, 8).equals(ym)) { + return "CK" + ym + "001"; + } else { + String prefix = maxBillNo.substring(0, 8); + int sequence = Integer.parseInt(maxBillNo.substring(8)); + sequence++; + return prefix + String.format("%03d", sequence); + } + } + } diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/saledelivery/SaleDeliveryServiceImpl.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/saledelivery/SaleDeliveryServiceImpl.java index c7d9043..3ce2d29 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/saledelivery/SaleDeliveryServiceImpl.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/service/saledelivery/SaleDeliveryServiceImpl.java @@ -5,10 +5,21 @@ import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo.SaleDeliveryPageReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo.SaleDeliverySaveReqVO; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledeliverydetail.vo.SaleDeliveryDetailSaveReqVO; +import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.order.OrderDO; +import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.orderitem.OrderItemDO; +import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostorage.ProStorageDO; +import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostorageinventory.ProStorageInventoryDO; +import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.prostoragemat.ProStorageMatDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.saledelivery.SaleDeliveryDO; import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.saledeliverydetail.SaleDeliveryDetailDO; +import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.order.OrderMapper; +import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.orderitem.OrderItemMapper; +import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorage.ProStorageMapper; +import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostorageinventory.ProStorageInventoryMapper; +import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.prostoragemat.ProStorageMatMapper; import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.saledelivery.SaleDeliveryMapper; import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.saledeliverydetail.SaleDeliveryDetailMapper; +import com.ningxia.yunxi.chemmes.module.biz.service.prostorage.ProStorageService; import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO; import com.ningxia.yunxi.chemmes.module.system.dal.mysql.user.AdminUserMapper; import org.springframework.stereotype.Service; @@ -16,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; @@ -41,6 +53,23 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { @Resource private AdminUserMapper adminUserMapper; + @Resource + private ProStorageInventoryMapper proStorageInventoryMapper; + + @Resource + private ProStorageMapper proStorageMapper; + + @Resource + private ProStorageMatMapper proStorageMatMapper; + + @Resource + private OrderItemMapper orderItemMapper; + + @Resource + private OrderMapper orderMapper; + + @Resource + private ProStorageService proStorageService; @Override @Transactional(rollbackFor = Exception.class) @@ -56,10 +85,12 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { AdminUserDO adminUserDO = adminUserMapper.selectById(userId); saleDelivery.setDeliveryEmpId(String.valueOf(adminUserDO.getId())); saleDelivery.setDeliveryEmpName(adminUserDO.getNickname()); - + saleDelivery.setSaleOrdDetailId(createReqVO.getSaleOrdDetailId()); saleDeliveryMapper.insert(saleDelivery); - createSaleDeliveryDetailList(saleDelivery.getId(), createReqVO.getDetailList()); + if ("2".equals(createReqVO.getDeliveryStatus())) { + confirmSaleDelivery(saleDelivery.getId()); + } // 返回 return saleDelivery.getId(); @@ -74,6 +105,9 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { SaleDeliveryDO updateObj = BeanUtils.toBean(updateReqVO, SaleDeliveryDO.class); saleDeliveryMapper.updateById(updateObj); updateSaleDeliveryDetailList(updateReqVO.getId(), updateReqVO.getDetailList()); + if ("2".equals(updateReqVO.getDeliveryStatus())) { + confirmSaleDelivery(updateReqVO.getId()); + } } /** @@ -146,7 +180,13 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { List detailList = saleDeliveryDetailMapper.selectBySaleDeliveryId(id); // 转换为子表VO列表 saleDeliveryVO.setDetailList(BeanUtils.toBean(detailList, SaleDeliveryDetailSaveReqVO.class)); - + for (SaleDeliveryDetailSaveReqVO saleDeliveryDetailSaveReqVO : saleDeliveryVO.getDetailList()) { + ProStorageInventoryDO storageInventoryDO = proStorageInventoryMapper.selectById(saleDeliveryDetailSaveReqVO.getTwmStorageDetailId()); + if (storageInventoryDO != null) { + saleDeliveryDetailSaveReqVO.setStockQty(storageInventoryDO.getYardQty()); + saleDeliveryDetailSaveReqVO.setStockBag(storageInventoryDO.getPackQty()); + } + } return saleDeliveryVO; } @@ -156,7 +196,6 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { } - /** * 生成销售出库单号 * 规则:SC + 年份(4位) + 月份(2位) + 流水号(3位) @@ -166,8 +205,7 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { String maxSaleDeliveryNo = saleDeliveryMapper.selectMaxSaleDeliveryNo(); - if (maxSaleDeliveryNo == null || maxSaleDeliveryNo.length() < 9 - || !maxSaleDeliveryNo.substring(2, 8).equals(ym)) { + if (maxSaleDeliveryNo == null || maxSaleDeliveryNo.length() < 9 || !maxSaleDeliveryNo.substring(2, 8).equals(ym)) { return "SC" + ym + "001"; } else { String prefix = maxSaleDeliveryNo.substring(0, 8); @@ -176,4 +214,123 @@ public class SaleDeliveryServiceImpl implements SaleDeliveryService { return prefix + String.format("%03d", sequence); } } + + private void confirmSaleDelivery(Integer id) { + SaleDeliveryDO saleDelivery = saleDeliveryMapper.selectById(id); + if (saleDelivery == null) { + throw exception("销售出库单不存在"); + } + +// if ("2".equals(saleDelivery.getDeliveryStatus())) { +// throw exception("该出库单已确认,无需重复确认"); +// } + + List detailList = saleDeliveryDetailMapper.selectBySaleDeliveryId(saleDelivery.getId()); + if (detailList == null || detailList.isEmpty()) { + throw exception("出库单明细不能为空"); + } + + ProStorageDO proStorage = ProStorageDO.builder() + .billNo(proStorageService.generateSaleDeliveryNo()) + .operatorType(2) + .businessType(21) +// .billType("0") + .status(1) + .billDate(LocalDate.now()) + .operatorId(saleDelivery.getDeliveryEmpId()) + .operatorName(saleDelivery.getDeliveryEmpName()) + .relarionNo(saleDelivery.getSaleOrdNo()) + .relarionId(saleDelivery.getSaleOrdId()) + .sourceNo(saleDelivery.getSaleOrdNo()) + .sourceId(saleDelivery.getSaleOrdId()) + .build(); + proStorageMapper.insert(proStorage); + + for (SaleDeliveryDetailDO detail : detailList) { + ProStorageInventoryDO inventory = proStorageInventoryMapper.selectById(detail.getTwmStorageDetailId()); + if (inventory == null) { + throw exception("库存不存在:仓库[" + detail.getStoreHouseName() + "] 批次[" + detail.getLotNo() + "]"); + } + + BigDecimal deliveriedQty = detail.getDeliveriedQty() != null ? detail.getDeliveriedQty() : BigDecimal.ZERO; + if (inventory.getUseQty().compareTo(deliveriedQty) < 0) { + throw exception("库存不足:当前可用数量[" + inventory.getUseQty() + "] < 发货数量[" + deliveriedQty + "]"); + } + + inventory.setUseQty(inventory.getUseQty().subtract(deliveriedQty)); + inventory.setYardQty(inventory.getYardQty().subtract(deliveriedQty)); + inventory.setPackQty(inventory.getPackQty() - (detail.getDeliveriedBagQty())); + proStorageInventoryMapper.updateById(inventory); + ProStorageMatDO storageMat = ProStorageMatDO.builder() + .stockId(proStorage.getId().longValue()) + .storeHouseId(detail.getStoreHouseId()) + .storeAreaId(detail.getStoreAreaId()) + .storeHouseCd(detail.getStoreHouseCd()) + .storeHouseName(detail.getStoreHouseName()) + .storeAreCd(detail.getStoreAreCd()) + .storeAreaName(detail.getStoreAreaName()) + .materialId(saleDelivery.getMaterialId()) + .matName(saleDelivery.getMaterialName()) + .matCode(saleDelivery.getMaterialCode()) + .spec(saleDelivery.getSpec()) + .unit(saleDelivery.getUnit()) + .lotNo(detail.getLotNo()) + .operatorQty(detail.getDeliveriedQty()) + .bagSpec(detail.getBagSpec()) + .bagQty(detail.getDeliveriedBagQty()) + + .relarionId(inventory.getId()) + .planId(inventory.getPlanId()) + .proNo(inventory.getProNo()) + .sourceId(inventory.getId()) + .inventBillNo(inventory.getInventBillNo()) + .build(); + proStorageMatMapper.insert(storageMat); + } + + + if (saleDelivery.getSaleOrdId() != null && saleDelivery.getSaleOrdDetailId() != null) { + OrderItemDO currentOrderItem = orderItemMapper.selectById(saleDelivery.getSaleOrdDetailId()); + if (currentOrderItem == null) { + throw exception("订单明细不存在"); + } + + BigDecimal currentDeliveriedQty = currentOrderItem.getDeliveriedQty() != null ? currentOrderItem.getDeliveriedQty() : BigDecimal.ZERO; + BigDecimal deliveryQty = saleDelivery.getDeliveriedQty() != null ? saleDelivery.getDeliveriedQty() : BigDecimal.ZERO; + BigDecimal totalDeliveriedQty = currentDeliveriedQty.add(deliveryQty); + currentOrderItem.setDeliveriedQty(totalDeliveriedQty); + if (totalDeliveriedQty.compareTo(currentOrderItem.getOrdQty()) == 0) { + currentOrderItem.setDeliveryStatus("3"); + } else if (totalDeliveriedQty.compareTo(currentOrderItem.getOrdQty()) < 0) { + currentOrderItem.setDeliveryStatus("2"); + } else { + throw exception("订单明细发货数量不能大于订单数量"); + } + orderItemMapper.updateById(currentOrderItem); + + List allOrderItems = orderItemMapper.selectBySaleOrdId(saleDelivery.getSaleOrdId()); + + boolean allShipped = true; + + for (OrderItemDO item : allOrderItems) { + if (!"3".equals(item.getDeliveryStatus())) { + allShipped = false; + break; + } + } + + OrderDO order = orderMapper.selectById(saleDelivery.getSaleOrdId()); + if (order != null) { + if (allShipped) { + order.setDeliveryStatus("3"); + } else { + order.setDeliveryStatus("2"); + } + orderMapper.updateById(order); + } + } + + saleDelivery.setDeliveryStatus("2"); + saleDeliveryMapper.updateById(saleDelivery); + } } diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue index 5e40d23..6fb4d04 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue @@ -169,6 +169,7 @@ const getList = async () => { saleOrdId: order.id, custId: order.custId, // 添加客户ID deliveriedQty: item.deliveriedQty || 0, + itemId: item.id })), } }) @@ -239,8 +240,8 @@ const emitSelect = (row) => { remaimQty: ((row.ordQty || 0) - (row.deliveriedQty || 0)) || 0, deliveriedQty: row.deliveriedQty || 0, unit: row.unit, + itemId: row.itemId } - console.log('emitSelect data:', selectData) emit('select', selectData) dialogVisible.value = false } diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue index e2df283..42708e9 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue @@ -171,12 +171,12 @@ @@ -188,7 +188,7 @@