Parcourir la source

添加批量导入

yzc il y a 1 an
Parent
commit
8adaf49ab1

+ 22 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdOrderController.java

@@ -2,6 +2,7 @@ package com.fjhx.victoriatourist.controller.jd;
 
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.victoriatourist.entity.jd.dto.JdOrderDto;
 import com.fjhx.victoriatourist.entity.jd.dto.JdOrderSelectDto;
@@ -169,4 +170,25 @@ public class JdOrderController {
     void saveDiversion(@RequestBody JdOrderDto dto) {
         jdOrderService.saveDiversion(dto);
     }
+
+
+    /**
+     * 京东订单批量出库ExcelInfo
+     */
+    @PostMapping("/getBatchOutExcelInfo")
+    public List<String> getBatchOutExcelInfo(@RequestParam("file") MultipartFile file) {
+        return jdOrderService.getBatchOutExcelInfo(file);
+    }
+
+    /**
+     * 京东订单批量出库
+     */
+    @PostMapping("/batchOutStock")
+    public void batchOutStock(@RequestParam("file") MultipartFile file,
+                              @RequestParam("warehouseId") Long warehouseId,
+                              @RequestParam("outInfo") String outInfoStr) {
+        JSONObject outInfo = JSONObject.parseObject(outInfoStr.substring(outInfoStr.indexOf("{"), outInfoStr.lastIndexOf("}") + 1));
+        jdOrderService.batchOutStock(file, warehouseId, outInfo);
+    }
+
 }

+ 38 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/JdBatchOutStockBo.java

@@ -0,0 +1,38 @@
+package com.fjhx.victoriatourist.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 京东批量出库实体
+ */
+@Getter
+@Setter
+public class JdBatchOutStockBo {
+    /**
+     * 订单信息表Id
+     */
+    private Long orderInfoId;
+
+    /**
+     * 订单Id
+     */
+    private Long orderId;
+
+    /**
+     * 产品Id
+     */
+    private Long productId;
+
+    /**
+     * 产品编号
+     */
+    private String productCode;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+}

+ 24 - 12
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/deliver/impl/DeliverGoodsServiceImpl.java

@@ -24,6 +24,7 @@ import com.fjhx.purchase.entity.purchase.vo.PurchaseDetailVo;
 import com.fjhx.purchase.entity.purchase.vo.PurchaseVo;
 import com.fjhx.purchase.entity.quality.po.QualityDetail;
 import com.fjhx.purchase.entity.quality.vo.QualityDetailVo;
+import com.fjhx.purchase.mapper.purchase.PurchaseDetailMapper;
 import com.fjhx.purchase.service.arrival.ArrivalDetailService;
 import com.fjhx.purchase.service.purchase.PurchaseDetailService;
 import com.fjhx.purchase.service.purchase.PurchaseService;
@@ -66,7 +67,9 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -114,6 +117,8 @@ public class DeliverGoodsServiceImpl extends ServiceImpl<DeliverGoodsMapper, Del
     private ArrivalStockRecordsDetailsService arrivalStockRecordsDetailsService;
     @Autowired
     private QualityDetailsService qualityDetailsService;
+    @Autowired
+    private PurchaseDetailMapper purchaseDetailMapper;
 
     @Value("${spring.profiles.active}")
     private String active;
@@ -265,15 +270,21 @@ public class DeliverGoodsServiceImpl extends ServiceImpl<DeliverGoodsMapper, Del
             result.setSupplyName(supplierInfo.getName());
         }
         //赋值采购明细
