|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
}
|