Jelajahi Sumber

维多利亚采购退货

yzc 2 tahun lalu
induk
melakukan
bb473058f1

+ 9 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/purchase/PurchaseBackController.java

@@ -1,5 +1,6 @@
 package com.fjhx.victoriatourist.controller.purchase;
 
+import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.victoriatourist.entity.purchase.vo.PurchaseBackVo;
@@ -49,4 +50,12 @@ public class PurchaseBackController {
         purchaseBackService.add(purchaseBackDto);
     }
 
+    /**
+     * 采购退货待出库出库
+     */
+    @PostMapping("/backOut")
+    public void backOut(@RequestBody StockWaitDetailsDto stockWaitDetailsDto) {
+        purchaseBackService.backOut(stockWaitDetailsDto);
+    }
+
 }

+ 5 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/purchase/PurchaseBackService.java

@@ -1,6 +1,7 @@
 package com.fjhx.victoriatourist.service.purchase;
 
 import com.fjhx.victoriatourist.entity.purchase.po.PurchaseBack;
+import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
 import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.victoriatourist.entity.purchase.vo.PurchaseBackVo;
@@ -33,4 +34,8 @@ public interface PurchaseBackService extends BaseService<PurchaseBack> {
      */
     void add(PurchaseBackDto purchaseBackDto);
 
+    /**
+     * 采购退货待出库出库
+     */
+    void backOut(StockWaitDetailsDto stockWaitDetailsDto);
 }

+ 47 - 7
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/purchase/impl/PurchaseBackServiceImpl.java

@@ -2,9 +2,10 @@ package com.fjhx.victoriatourist.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.purchase.entity.sales.po.SalesReturnDetail;
+import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.victoriatourist.entity.purchase.dto.PurchaseBackDto;
 import com.fjhx.victoriatourist.entity.purchase.dto.PurchaseBackSelectDto;
 import com.fjhx.victoriatourist.entity.purchase.po.PurchaseBack;
@@ -14,17 +15,19 @@ import com.fjhx.victoriatourist.entity.purchase.vo.PurchaseBackVo;
 import com.fjhx.victoriatourist.mapper.purchase.PurchaseBackMapper;
 import com.fjhx.victoriatourist.service.purchase.PurchaseBackDetailsService;
 import com.fjhx.victoriatourist.service.purchase.PurchaseBackService;
+import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
+import com.fjhx.wms.entity.stock.emums.JournalType;
 import com.fjhx.wms.entity.stock.emums.StockWaitType;
-import com.fjhx.wms.entity.stock.po.StockWait;
-import com.fjhx.wms.entity.stock.po.StockWaitDetails;
-import com.fjhx.wms.service.stock.StockWaitDetailsService;
-import com.fjhx.wms.service.stock.StockWaitService;
+import com.fjhx.wms.entity.stock.po.*;
+import com.fjhx.wms.service.stock.*;
+import com.fjhx.wms.utils.CodeEnum;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 
@@ -44,6 +47,12 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
     private StockWaitService stockWaitService;
     @Autowired
     private StockWaitDetailsService stockWaitDetailsService;