-        List<PurchaseDetail> purchaseDetailList = purchaseDetailService.list(q -> q.eq(PurchaseDetail::getPurchaseId, purchase.getId()));
-        List<PurchaseDetailVo> purchaseDetailVoList = BeanUtil.copyToList(purchaseDetailList, PurchaseDetailVo.class);
-        //赋值产品信息
-        productInfoService.attributeAssign(purchaseDetailVoList, PurchaseDetailVo::getBussinessId, (item, productInfo) -> {
-            item.setProductCode(productInfo.getCode());
-            item.setProductName(productInfo.getName());
-            item.setProductCustomCode(productInfo.getCustomCode());
-            item.setProductSpec(productInfo.getSpec());
-        });
+//        List<PurchaseDetail> purchaseDetailList = purchaseDetailService.list(q -> q.eq(PurchaseDetail::getPurchaseId, purchase.getId()));
+//        List<PurchaseDetailVo> purchaseDetailVoList = BeanUtil.copyToList(purchaseDetailList, PurchaseDetailVo.class);
+        DynamicDataSourceContextHolder.push(SourceConstant.PURCHASE);
+        List<PurchaseDetailVo> purchaseDetailVoList = purchaseDetailMapper.getList(IWrapper.<PurchaseDetail>getWrapper()
+                .eq(PurchaseDetail::getPurchaseId, purchase.getId())
+                .orderByAsc("pi.name")
+        );
+        DynamicDataSourceContextHolder.poll();
+//        //赋值产品信息
+//        productInfoService.attributeAssign(purchaseDetailVoList, PurchaseDetailVo::getBussinessId, (item, productInfo) -> {
+//            item.setProductCode(productInfo.getCode());
+//            item.setProductName(productInfo.getName());
+//            item.setProductCustomCode(productInfo.getCustomCode());
+//            item.setProductSpec(productInfo.getSpec());
+//        });
         //赋值质检信息
         List<QualityDetailVo> qualityInfoByPurchaseId = baseMapper.getQualityInfoByPurchaseId(purchase.getId());
         //赋值质检人名称
@@ -474,8 +485,9 @@ public class DeliverGoodsServiceImpl extends ServiceImpl<DeliverGoodsMapper, Del
             purchaseDetailVo.setReceiptList(stockJournalDetailsVos);
         }
 
-        //名称升序
-        Collections.sort(purchaseDetailList, Comparator.comparing(PurchaseDetail::getProductName));
+//        //名称升序
+//        List<PurchaseDetailVo> collect = purchaseDetailVoList.stream().filter(item -> ObjectUtil.isNotEmpty(item.getProductName())).collect(Collectors.toList());
+//        Collections.sort(collect, Comparator.comparing(PurchaseDetail::getProductName));
 
         result.setPurchaseDetailVoList(purchaseDetailVoList);
         return result;

+ 10 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/JdOrderService.java

@@ -1,5 +1,6 @@
 package com.fjhx.victoriatourist.service.jd;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.victoriatourist.entity.jd.dto.JdOrderDto;
 import com.fjhx.victoriatourist.entity.jd.dto.JdOrderSelectDto;
@@ -76,4 +77,13 @@ public interface JdOrderService extends BaseService<JdOrder> {
      * 设置分流
      */
     void saveDiversion(@RequestBody JdOrderDto dto);
+
+    /**
+     * 获取批量出库订单信息
+     */
+    List<String> getBatchOutExcelInfo(MultipartFile file);
+    /**
+     * 京东订单批量出库
+     */
+    void batchOutStock(MultipartFile file, Long warehouseId, JSONObject outInfo);
 }

+ 165 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdOrderServiceImpl.java

@@ -6,6 +6,10 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -19,6 +23,7 @@ import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.item.util.excel.util.ExcelUtil;
 import com.fjhx.kd100.entity.company.po.CompanyInfo;
 import com.fjhx.kd100.service.company.CompanyInfoService;
+import com.fjhx.victoriatourist.entity.JdBatchOutStockBo;
 import com.fjhx.victoriatourist.entity.abnormal.po.AbnormalInfo;
 import com.fjhx.victoriatourist.entity.jd.bo.JdOrderExcelImportBo;
 import com.fjhx.victoriatourist.entity.jd.dto.JdOrderDto;
@@ -41,6 +46,7 @@ import com.fjhx.victoriatourist.service.jd.JdOrderService;
 import com.fjhx.victoriatourist.service.logistics.LogisticsInfosService;
 import com.fjhx.victoriatourist.service.stock.StockTransferDetailsService;
 import com.fjhx.victoriatourist.service.stock.StockTransferService;
+import com.fjhx.wms.entity.stock.dto.StockWaitDto;
 import com.fjhx.wms.entity.stock.emums.JournalType;
 import com.fjhx.wms.entity.stock.emums.StockWaitType;
 import com.fjhx.wms.entity.stock.po.*;
