瀏覽代碼

Merge remote-tracking branch 'origin/master'

24282 1 年之前
父節點
當前提交
17de3e8760

+ 14 - 0
sd-business/src/main/java/com/sd/business/controller/inventory/InventoryFinishedOrderController.java

@@ -1,11 +1,16 @@
 package com.sd.business.controller.inventory;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.inventory.dto.InventoryFinishedErpImportDataDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
 import com.sd.business.entity.inventory.vo.InventoryFinishedOrderVo;
 import com.sd.business.service.inventory.InventoryFinishedOrderService;
+import com.sd.framework.util.excel.util.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 
 /**
@@ -39,4 +44,13 @@ public class InventoryFinishedOrderController {
         inventoryFinishedOrderService.excelExport(dto);
     }
 
+
+    /**
+     * 成品仓明细E10模板导出
+     */
+    @PostMapping("/erpExcelExport")
+    public void erpExcelExport(MultipartFile file) {
+        List<InventoryFinishedErpImportDataDto> list = ExcelUtil.read(file, 0, InventoryFinishedErpImportDataDto.class);
+        inventoryFinishedOrderService.erpExcelExport(list);
+    }
 }

+ 41 - 0
sd-business/src/main/java/com/sd/business/entity/inventory/dto/InventoryFinishedErpImportDataDto.java

@@ -0,0 +1,41 @@
+package com.sd.business.entity.inventory.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 成品仓E10导入实体
+ *
+ * @author
+ * @since 2023-11-10
+ */
+@Getter
+@Setter
+public class InventoryFinishedErpImportDataDto {
+    /**
+     * SKU
+     */
+    @ExcelProperty(value = "SKU")
+    private String skuSpecCode;
+
+    /**
+     * 品号
+     */
+    @ExcelProperty(value = "品号")
+    private String skuSpecFinishedCode;
+
+    /**
+     * 特征码
+     */
+    @ExcelProperty(value = "特征码")
+    private String featureCode;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty(value = "业务数量")
+    private String quantity;
+}

+ 4 - 0
sd-business/src/main/java/com/sd/business/entity/inventory/po/InventoryFinishedOrder.java

@@ -52,4 +52,8 @@ public class InventoryFinishedOrder extends BasePo {
      */
     private Integer status;
 
+    /**
+     * 现存数量
+     */
+    private BigDecimal existingQuantity;
 }

+ 13 - 0
sd-business/src/main/java/com/sd/business/service/inventory/InventoryFinishedOrderService.java

@@ -2,6 +2,7 @@ package com.sd.business.service.inventory;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.inventory.dto.InventoryFinishedErpImportDataDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
 import com.sd.business.entity.inventory.po.InventoryFinishedOrder;
 import com.sd.business.entity.inventory.vo.InventoryFinishedOrderVo;
@@ -51,4 +52,16 @@ public interface InventoryFinishedOrderService extends BaseService<InventoryFini
      */
     void excelExport(InventoryFinishedOrderSelectDto dto);
 
+    /**
+     * 成品仓明细E10模板导出
+     * @param list
+     */
+    void erpExcelExport(List<InventoryFinishedErpImportDataDto> list);
+
+    /**
+     * 无源库存销售出库
+     *
+     * @param orderIdList
+     */
+    void noSourceSaleOutOfWarehouse(List<Long> orderIdList);
 }

+ 177 - 3
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryFinishedOrderServiceImpl.java

@@ -1,5 +1,9 @@
 package com.sd.business.service.inventory.impl;
 
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.constant.StatusConstant;
@@ -7,6 +11,9 @@ import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.department.constant.DepartmentConstant;
 import com.sd.business.entity.department.po.Department;
+import com.sd.business.entity.in.vo.InOutStorageBomErpExportVo;
+import com.sd.business.entity.in.vo.InOutStorageErpExportVo;
+import com.sd.business.entity.inventory.dto.InventoryFinishedErpImportDataDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
 import com.sd.business.entity.inventory.enums.FinishedOperationTypeEnum;
 import com.sd.business.entity.inventory.po.InventoryFinishedOrder;
