|
@@ -1,31 +1,48 @@
|
|
|
package com.sd.business.service.inventory.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.NumberUtil;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.ruoyi.common.constant.StatusConstant;
|
|
|
+import com.ruoyi.common.core.domain.BaseIdPo;
|
|
|
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.InventoryFinishedOrderDto;
|
|
|
import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
|
|
|
import com.sd.business.entity.inventory.enums.FinishedOperationTypeEnum;
|
|
|
import com.sd.business.entity.inventory.po.InventoryFinishedOrder;
|
|
|
import com.sd.business.entity.inventory.po.InventoryFinishedOrderDetail;
|
|
|
import com.sd.business.entity.inventory.vo.InventoryFinishedOrderVo;
|
|
|
+import com.sd.business.entity.order.enums.OrderStatusEnum;
|
|
|
import com.sd.business.entity.order.po.OrderInfo;
|
|
|
import com.sd.business.entity.order.po.OrderSku;
|
|
|
+import com.sd.business.entity.outbound.po.OutboundOrder;
|
|
|
import com.sd.business.entity.sku.po.SkuSpec;
|
|
|
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.OrderInfoService;
|
|
|
+import com.sd.business.service.order.OrderSkuService;
|
|
|
+import com.sd.business.service.outbound.OutboundOrderService;
|
|
|
+import com.sd.business.service.sku.SkuSpecService;
|
|
|
import com.sd.framework.util.Assert;
|
|
|
+import com.sd.framework.util.TemplateExcelUtil;
|
|
|
import com.sd.framework.util.sql.Sql;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static java.util.Comparator.comparing;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -41,6 +58,21 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
|
|
|
@Autowired
|
|
|
private InventoryFinishedOrderDetailService inventoryFinishedOrderDetailService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private OrderInfoService orderInfoService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderSkuService orderSkuService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SkuSpecService skuSpecService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OutboundOrderService outboundOrderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private HttpServletResponse response;
|
|
|
+
|
|
|
@Override
|
|
|
public Page<InventoryFinishedOrderVo> getPage(InventoryFinishedOrderSelectDto dto) {
|
|
|
|
|
@@ -128,4 +160,138 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
|
|
|
inventoryFinishedOrderDetailService.remove(q -> q.eq(InventoryFinishedOrderDetail::getOrderInfoId, orderId));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void excelErpExport(List<InventoryFinishedErpImportDataDto> list) {
|
|
|
+ List<String> outboundOrderCodes = list.stream().map(InventoryFinishedErpImportDataDto::getOutboundOrderCode).collect(Collectors.toList());
|
|
|
+ Map<String, OutboundOrder> outboundOrderMap = outboundOrderService.mapKEntity(
|
|
|
+ OutboundOrder::getCode,
|
|
|
+ q -> q.in(OutboundOrder::getCode, outboundOrderCodes));
|
|
|
+
|
|
|
+ List<String> wlnCodes = outboundOrderMap.values().stream().map(OutboundOrder::getOrderWlnCode).collect(Collectors.toList());
|
|
|
+ if (wlnCodes.isEmpty()) {
|
|
|
+ wlnCodes.add("-1");
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, OrderInfo> orderInfoMap = orderInfoService.mapKEntity(
|
|
|
+ OrderInfo::getWlnCode,
|
|
|
+ q -> q.in(OrderInfo::getWlnCode, wlnCodes)
|
|
|
+ .eq(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey()));
|
|
|
+
|
|
|
+ List<Long> orderIds = orderInfoMap.values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
|
|
|
+ if (orderIds.isEmpty()) {
|
|
|
+ orderIds.add(-1L);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<Long, List<InventoryFinishedOrderDetail>> inventoryFinishedOrderMap = inventoryFinishedOrderDetailService.mapKGroup(
|
|
|
+ InventoryFinishedOrderDetail::getOrderInfoId,
|
|
|
+ q -> q.eq(InventoryFinishedOrderDetail::getOperationType, 1)
|
|
|
+ .in(InventoryFinishedOrderDetail::getOrderInfoId, orderIds));
|
|
|
+ Map<Long, OrderSku> orderSkuMap = orderSkuService.mapKEntity(BaseIdPo::getId, q -> q.in(OrderSku::getOrderId, orderIds));
|
|
|
+
|
|
|
+ List<InOutStorageErpExportVo> inOutStorageErpExportVoList = new ArrayList<>();
|
|
|
+ Map<Long, String> codeMap = new HashMap<>();
|
|
|
+ // 生成入库单
|
|
|
+ for (OutboundOrder outboundOrder : outboundOrderMap.values()) {
|
|
|
+ Date outboundTime = outboundOrder.getOutboundTime();
|
|
|
+ int num;
|
|
|
+ if (Objects.equals("T007", outboundOrder.getStorageCode())) {
|
|
|
+ num = 33;
|
|
|
+ } else {
|
|
|
+ num = 66;
|
|
|
+ }
|
|
|
+ Long format = Long.parseLong(DateUtil.format(outboundTime, num + "MMddHH"));
|
|
|
+ if (codeMap.get(format) != null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ InOutStorageErpExportVo inOutStorageErpExportVo = new InOutStorageErpExportVo();
|
|
|
+ inOutStorageErpExportVo.setId(format);
|
|
|
+ inOutStorageErpExportVo.setPlantCode("SDTY");
|
|
|
+ inOutStorageErpExportVo.setDocCode("T119");
|
|
|
+
|
|
|
+ // 生成单号,后四位生成规则,取系统单号 dd01
|
|
|
+ // 生成e10入库单号后四位,当前天数+num 防止与bom入库导出单号重复
|
|
|
+ int day = DateUtil.dayOfMonth(outboundTime);
|
|
|
+ int hour = DateUtil.hour(outboundTime, true);
|
|
|
+ int codeNum = Integer.parseInt((day + num) + String.format("%02d", hour));
|
|
|
+ String code = inOutStorageErpExportVo.getDocCode() + DateUtil.format(outboundTime, "-yyyyMM") + String.format("%04d", codeNum);
|
|
|
+ inOutStorageErpExportVo.setCode(code);
|
|
|
+ inOutStorageErpExportVo.setCreateTime(DateUtil.format(outboundTime, "yyyy/MM/dd HH:mm:ss"));
|
|
|
+ inOutStorageErpExportVo.setDeptCode("STWH");
|
|
|
+ inOutStorageErpExportVo.setEmployeeCode("SKWH002");
|
|
|
+
|
|
|
+ codeMap.put(inOutStorageErpExportVo.getId(), code);
|
|
|
+ inOutStorageErpExportVoList.add(inOutStorageErpExportVo);
|
|
|
+ }
|
|
|
+ inOutStorageErpExportVoList.sort(comparing(InOutStorageErpExportVo::getCode));
|
|
|
+
|
|
|
+ Map<String, Integer> serialNumberMap = new HashMap<>();
|
|
|
+ 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<InOutStorageBomErpExportVo> inOutStorageBomErpExportVoList = list.stream()
|
|
|
+ .map(item -> {
|
|
|
+ if (!NumberUtil.isNumber(item.getQuantity())) {
|
|
|
+ item.setQuantity("0");
|
|
|
+ }
|
|
|
+ InOutStorageBomErpExportVo inOutStorageBomErpExportVo = new InOutStorageBomErpExportVo();
|
|
|
+ inOutStorageBomErpExportVo.setBomSpecCode(item.getSkuSpecFinishedCode());
|
|
|
+ inOutStorageBomErpExportVo.setFeatureCode(item.getFeatureCode());
|
|
|
+ inOutStorageBomErpExportVo.setQuantity(item.getQuantity());
|
|
|
+ inOutStorageBomErpExportVo.setWarehouseCode("501");
|
|
|
+ inOutStorageBomErpExportVo.setUnit("PCS");
|
|
|
+ inOutStorageBomErpExportVo.setPieces("0");
|
|
|
+ inOutStorageBomErpExportVo.setSourceRtk("OTHER");
|
|
|
+
|
|
|
+ OutboundOrder outboundOrder = outboundOrderMap.get(item.getOutboundOrderCode());
|
|
|
+ SkuSpec skuSpec = skuSpecMap.get(item.getSkuSpecCode());
|
|
|
+ if (outboundOrder == null || skuSpec == null) {
|
|
|
+ return inOutStorageBomErpExportVo;
|
|
|
+ }
|
|
|
+ int num;
|
|
|
+ if (Objects.equals("T007", outboundOrder.getStorageCode())) {
|
|
|
+ num = 33;
|
|
|
+ } else {
|
|
|
+ num = 66;
|
|
|
+ }
|
|
|
+ inOutStorageBomErpExportVo.setCode(codeMap.get(Long.parseLong(DateUtil.format(outboundOrder.getOutboundTime(), num + "MMddHH"))));
|
|
|
+ OrderInfo orderInfo = orderInfoMap.get(outboundOrder.getOrderWlnCode());
|
|
|
+ if (orderInfo == null) {
|
|
|
+ return inOutStorageBomErpExportVo;
|
|
|
+ }
|
|
|
+ List<InventoryFinishedOrderDetail> orderDetailList = inventoryFinishedOrderMap.getOrDefault(orderInfo.getId(), Collections.emptyList());
|
|
|
+ InventoryFinishedOrderDetail detail = orderDetailList.stream()
|
|
|
+ .filter(i -> Objects.equals(i.getSkuSpecId(), skuSpec.getId()))
|
|
|
+ .findAny().orElse(null);
|
|
|
+ if (detail == null) {
|
|
|
+ return inOutStorageBomErpExportVo;
|
|
|
+ }
|
|
|
+ BigDecimal unitCost = BigDecimal.ZERO;
|
|
|
+ OrderSku orderSku = orderSkuMap.get(detail.getOrderSkuId());
|
|
|
+ if (orderSku != null) {
|
|
|
+ unitCost = orderSku.getUnitPrice()
|
|
|
+ .add(orderSku.getDeliveryMaterialsFee())
|
|
|
+ .add(orderSku.getPackagingMaterialCost());
|
|
|
+ }
|
|
|
+ inOutStorageBomErpExportVo.setUnitCost(unitCost.toPlainString());
|
|
|
+ inOutStorageBomErpExportVo.setCostAmt(unitCost.multiply(new BigDecimal(item.getQuantity())).toPlainString());
|
|
|
+ return inOutStorageBomErpExportVo;
|
|
|
+ })
|
|
|
+ .sorted(comparing(InOutStorageBomErpExportVo::getCode, Comparator.nullsFirst(String::compareTo)))
|
|
|
+ .peek(item -> {
|
|
|
+ Integer serialNumber = serialNumberMap.get(item.getCode());
|
|
|
+ if (serialNumber == null) {
|
|
|
+ serialNumber = 1;
|
|
|
+ serialNumberMap.put(item.getCode(), serialNumber);
|
|
|
+ } else {
|
|
|
+ serialNumberMap.put(item.getCode(), serialNumber+=1);
|
|
|
+ }
|
|
|
+ item.setSerialNumber(serialNumber.toString());
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ String fileName = "成品入库单";
|
|
|
+ TemplateExcelUtil.writeBrowserMultiSheet("inOutStorageDetails.xlsx", 2, fileName, response, inOutStorageErpExportVoList, inOutStorageBomErpExportVoList);
|
|
|
+ }
|
|
|
+
|
|
|
}
|