+    @Autowired
+    private StockJournalService stockJournalService;
+    @Autowired
+    private StockJournalDetailsService stockJournalDetailsService;
+    @Autowired
+    private StockService stockService;
 
     @Override
     public Page<PurchaseBackVo> getPage(PurchaseBackSelectDto dto) {
@@ -76,7 +85,7 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
         stockWait.setBusinessId(purchaseBackDto.getId());
         stockWait.setType(2);//出库
         stockWait.setStatus(0);//待出库
-        stockWait.setBusinessType(StockWaitType.WDLY_PURCHASE_BACK_OUT.getDetailType());//已采购退货出库
+        stockWait.setBusinessType(StockWaitType.BACK_OUT.getDetailType());//已采购退货出库
         stockWaitService.save(stockWait);
         List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
         for (PurchaseBackDetails purchaseBackDetails : purchaseBackDetailsList) {
@@ -90,4 +99,35 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
         stockWaitDetailsService.saveBatch(stockWaitDetailsList);
     }
 
+    @Override
+    @DSTransactional
+    public void backOut(StockWaitDetailsDto stockWaitDetailsDto){
+        //修改待出入库状态
+        stockWaitDetailsService.changeStockWaitStatus(stockWaitDetailsDto);
+        StockWaitDetails stockWaitDetails = stockWaitDetailsService.getById(stockWaitDetailsDto.getId());
+        StockWait byId = stockWaitService.getById(stockWaitDetails.getStockWaitId());
+        //创建出入库记录
+        StockJournal stockJournal = new StockJournal();
+        stockJournal.setOpType(byId.getType());
+        //退货出库
+        stockJournal.setType(JournalType.BACK_OUT.getDetailType());
+
+        DynamicDataSourceContextHolder.push(SourceConstant.WMS);
+        stockJournal.setCode(CodeEnum.SOUT_CODE.getCode());
+        DynamicDataSourceContextHolder.poll();
+
+        stockJournal.setWarehouseId(stockWaitDetailsDto.getWarehouseId());
+        stockJournal.setBusinessId(byId.getId());
+        //保存出入库记录
+        stockJournalService.save(stockJournal);
+        //操作库存
+        Stock stock = new Stock();
+        stock.setQuantity(stockWaitDetailsDto.getQuantity());
+        stock.setProductId(stockWaitDetails.getProductId());
+        //退货出库出次品库存
+        List<StockJournalDetails> stockJournalDetailsList = stockService.ModifyInventory(stockJournal.getId(), 4, Arrays.asList(stock), stockWaitDetailsDto.getWarehouseId());
+        //保存出入库明细
+        stockJournalDetailsService.saveBatch(stockJournalDetailsList);
+    }
+
 }

+ 1 - 2
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java