@@ -19,17 +26,22 @@ import com.sd.business.mapper.inventory.InventoryFinishedOrderMapper;
 import com.sd.business.service.inventory.InventoryFinishedOrderDetailService;
 import com.sd.business.service.inventory.InventoryFinishedOrderService;
 import com.sd.business.service.order.OrderService;
+import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.sku.SkuSpecService;
+import com.sd.business.util.CodeEnum;
+import com.sd.framework.util.TemplateExcelUtil;
 import com.sd.framework.util.excel.util.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static java.util.Comparator.comparing;
+
 
 /**
  * <p>
@@ -49,6 +61,12 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
     private OrderService orderService;
 
     @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
     private HttpServletResponse response;
 
     @Transactional(rollbackFor = Exception.class)
@@ -63,6 +81,7 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
             inventoryFinishedOrder.setSkuSpecId(item.getSkuSpecId());
             inventoryFinishedOrder.setQuantity(item.getQuantity());
             inventoryFinishedOrder.setStatus(StatusConstant.YES);
+            inventoryFinishedOrder.setExistingQuantity(item.getQuantity());
             return inventoryFinishedOrder;
         }).collect(Collectors.toList());
         saveBatch(list);
@@ -89,6 +108,7 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
 
         for (InventoryFinishedOrder item : list) {
             item.setStatus(StatusConstant.NO);
+            item.setExistingQuantity(BigDecimal.ZERO);
             OrderInfo orderInfo = orderMap.get(item.getOrderInfoId());
             if (Objects.equals(orderInfo.getType(), 2)) {
                 item.setDepartmentId(orderInfo.getDepartmentId());
@@ -130,4 +150,158 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
         ExcelUtil.export(response, records, InventoryFinishedOrderVo.class);
     }
 
+    @Override
+    public void erpExcelExport(List<InventoryFinishedErpImportDataDto> list) {
+        Date date = new Date();
+        // 生成入库单
+        List<InOutStorageErpExportVo> inOutStorageErpExportVoList = new ArrayList<>();
+        InOutStorageErpExportVo inOutStorageErpExportVo = new InOutStorageErpExportVo();
+        inOutStorageErpExportVo.setPlantCode("SDTY");
+        inOutStorageErpExportVo.setDocCode("T119");
+        String format = DateUtil.format(date, "-yyyyMM");
+        // 生成e10入库单号后四位,当前天+50 防止与bom入库导出单号重复
+        int day = DateUtil.dayOfMonth(date);
+        int hour = DateUtil.hour(date, true);
+        int codeNum = Integer.parseInt(String.valueOf(day + 50) + hour);
+        String code = inOutStorageErpExportVo.getDocCode() + format + String.format("%04d", codeNum);
+        inOutStorageErpExportVo.setCode(code);
+        inOutStorageErpExportVo.setCreateTime(DateUtil.format(date, "yyyy/MM/dd HH:mm:ss"));
+        inOutStorageErpExportVo.setDeptCode("GPIT");
+        inOutStorageErpExportVo.setEmployeeCode("GPIT02");
+        inOutStorageErpExportVoList.add(inOutStorageErpExportVo);
+        Integer[] serialNumber = {1};
+
+        List<String> skuSpecCodes = list.stream().map(InventoryFinishedErpImportDataDto::getSkuSpecCode).collect(Collectors.toList());
+        Map<String, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getCode, q -> q.in(SkuSpec::getCode, skuSpecCodes));
+        List<Long> skuSpecIds = skuSpecMap.values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        Map<Long, Long> inventoryFinishedMap = inventoryFinishedOrderDetailService.mapKV(
+                InventoryFinishedOrderDetail::getSkuSpecId,
+                InventoryFinishedOrderDetail::getOrderSkuId,
+                q -> q.eq(InventoryFinishedOrderDetail::getOperationType, 1)
+                        .in(InventoryFinishedOrderDetail::getSkuSpecId, skuSpecIds)
+                        .isNotNull(InventoryFinishedOrderDetail::getOrderSkuId));
+        Map<Long, OrderSku> orderSkuMap = orderSkuService.mapKEntity(OrderSku::getSkuSpecId,
+                q -> q.in(BaseIdPo::getId, inventoryFinishedMap.values()));
+
+        // 生成明细
+        List<InOutStorageBomErpExportVo> inOutStorageBomErpExportVoList = list.stream()
+                .map(item -> {
+                    BigDecimal unitCost = BigDecimal.ZERO;
+                    SkuSpec skuSpec = skuSpecMap.get(item.getSkuSpecCode());
+                    if (skuSpec != null) {
+                        OrderSku orderSku = orderSkuMap.get(skuSpec.getId());
+                        if (orderSku != null) {
+                            unitCost = orderSku.getUnitPrice()
+                                    .add(orderSku.getCustomProcessingFee())
+                                    .add(orderSku.getLssueFee())
+                                    .add(orderSku.getDeliveryMaterialsFee())
+                                    .add(orderSku.getPackingLabor())
+                                    .add(orderSku.getPackagingMaterialCost())
+                                    .add(orderSku.getManagementFee());
+                        }
+                    }
+                    if (!NumberUtil.isNumber(item.getQuantity())) {
+                        item.setQuantity("0");
+                    }
+                    InOutStorageBomErpExportVo inOutStorageBomErpExportVo = new InOutStorageBomErpExportVo();
+                    inOutStorageBomErpExportVo.setCode(code);
+                    inOutStorageBomErpExportVo.setBomSpecCode(item.getSkuSpecFinishedCode());
+                    inOutStorageBomErpExportVo.setFeatureCode(item.getFeatureCode());
+                    inOutStorageBomErpExportVo.setQuantity(item.getQuantity());
+                    inOutStorageBomErpExportVo.setWarehouseCode("501");
+                    inOutStorageBomErpExportVo.setUnit("PCS");
+                    inOutStorageBomErpExportVo.setPieces("0");
+                    inOutStorageBomErpExportVo.setSourceRtk("OTHER");
+                    inOutStorageBomErpExportVo.setUnitCost(unitCost.toPlainString());
+                    inOutStorageBomErpExportVo.setCostAmt(unitCost.multiply(new BigDecimal(item.getQuantity())).toPlainString());
+                    return inOutStorageBomErpExportVo;
+                })
+                .sorted(comparing(InOutStorageBomErpExportVo::getCode))
+                .peek(item -> {
+                    item.setSerialNumber(serialNumber[0].toString());
+                    serialNumber[0]++;
+                }).collect(Collectors.toList());
+        String fileName = "成品入库单";
+        TemplateExcelUtil.writeBrowserMultiSheet("inOutStorageDetails.xlsx", 2, fileName, response, inOutStorageErpExportVoList, inOutStorageBomErpExportVoList);
+    }
+
+    @Override
+    public void noSourceSaleOutOfWarehouse(List<Long> orderIdList) {
+        if (ObjectUtil.isEmpty(orderIdList)) {
+            return;
+        }
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList));
+        Map<Long, BigDecimal> orderSkuQuantityMap = orderSkuList.stream().collect(Collectors.toMap(OrderSku::getSkuSpecId, OrderSku::getQuantity, BigDecimal::add));
+
+        // 获取所有无源可出库的库存
+        Map<Long, List<InventoryFinishedOrder>> inventoryFinishedOrderMap = this.mapKGroup(InventoryFinishedOrder::getSkuSpecId, q -> q.eq(InventoryFinishedOrder::getStatus, 1)
+                .isNull(InventoryFinishedOrder::getOrderInfoId)
+                .orderByAsc(BaseIdPo::getId));
+        Map<Long, BigDecimal> map = inventoryFinishedOrderMap.values().stream()
+                .flatMap(Collection::stream)
+                .collect(Collectors.toMap(
+                        InventoryFinishedOrder::getSkuSpecId,
+                        InventoryFinishedOrder::getExistingQuantity,
+                        BigDecimal::add)
+                );
+
+        // 判断是否能出库
+        for (Map.Entry<Long, BigDecimal> entry : orderSkuQuantityMap.entrySet()) {
+            BigDecimal inventoryQuantity = map.getOrDefault(entry.getKey(), BigDecimal.ZERO);
+            if (entry.getValue().compareTo(inventoryQuantity) > 0) {
+                return;
+            }
+        }
+
+        // 出库
+        List<InventoryFinishedOrder> updateInventoryFinishedOrderList = new ArrayList<>();
+        List<InventoryFinishedOrderDetail> finishedOrderDetailList = new ArrayList<>();
+        String code = CodeEnum.FINISHED_OUT.getCode();
+        String prefix = code.substring(0, code.length() - 6);
+        Map<String, Integer> numMap = new HashMap<>(1);
+        numMap.put("num", Convert.toInt(code.replace(prefix, "")));
+
+        for (OrderSku orderSku : orderSkuList) {
+            List<InventoryFinishedOrder> inventoryFinishedOrderList = inventoryFinishedOrderMap
+                    .getOrDefault(orderSku.getSkuSpecId(), Collections.emptyList())
+                    .stream()
+                    .filter(item -> item.getExistingQuantity().compareTo(BigDecimal.ZERO) > 0)
+                    .collect(Collectors.toList());
+            BigDecimal orderSkuQuantity = orderSku.getQuantity();
+            for (InventoryFinishedOrder inventoryFinishedOrder : inventoryFinishedOrderList) {
+                InventoryFinishedOrderDetail detail = new InventoryFinishedOrderDetail();
+                detail.setCode(prefix + numMap.get("num"));
+                detail.setInventoryFinishedOrderId(inventoryFinishedOrder.getId());
+                detail.setDepartmentId(inventoryFinishedOrder.getDepartmentId());
+                detail.setOrderInfoId(orderSku.getOrderId());
+                detail.setOrderSkuId(orderSku.getId());
+                detail.setSkuSpecId(orderSku.getSkuSpecId());
+                detail.setOperationType(FinishedOperationTypeEnum.SALE_OUT_OF_WAREHOUSE.getType());
+                BigDecimal existingQuantity = inventoryFinishedOrder.getExistingQuantity();
+                if (orderSkuQuantity.compareTo(existingQuantity) >= 0) {
+                    inventoryFinishedOrder.setExistingQuantity(BigDecimal.ZERO);
+                    inventoryFinishedOrder.setStatus(0);
+                    orderSkuQuantity = orderSkuQuantity.subtract(existingQuantity);
+                    detail.setQuantity(existingQuantity);
+                } else {
+                    inventoryFinishedOrder.setExistingQuantity(existingQuantity.subtract(orderSkuQuantity));
+                    orderSkuQuantity = BigDecimal.ZERO;
+                    detail.setQuantity(orderSkuQuantity);
+                }
+                // 保存需要操作的数据
+                updateInventoryFinishedOrderList.add(inventoryFinishedOrder);
+                finishedOrderDetailList.add(detail);
+                numMap.put("num", numMap.get("num") + 1);
+                // 订单sku数量出库完成退出循环
+                if (ObjectUtil.equals(orderSkuQuantity, BigDecimal.ZERO)) {
+                    break;
+                }
+            }
+        }
+
+        // 保存出库记录
+        this.updateBatchById(updateInventoryFinishedOrderList);
+        inventoryFinishedOrderDetailService.saveBatch(finishedOrderDetailList);
+    }
+
 }