From f314bb1e7f6f1a100d28bd1ba7107e5934601b3b Mon Sep 17 00:00:00 2001 From: x_z Date: Thu, 8 Sep 2022 17:19:49 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=8D=95=E6=8D=AE=E5=9B=9E?= =?UTF-8?q?=E9=80=80=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inout/StockOrderController.java | 19 ++ .../sale/admin/dao/inout/StockOrderDao.java | 8 + .../service/inout/StockOrderService.java | 1 + .../service/inout/impl/OrderServiceImpl.java | 8 +- .../inout/impl/StockOrderServiceImpl.java | 210 +++++++++++++++++- .../mybatis/mapper/inout/StockOrderDao.xml | 4 + 6 files changed, 246 insertions(+), 4 deletions(-) diff --git a/api-admin/src/main/java/com/glxp/sale/admin/controller/inout/StockOrderController.java b/api-admin/src/main/java/com/glxp/sale/admin/controller/inout/StockOrderController.java index 3e31e59..9ce8461 100644 --- a/api-admin/src/main/java/com/glxp/sale/admin/controller/inout/StockOrderController.java +++ b/api-admin/src/main/java/com/glxp/sale/admin/controller/inout/StockOrderController.java @@ -612,4 +612,23 @@ public class StockOrderController { AuthAdmin authAdmin = authAdminService.findById(Long.parseLong(userId)); return authAdmin.getCustomerId() + ""; } + + /** + * 回退已验收单据到未验收状态 + * + * @param billNo + * @return + */ + @AuthRuleAnnotation("") + @GetMapping("/udiwms/stock/order/rollback") + public BaseResponse rollbackOrder(String billNo) { + if (StrUtil.isBlank(billNo)) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL); + } + boolean result = stockOrderService.rollbackOrder(billNo); + if (result) { + return ResultVOUtils.success(); + } + return ResultVOUtils.error(ResultEnum.NOT_NETWORK, "回退失败"); + } } diff --git a/api-admin/src/main/java/com/glxp/sale/admin/dao/inout/StockOrderDao.java b/api-admin/src/main/java/com/glxp/sale/admin/dao/inout/StockOrderDao.java index 3e5809e..ae25b95 100644 --- a/api-admin/src/main/java/com/glxp/sale/admin/dao/inout/StockOrderDao.java +++ b/api-admin/src/main/java/com/glxp/sale/admin/dao/inout/StockOrderDao.java @@ -68,4 +68,12 @@ public interface StockOrderDao { * @return */ Integer selectIdByOrderIdFk(@Param("orderIdFk") String orderIdFk); + + /** + * 根据单号查询业务单据 + * + * @param billNo + * @return + */ + StockOrderEntity selectByBillNo(@Param("billNo") String billNo); } diff --git a/api-admin/src/main/java/com/glxp/sale/admin/service/inout/StockOrderService.java b/api-admin/src/main/java/com/glxp/sale/admin/service/inout/StockOrderService.java index 56ab809..0df2022 100644 --- a/api-admin/src/main/java/com/glxp/sale/admin/service/inout/StockOrderService.java +++ b/api-admin/src/main/java/com/glxp/sale/admin/service/inout/StockOrderService.java @@ -45,4 +45,5 @@ public interface StockOrderService { */ List getSupplementOrderBillNoList(); + boolean rollbackOrder(String billNo); } diff --git a/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/OrderServiceImpl.java b/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/OrderServiceImpl.java index 81f66a0..f9b89b2 100644 --- a/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/OrderServiceImpl.java +++ b/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/OrderServiceImpl.java @@ -491,11 +491,11 @@ public class OrderServiceImpl implements OrderService { List invPerInProductEntities = invPreInProductDao.filterInvProduct(filterInvProductRequest); InvProductEntity invProductEntity = invPerInProductEntities.get(0); if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) { - //入库,在原有库存基础上减库存 + //入库,扣减入库数量 int count = invProductEntity.getInCount() - invProductDetailEntity.getCount(); invProductEntity.setInCount(count); } else if (ConstantType.TYPE_OUT.equals(invProductDetailEntity.getMainAction())) { - //出库,在原有库存上增加库存 + //出库,扣减出库数量 int count = invProductEntity.getOutCount() - invProductDetailEntity.getCount(); invProductEntity.setOutCount(count); } @@ -505,6 +505,8 @@ public class OrderServiceImpl implements OrderService { //删除库存详情 invPreInProductDetailDao.deleteByOrderId(id); + //删除码详情 + codesDao.deleteByOrderId(id); //更新库存 for (InvProductEntity invProductEntity : invPreInProductList) { //查询库存码详情,如果库存码详情为空,则删除此库存 @@ -517,7 +519,7 @@ public class OrderServiceImpl implements OrderService { //如果库存码详情为空,则删除此库存 invPreInProductDao.deleteById(String.valueOf(invProductEntity.getId())); } else { - invProductDao.updateInvProduct(invProductEntity); + invPreInProductDao.updateInvProduct(invProductEntity); } } } else { diff --git a/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/StockOrderServiceImpl.java b/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/StockOrderServiceImpl.java index f136561..9a97577 100644 --- a/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/StockOrderServiceImpl.java +++ b/api-admin/src/main/java/com/glxp/sale/admin/service/inout/impl/StockOrderServiceImpl.java @@ -2,23 +2,57 @@ package com.glxp.sale.admin.service.inout.impl; import cn.hutool.core.util.StrUtil; import com.github.pagehelper.PageHelper; +import com.glxp.sale.admin.constant.ConstantStatus; +import com.glxp.sale.admin.constant.ConstantType; +import com.glxp.sale.admin.dao.basic.BussinessLocalTypeDao; +import com.glxp.sale.admin.dao.inout.CodesDao; +import com.glxp.sale.admin.dao.inout.OrderDao; import com.glxp.sale.admin.dao.inout.StockOrderDao; +import com.glxp.sale.admin.dao.inventory.InvPreInProductDao; +import com.glxp.sale.admin.dao.inventory.InvPreInProductDetailDao; +import com.glxp.sale.admin.dao.inventory.InvProductDao; +import com.glxp.sale.admin.dao.inventory.InvProductDetailDao; +import com.glxp.sale.admin.entity.inout.OrderEntity; import com.glxp.sale.admin.entity.inout.StockOrderEntity; import com.glxp.sale.admin.entity.inout.StockOrderPrintEntity; +import com.glxp.sale.admin.entity.inventory.InvProductDetailEntity; +import com.glxp.sale.admin.entity.inventory.InvProductEntity; import com.glxp.sale.admin.req.inout.StockOrderFilterRequest; import com.glxp.sale.admin.req.inout.StockOrderQueryRequest; +import com.glxp.sale.admin.req.inventory.FilterInvProductDetailRequest; +import com.glxp.sale.admin.req.inventory.FilterInvProductRequest; import com.glxp.sale.admin.service.inout.StockOrderService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +@Transactional @Service public class StockOrderServiceImpl implements StockOrderService { @Resource - StockOrderDao stockOrderDao; + private StockOrderDao stockOrderDao; + @Resource + private InvProductDao invProductDao; + @Resource + private InvProductDetailDao invProductDetailDao; + @Resource + private OrderDao orderDao; + @Resource + private BussinessLocalTypeDao bussinessLocalTypeDao; + @Resource + private InvPreInProductDetailDao invPreInProductDetailDao; + @Resource + private InvPreInProductDao invPreInProductDao; + @Resource + private CodesDao codesDao; + @Override public List listStockOrders(StockOrderQueryRequest stockOrderQueryRequest) { @@ -127,4 +161,178 @@ public class StockOrderServiceImpl implements StockOrderService { return stockOrderDao.selectSupplementOrderList(); } + @Override + public boolean rollbackOrder(String billNo) { + //查询业务单据 + StockOrderEntity stockOrderEntity = stockOrderDao.selectByBillNo(billNo); + + //查询扫码单据 + OrderEntity orderEntity = orderDao.selectByBillNo(billNo); + if (stockOrderEntity.getStatus().equals(ConstantStatus.SORDER_CHECKED)) { + //回退未验收单据 + + /* + 业务逻辑: + 回滚扫码单据状态到等待校验,并置空业务单据关联的扫码单据号,将此业务单据与扫码单据脱离关联,恢复可以被选择的状态 + */ + stockOrderEntity.setOrderIdFk(null); + stockOrderEntity.setStatus(ConstantStatus.SORDER_CHECK); + + orderEntity.setStatus(ConstantStatus.ORDER_STATUS_CHECK); + + //更新单据状态 + stockOrderDao.updateById(stockOrderEntity); + orderDao.updateOrder(orderEntity); + } else { + //回退已完成单据 + + /* + 业务逻辑: + 查询此业务单据对应的扫码单据,判断是否是预验收单据 + 如果是预验收单据,则扣减预验收库的库存 + 不是预验收单据,则正常扣减库存,回滚业务单据状态 + */ + if (isPreInOrder(orderEntity)) { + //查询预验收库库存详情 + FilterInvProductDetailRequest filterInvProductDetailRequest = new FilterInvProductDetailRequest(); + filterInvProductDetailRequest.setOrderIdFk(orderEntity.getId()); + List invProductDetailEntities = invPreInProductDetailDao.filterInvProductDetail(filterInvProductDetailRequest); + + Map> invPreInProductDetailMap = invProductDetailEntities.stream().collect(Collectors.groupingBy(InvProductDetailEntity::getProductIdFk)); + + List invPreInProductList = new ArrayList<>(invPreInProductDetailMap.keySet().size()); + + for (String productId : invPreInProductDetailMap.keySet()) { + List detailList = invPreInProductDetailMap.get(productId); + FilterInvProductRequest filterInvProductRequest = new FilterInvProductRequest(); + filterInvProductRequest.setRelIdFk(productId); + filterInvProductRequest.setSupId(detailList.get(0).getSupId()); + filterInvProductRequest.setInvWarehouseCode(detailList.get(0).getInvWarehouseCode()); + filterInvProductRequest.setInvStorageCode(detailList.get(0).getInvStorageCode()); + if (StrUtil.isBlank(detailList.get(0).getBatchNo())) { + filterInvProductRequest.setBatchNo("empty"); + } else { + filterInvProductRequest.setBatchNo(detailList.get(0).getBatchNo()); + } + List invProductEntities = invPreInProductDao.filterInvProduct(filterInvProductRequest); + InvProductEntity invProductEntity = invProductEntities.get(0); + detailList.forEach(invProductDetailEntity -> { + calculateInvCount(invProductEntity, invProductDetailEntity); + }); + + invPreInProductList.add(invProductEntity); + } + + //删除库存详情 + invPreInProductDetailDao.deleteByOrderId(orderEntity.getId()); + //删除码详情 + codesDao.deleteByOrderId(orderEntity.getId()); + //更新库存 + for (InvProductEntity invProductEntity : invPreInProductList) { + //查询库存码详情,如果库存码详情为空,则删除此库存 + FilterInvProductDetailRequest detailParams = new FilterInvProductDetailRequest(); + detailParams.setBatchNo(invProductEntity.getBatchNo()); + detailParams.setInvCodes(Collections.singletonList(invProductEntity.getInvStorageCode())); + detailParams.setProductIdFk(invProductEntity.getRelIdFk()); + int count = invPreInProductDetailDao.statCount(detailParams); + if (count == 0) { + //如果库存码详情为空,则删除此库存 + invPreInProductDao.deleteById(String.valueOf(invProductEntity.getId())); + } else { + invPreInProductDao.updateInvProduct(invProductEntity); + } + } + } else { + //非预验收单据库存,正常扣减库存 + FilterInvProductDetailRequest filterInvProductDetailRequest = new FilterInvProductDetailRequest(); + filterInvProductDetailRequest.setOrderIdFk(orderEntity.getId()); + List invProductDetailEntities = invProductDetailDao.filterInvProductDetail(filterInvProductDetailRequest); + + //合并各个产品集合数据 + Map> invProductDetailMap = invProductDetailEntities.stream().collect(Collectors.groupingBy(InvProductDetailEntity::getProductIdFk)); + + List invProductList = new ArrayList<>(invProductDetailMap.keySet().size()); + + for (String productId : invProductDetailMap.keySet()) { + List detailList = invProductDetailMap.get(productId); + //查询库存 + FilterInvProductRequest filterInvProductRequest = new FilterInvProductRequest(); + filterInvProductRequest.setRelIdFk(productId); + filterInvProductRequest.setSupId(detailList.get(0).getSupId()); + filterInvProductRequest.setInvWarehouseCode(detailList.get(0).getInvWarehouseCode()); + filterInvProductRequest.setInvStorageCode(detailList.get(0).getInvStorageCode()); + if (StrUtil.isNotBlank(detailList.get(0).getBatchNo())) { + filterInvProductRequest.setBatchNo("empty"); + } else { + filterInvProductRequest.setBatchNo(detailList.get(0).getBatchNo()); + } + List invProductEntities = invProductDao.filterInvProduct(filterInvProductRequest); + InvProductEntity invProductEntity = invProductEntities.get(0); + + detailList.forEach(invProductDetailEntity -> calculateInvCount(invProductEntity, invProductDetailEntity)); + + invProductList.add(invProductEntity); + } + + //删除库存详情 + invProductDetailDao.deleteByOrderId(orderEntity.getId()); + //删除码详情 + codesDao.deleteByOrderId(orderEntity.getId()); + //更新库存 + for (InvProductEntity invProductEntity : invProductList) { + //查询库存码详情,如果库存码详情为空,则删除此库存 + FilterInvProductDetailRequest detailParams = new FilterInvProductDetailRequest(); + detailParams.setBatchNo(invProductEntity.getBatchNo()); + detailParams.setInvCodes(Collections.singletonList(invProductEntity.getInvStorageCode())); + detailParams.setProductIdFk(invProductEntity.getRelIdFk()); + int count = invProductDetailDao.statCount(detailParams); + if (count == 0) { + //如果库存码详情为空,则删除此库存 + invProductDao.deleteById(String.valueOf(invProductEntity.getId())); + } else { + invProductDao.updateInvProduct(invProductEntity); + } + } + } + + //修改单据状态到未验收 + stockOrderEntity.setStatus(ConstantStatus.SORDER_CHECKED); + } + + //更新业务单据数据 + stockOrderDao.updateById(stockOrderEntity); + return true; + } + + /** + * 计算库存数量 + * + * @param invProductEntity + * @param invProductDetailEntity + */ + private void calculateInvCount(InvProductEntity invProductEntity, InvProductDetailEntity invProductDetailEntity) { + if (ConstantType.TYPE_PUT.equals(invProductDetailEntity.getMainAction())) { + //入库,扣减入库数量 + int count = invProductEntity.getInCount() - invProductDetailEntity.getCount(); + invProductEntity.setInCount(count); + } else if (ConstantType.TYPE_OUT.equals(invProductDetailEntity.getMainAction())) { + //出库,扣减出库数量 + int count = invProductEntity.getOutCount() - invProductDetailEntity.getCount(); + invProductEntity.setOutCount(count); + } + } + + /** + * 判断单据是否是预验收单据 + * + * @param orderEntity + * @return + */ + private boolean isPreInOrder(OrderEntity orderEntity) { + Boolean isTrue = bussinessLocalTypeDao.selectPreInByOrderType(orderEntity.getAction()); + if (isTrue == null) + return false; + return isTrue; + } + } diff --git a/api-admin/src/main/resources/mybatis/mapper/inout/StockOrderDao.xml b/api-admin/src/main/resources/mybatis/mapper/inout/StockOrderDao.xml index 6538da6..f61f959 100644 --- a/api-admin/src/main/resources/mybatis/mapper/inout/StockOrderDao.xml +++ b/api-admin/src/main/resources/mybatis/mapper/inout/StockOrderDao.xml @@ -376,4 +376,8 @@ where orderIdFk = #{orderIdFk} + + \ No newline at end of file