@@ -13,8 +13,7 @@ public enum StockWaitType {
     BACK_OUT(InOutType.OUT, 4, "退货出库", ""),
     JD_ORDER_OUT(InOutType.OUT, 5, "京东订单出库", "jd_order"),
     SALE_ORDER_OUT(InOutType.OUT, 6, "销售订单出库", "order_info"),
-    PRODUCTION_TASK_OUT(InOutType.OUT, 7, "生产任务待出库", "production_task"),
-    WDLY_PURCHASE_BACK_OUT(InOutType.OUT, 8, "维多利亚采购退货出库", "purchase_back");
+    PRODUCTION_TASK_OUT(InOutType.OUT, 7, "生产任务待出库", "production_task");
 
 
     /**

+ 2 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockWaitDetailsService.java

@@ -33,6 +33,8 @@ public interface StockWaitDetailsService extends BaseService<StockWaitDetails> {
      */
     void add(StockWaitDetailsDto stockWaitDetailsDto);
 
+    void changeStockWaitStatus(StockWaitDetailsDto stockWaitDetailsDto);
+
     /**
      * 待出入库明细编辑
      */

+ 17 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -339,7 +339,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
      * 操作库存通用方法
      *
      * @param stockJournalId 出入库记录id
-     * @param type           1入库 2出库 3维多利亚冻结库存入库
+     * @param type           1入库 2出库 3维多利亚冻结库存入库 4维多利亚待出库次品库存
      */
     @Override
     public List<StockJournalDetails> ModifyInventory(Long stockJournalId, int type, List<Stock> list, Long warehouseId) {
@@ -386,6 +386,22 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 frozenQuantity = frozenQuantity.add(stock.getQuantity());
                 json.put("frozenQuantity", frozenQuantity);
                 oldStocks.setVictoriatouristJson(json.toJSONString());
+            } else if (type == 4) {
+                //维多利亚待出库操作次品库存
+                String victoriatouristJson = oldStocks.getVictoriatouristJson();
+                JSONObject json = ObjectUtil.isEmpty(victoriatouristJson) ? new JSONObject() : JSONObject.parseObject(victoriatouristJson);
+                BigDecimal defectiveQuantity = json.getBigDecimal("defectiveQuantity");
+                defectiveQuantity = defectiveQuantity == null ? BigDecimal.ZERO : defectiveQuantity;
+                defectiveQuantity = defectiveQuantity.subtract(stock.getQuantity());
+                if (defectiveQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                    ProductInfo productInfo = productInfoService.getById(stock.getProductId());
+                    if (productInfo == null) {
+                        throw new ServiceException("产品id:" + stock.getProductId() + "不存在");
+                    }
+                    throw new ServiceException("以下商品次品库存不足,无法出库:" + productInfo.getName());
+                }
+                json.put("defectiveQuantity", defectiveQuantity);
+                oldStocks.setVictoriatouristJson(json.toJSONString());
             } else {
                 throw new ServiceException("未知库存操作类型");
             }

+ 60 - 48
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java

@@ -1,28 +1,27 @@
 package com.fjhx.wms.service.stock.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
+import com.fjhx.wms.entity.stock.dto.StockWaitDetailsSelectDto;
 import com.fjhx.wms.entity.stock.emums.JournalType;
 import com.fjhx.wms.entity.stock.emums.StockWaitType;
 import com.fjhx.wms.entity.stock.po.*;
+import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
 import com.fjhx.wms.mapper.stock.StockWaitDetailsMapper;
 import com.fjhx.wms.service.WmsService;
 import com.fjhx.wms.service.stock.*;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.wms.utils.CodeEnum;
 import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
-import com.fjhx.wms.entity.stock.dto.StockWaitDetailsSelectDto;
-import com.ruoyi.common.utils.wrapper.IWrapper;
-import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
-import cn.hutool.core.bean.BeanUtil;
 
-import javax.xml.ws.soap.Addressing;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
@@ -33,7 +32,7 @@ import java.util.List;
  * 待出入库明细 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-04-13
  */
 @Service
@@ -57,16 +56,16 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
     public Page<StockWaitDetailsVo> getPage(StockWaitDetailsSelectDto dto) {
         IWrapper<StockWaitDetails> wrapper = getWrapper();
         wrapper.orderByDesc("swd", StockWaitDetails::getId);
-        wrapper.eq("sw", StockWait::getType,dto.getType());
-        if(ObjectUtil.isNotEmpty(dto.getKeyword())){
-            wrapper.and(q->q.like(StockWaitDetails::getQuantity,dto.getKeyword()).or().like(StockWaitDetailsVo::getBusinessCode,dto.getKeyword()));
+        wrapper.eq("sw", StockWait::getType, dto.getType());
+        if (ObjectUtil.isNotEmpty(dto.getKeyword())) {
+            wrapper.and(q -> q.like(StockWaitDetails::getQuantity, dto.getKeyword()).or().like(StockWaitDetailsVo::getBusinessCode, dto.getKeyword()));
         }
-        wrapper.eq("sw", StockWait::getBusinessType,dto.getBusinessType());
-        wrapper.eq("sw", StockWait::getStatus,dto.getStatus());
+        wrapper.eq("sw", StockWait::getBusinessType, dto.getBusinessType());
+        wrapper.eq("sw", StockWait::getStatus, dto.getStatus());
         Page<StockWaitDetailsVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<StockWaitDetailsVo> records = page.getRecords();
         for (StockWaitDetailsVo record : records) {
-            if(ObjectUtil.isEmpty(record.getReceiptQuantity())){
+            if (ObjectUtil.isEmpty(record.getReceiptQuantity())) {
                 record.setReceiptQuantity(BigDecimal.ZERO);
             }
         }
@@ -88,14 +87,15 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
         StockWaitDetailsVo result = BeanUtil.toBean(StockWaitDetails, StockWaitDetailsVo.class);
         //查询待入库信息
         StockWait stockWait = stockWaitService.getById(result.getStockWaitId());
-        if(ObjectUtil.isEmpty(stockWait)){
-            throw new ServiceException("无法查询到待入库信息,待入库id"+result.getStockWaitId());
+        if (ObjectUtil.isEmpty(stockWait)) {
+            throw new ServiceException("无法查询到待入库信息,待入库id" + result.getStockWaitId());
         }
         result.setBusinessType(stockWait.getBusinessType());
-        result.setBusinessCode(stockWait.getBusinessCode());;
+        result.setBusinessCode(stockWait.getBusinessCode());
+        ;
         ProductInfo byId = productInfoService.getById(StockWaitDetails.getProductId());
-        if(ObjectUtil.isEmpty(byId)){
-            throw new ServiceException("无法查询到产品信息,产品id"+StockWaitDetails.getProductId());
+        if (ObjectUtil.isEmpty(byId)) {
+            throw new ServiceException("无法查询到产品信息,产品id" + StockWaitDetails.getProductId());
         }
         result.setProductName(byId.getName());
         return result;
@@ -104,34 +104,11 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
     @Override
     @DSTransactional
     public void add(StockWaitDetailsDto stockWaitDetailsDto) {
-        //更新已入库数量 根据明细id
+        //修改待出库状态
+        changeStockWaitStatus(stockWaitDetailsDto);
         StockWaitDetails stockWaitDetails = getById(stockWaitDetailsDto.getId());
-        if(ObjectUtil.isEmpty(stockWaitDetails)){
-            throw new ServiceException("无法查询到明细信息");
-        }
-        BigDecimal receiptQuantity = stockWaitDetails.getReceiptQuantity();
-        receiptQuantity = ObjectUtil.isEmpty(receiptQuantity) ? BigDecimal.ZERO : receiptQuantity;
-        stockWaitDetails.setReceiptQuantity(receiptQuantity.add(stockWaitDetailsDto.getQuantity()));
-        if (stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) > 0) {
-            throw new ServiceException("出库数量+已出库数量不能大于待出库数量");
-        }
-        updateById(stockWaitDetails);
-        //更新待出库记录状态
-        Integer statusFlag = 0;
-        List<StockWaitDetails> stockWaitDetailsList = list(q -> q.eq(StockWaitDetails::getStockWaitId, stockWaitDetails.getStockWaitId()));
-        for (StockWaitDetails waitDetails : stockWaitDetailsList) {
-            //计算已经完全出库的数量
-            if (waitDetails.getReceiptQuantity().compareTo(waitDetails.getQuantity()) == 0) {
-                statusFlag++;
-            }
-        }
         StockWait byId = stockWaitService.getById(stockWaitDetails.getStockWaitId());
-        if (statusFlag == stockWaitDetailsList.size()) {
-            byId.setStatus(2);//入库完成
-        } else {
-            byId.setStatus(1);//部分入库
-        }
-        stockWaitService.updateById(byId);
+
         //创建出入库记录
         StockJournal stockJournal = new StockJournal();
         stockJournal.setOpType(byId.getType());
@@ -149,11 +126,11 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
         } else if (StockWaitType.BACK_OUT.getDetailType().equals(businessType)) {
             //退货出货
             stockJournal.setType(JournalType.BACK_OUT.getDetailType());
-        }else if (StockWaitType.SALE_ORDER_OUT.getDetailType().equals(businessType)) {
+        } else if (StockWaitType.SALE_ORDER_OUT.getDetailType().equals(businessType)) {
             //销售订单出库
             stockJournal.setType(JournalType.SALES_OUT.getDetailType());
             wmsService.outbound(stockWaitDetailsDto);
-        }else if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(businessType)) {
+        } else if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(businessType)) {
             //生产任务待出库
             stockJournal.setType(JournalType.PRODUCTION_TASK_OUT.getDetailType());
             //减少冻结库存
@@ -178,6 +155,41 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
     }
 
+    /**
+     * 更新待出入库状态
+     */
+    @Override
+    public void changeStockWaitStatus(StockWaitDetailsDto stockWaitDetailsDto) {
+        //更新已入库数量 根据明细id
+        StockWaitDetails stockWaitDetails = getById(stockWaitDetailsDto.getId());
+        if (ObjectUtil.isEmpty(stockWaitDetails)) {
+            throw new ServiceException("无法查询到明细信息");
+        }
+        BigDecimal receiptQuantity = stockWaitDetails.getReceiptQuantity();
+        receiptQuantity = ObjectUtil.isEmpty(receiptQuantity) ? BigDecimal.ZERO : receiptQuantity;
+        stockWaitDetails.setReceiptQuantity(receiptQuantity.add(stockWaitDetailsDto.getQuantity()));
+        if (stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) > 0) {
+            throw new ServiceException("出库数量+已出库数量不能大于待出库数量");
+        }
+        updateById(stockWaitDetails);
+        //更新待出库记录状态
+        Integer statusFlag = 0;
+        List<StockWaitDetails> stockWaitDetailsList = list(q -> q.eq(StockWaitDetails::getStockWaitId, stockWaitDetails.getStockWaitId()));
+        for (StockWaitDetails waitDetails : stockWaitDetailsList) {
+            //计算已经完全出库的数量
+            if (waitDetails.getReceiptQuantity().compareTo(waitDetails.getQuantity()) == 0) {
+                statusFlag++;
+            }
+        }
+        StockWait byId = stockWaitService.getById(stockWaitDetails.getStockWaitId());
+        if (statusFlag == stockWaitDetailsList.size()) {
+            byId.setStatus(2);//入库完成
+        } else {
+            byId.setStatus(1);//部分入库
+        }
+        stockWaitService.updateById(byId);
+    }
+
     @Override
     public void edit(StockWaitDetailsDto stockWaitDetailsDto) {
         this.updateById(stockWaitDetailsDto);