@@ -57,6 +63,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.*;
@@ -708,6 +715,7 @@ public class JdOrderServiceImpl extends ServiceImpl<JdOrderMapper, JdOrder> impl
             for (JdOrderDetailsVo jdOrderDetailsVo : jdOrderDetailsList) {
                 //创建待出库明细
                 StockWaitDetails stockWaitDetails = new StockWaitDetails();
+                stockWaitDetails.setBusinessId(jdOrder.getId());
                 stockWaitDetails.setStockWaitId(stockWait.getId());
                 stockWaitDetails.setBusinessDetailsId(jdOrderDetailsVo.getId());
                 stockWaitDetails.setProductId(jdOrderDetailsVo.getProductId());
@@ -814,4 +822,161 @@ public class JdOrderServiceImpl extends ServiceImpl<JdOrderMapper, JdOrder> impl
                 .set(JdOrder::getUpdateTime, new Date())
         );
     }
+
+    private List<Map<Integer, String>> readBatchOutExcel(MultipartFile file) {
+        //读取数据
+        List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
+        try {
+            EasyExcel.read(file.getInputStream()).sheet(0).registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {
+                @Override
+                public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
+                    list.add(integerStringMap);
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext context) {
+                }
+            }).headRowNumber(0).doRead();
+        } catch (IOException e) {
+            throw new ServiceException("读取Excel文件异常!");
+        }
+        return list;
+    }
+
+    @Override
+    public List<String> getBatchOutExcelInfo(MultipartFile file) {
+        //读取数据
+        List<Map<Integer, String>> list = readBatchOutExcel(file);
+        if (ObjectUtil.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        List<String> collect = list.get(0).values().stream().collect(Collectors.toList());
+        collect.remove(0);
+        return collect;
+    }
+
+    @Override
+    public void batchOutStock(MultipartFile file, Long warehouseId, JSONObject outInfo) {
+        //读取数据
+        List<Map<Integer, String>> list = readBatchOutExcel(file);
+
+        if (ObjectUtil.isEmpty(list)) {
+            return;
+        }
+
+        //处理数据
+        List<JdBatchOutStockBo> outList = new ArrayList<>();
+        Object[] titles = null;
+        for (int i = 0; i < list.size(); i++) {
+            Map<Integer, String> items = list.get(i);
+
+            //标题数据
+            if (i == 0) {
+                titles = items.values().toArray();
+                continue;
+            }
+
+            //正文数据
+            for (int j = 1; j < titles.length; j++) {
+                if (items.get(j) == null) {
+                    continue;
+                }
+
+                JdBatchOutStockBo jdBatchOutStockBo = new JdBatchOutStockBo();
+                jdBatchOutStockBo.setOrderId(Long.parseLong((String) titles[j]));//订单号
+                jdBatchOutStockBo.setProductCode(items.get(0));//产品编号
+                jdBatchOutStockBo.setQuantity(new BigDecimal(items.get(j)));//出库数量
+
+                outList.add(jdBatchOutStockBo);
+            }
+        }
+
+        //获取基础信息集合
+        List<String> pCodes = outList.stream().map(JdBatchOutStockBo::getProductCode).distinct().collect(Collectors.toList());
+        List<Long> jdOrderIds = outList.stream().map(JdBatchOutStockBo::getOrderId).distinct().collect(Collectors.toList());
+
+        //赋值并校验 产品,京东订单 信息
+        List<String> errProductCodes = new ArrayList<>();
+        List<String> errJdOrderCodes = new ArrayList<>();
+
+        Map<String, Long> pInfoMap = productInfoService.mapKV(ProductInfo::getCustomCode, ProductInfo::getId, q -> q.in(ProductInfo::getCustomCode, pCodes));
+        Map<Long, Long> jdInfoMap = this.mapKV(JdOrder::getOrderId, JdOrder::getId, q -> q.in(JdOrder::getOrderId, jdOrderIds));
+
+        for (JdBatchOutStockBo teaBo : outList) {
+            //赋值并校验产品信息
+            String productCode = teaBo.getProductCode();
+            Long productId = pInfoMap.get(productCode);
+            if (ObjectUtil.isEmpty(productId)) {
+                errProductCodes.add(productCode);
+            }
+            teaBo.setProductId(productId);
+
+            //赋值并校验京东订单信息
+            Long orderId = teaBo.getOrderId();
+            Long jdInfoId = jdInfoMap.get(orderId);
+            if (ObjectUtil.isEmpty(jdInfoId)) {
+                errJdOrderCodes.add(String.valueOf(orderId));
+            }
+            teaBo.setOrderInfoId(jdInfoId);
+        }
+        if (ObjectUtil.isNotEmpty(errProductCodes)) {
+            throw new ServiceException("无法查询到以下产品编号对应的产品信息,请检查:" + errProductCodes.stream().distinct().collect(Collectors.joining(",")));
+        }
+        if (ObjectUtil.isNotEmpty(errJdOrderCodes)) {
+            throw new ServiceException("无法查询到以下京东订单信息,请检查:" + errJdOrderCodes.stream().distinct().collect(Collectors.joining(",")));
+        }
+
+        //封装待出库数据
+        List<Long> businessIds = outList.stream().map(JdBatchOutStockBo::getOrderInfoId).distinct().collect(Collectors.toList());
+        List<Long> productIds = outList.stream().map(JdBatchOutStockBo::getProductId).distinct().collect(Collectors.toList());
+        List<StockWaitDetails> list1 = stockWaitDetailsService.list(q -> q
+                .in(StockWaitDetails::getBusinessId, businessIds)
+                .in(StockWaitDetails::getProductId, productIds)
+        );
+        ArrayList<StockWaitDetails> outStockWaitDetailsList = new ArrayList<>();
+        for (JdBatchOutStockBo teaBo : outList) {
+            StockWaitDetails dataBaseInfo = list1.stream().filter(item ->
+                    item.getBusinessId().equals(teaBo.getOrderInfoId()) &&
+                            item.getProductId().equals(teaBo.getProductId())
+            ).findFirst().orElse(null);
+//            StockWaitDetails dataBaseInfo = stockWaitDetailsService.getOne(q -> q
+//                    .eq(StockWaitDetails::getBusinessId, teaBo.getOrderInfoId())
+//                    .eq(StockWaitDetails::getProductId, teaBo.getProductId())
+//            );
+            if (ObjectUtil.isEmpty(dataBaseInfo)) {
+                continue;
+            }
+
+            //数量校验
+            BigDecimal receiptQuantity = dataBaseInfo.getReceiptQuantity();
+            receiptQuantity = ObjectUtil.isEmpty(receiptQuantity) ? BigDecimal.ZERO : receiptQuantity;
+            if (receiptQuantity.add(teaBo.getQuantity()).compareTo(dataBaseInfo.getQuantity()) > 0) {
+                throw new ServiceException(String.format("订单号:%s,产品编号:%s 出库数量>待出库数量", teaBo.getOrderId(), teaBo.getProductCode()));
+            }
+
+            //生成信息
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(dataBaseInfo.getStockWaitId());
+            stockWaitDetails.setId(dataBaseInfo.getId());
+            stockWaitDetails.setQuantity(teaBo.getQuantity());
+            stockWaitDetails.setJdOrderId(teaBo.getOrderId());
+            stockWaitDetails.setBusinessDetailsId(dataBaseInfo.getBusinessDetailsId());
+
+            outStockWaitDetailsList.add(stockWaitDetails);
+        }
+
+        //操作待出库
+        Map<Long, List<StockWaitDetails>> outMap = outStockWaitDetailsList.stream().collect(Collectors.groupingBy(StockWaitDetails::getStockWaitId));
+        for (Map.Entry<Long, List<StockWaitDetails>> entry : outMap.entrySet()) {
+            StockWait dataBaseInfo = stockWaitService.getById(entry.getKey());
+
+            StockWaitDto stockWaitDto = outInfo.getObject(entry.getValue().get(0).getJdOrderId().toString(), StockWaitDto.class);
+            stockWaitDto.setId(entry.getKey());
+            stockWaitDto.setWarehouseId(warehouseId);
+            stockWaitDto.setStockWaitDetailsList(entry.getValue());
+            stockWaitDto.setBusinessId(dataBaseInfo.getBusinessId());
+
+            stockWaitService.addByWdly(stockWaitDto);
+        }
+    }
 }

+ 19 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockWaitDetails.java

@@ -1,5 +1,6 @@
 package com.fjhx.wms.entity.stock.po;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
@@ -55,4 +56,22 @@ public class StockWaitDetails extends BasePo {
      */
     private BigDecimal purchaseQuantity;
 
+    /**
+     * 业务主表Id
+     */
+    private Long businessId;
+
+    /**
+     * 京东订单号
+     */
+    @TableField(exist = false)
+    private Long jdOrderId;
+
+    /**
+     * 订单信息表Id
+     */
+    @TableField(exist = false)
+    private Long orderInfoId;
+
+
 }