|
@@ -1,29 +1,40 @@
|
|
|
package com.sd.business.service.production.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.ruoyi.common.constant.StatusConstant;
|
|
|
import com.ruoyi.common.core.domain.BaseIdPo;
|
|
|
import com.ruoyi.common.core.domain.BasePo;
|
|
|
import com.ruoyi.common.core.domain.BaseSelectDto;
|
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
|
import com.ruoyi.common.utils.SecurityUtils;
|
|
|
import com.ruoyi.common.utils.wrapper.IWrapper;
|
|
|
+import com.sd.business.entity.department.constant.DepartmentConstant;
|
|
|
+import com.sd.business.entity.in.dto.InOutStorageDto;
|
|
|
+import com.sd.business.entity.in.emums.InDetailTypeEnum;
|
|
|
+import com.sd.business.entity.in.emums.InOutTypeEnum;
|
|
|
+import com.sd.business.entity.in.emums.OutDetailTypeEnum;
|
|
|
+import com.sd.business.entity.in.po.InOutStorageBom;
|
|
|
import com.sd.business.entity.order.enums.OrderStatusEnum;
|
|
|
import com.sd.business.entity.order.po.OrderInfo;
|
|
|
import com.sd.business.entity.order.po.OrderPackageBom;
|
|
|
import com.sd.business.entity.order.po.OrderSku;
|
|
|
-import com.sd.business.entity.production.dto.ProductionOrderDto;
|
|
|
-import com.sd.business.entity.production.dto.RapidPackagingDto;
|
|
|
-import com.sd.business.entity.production.dto.SetTagDto;
|
|
|
+import com.sd.business.entity.production.dto.*;
|
|
|
+import com.sd.business.entity.production.po.ProductionCost;
|
|
|
import com.sd.business.entity.production.po.ProductionTask;
|
|
|
import com.sd.business.entity.production.vo.ProductionOrderDetailVo;
|
|
|
import com.sd.business.entity.production.vo.ProductionOrderScheduleVo;
|
|
|
import com.sd.business.entity.production.vo.ProductionOrderVo;
|
|
|
import com.sd.business.entity.statement.dto.StatementOfAccountDto;
|
|
|
+import com.sd.business.entity.warehouse.constant.WarehouseConstant;
|
|
|
import com.sd.business.mapper.production.ProductionOrderMapper;
|
|
|
import com.sd.business.service.bom.BomSpecService;
|
|
|
+import com.sd.business.service.in.InOutStorageService;
|
|
|
+import com.sd.business.service.inventory.InventoryService;
|
|
|
import com.sd.business.service.order.OrderPackageBomService;
|
|
|
import com.sd.business.service.order.OrderService;
|
|
|
import com.sd.business.service.order.OrderSkuService;
|
|
|
+import com.sd.business.service.production.ProductionCostService;
|
|
|
import com.sd.business.service.production.ProductionOrderService;
|
|
|
import com.sd.business.service.production.ProductionTaskService;
|
|
|
import com.sd.business.service.sku.SkuService;
|
|
@@ -32,7 +43,9 @@ import com.sd.business.service.statement.StatementOfAccountService;
|
|
|
import com.sd.framework.util.Assert;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -67,6 +80,15 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
|
|
|
@Autowired
|
|
|
private StatementOfAccountService statementOfAccountService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private InventoryService inventoryService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InOutStorageService inOutStorageService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProductionCostService productionCostService;
|
|
|
+
|
|
|
@Override
|
|
|
public Page<ProductionOrderVo> getPage(ProductionOrderDto dto) {
|
|
|
|
|
@@ -169,6 +191,74 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
|
|
|
statementOfAccountService.add(statement);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void exceedReceive(ProductionExceedReceiveDto dto) {
|
|
|
+ Long orderId = dto.getOrderId();
|
|
|
+ OrderInfo orderInfo = orderService.getById(orderId);
|
|
|
+ if (orderInfo == null) {
|
|
|
+ throw new ServiceException("未知订单");
|
|
|
+ }
|
|
|
+ if (!Objects.equals(orderInfo.getStatus(), OrderStatusEnum.IN_PRODUCTION.getKey())) {
|
|
|
+ throw new ServiceException("操作失败,请选择生产中的订单");
|
|
|
+ }
|
|
|
+ List<ProductionCostDto> productionCostList = dto.getProductionCostList();
|
|
|
+ Map<Long, BigDecimal> map = productionCostList.stream()
|
|
|
+ .filter(item -> item.getQuantity() != null
|
|
|
+ && item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ ProductionCostDto::getBomSpecId,
|
|
|
+ ProductionCostDto::getQuantity,
|
|
|
+ BigDecimal::add
|
|
|
+ ));
|
|
|
+ boolean result = inventoryService.lockStorage(map, WarehouseConstant.SEMI_FINISHED_PRODUCT);
|
|
|
+ if (!result) {
|
|
|
+ throw new ServiceException("库存不足,超领失败!");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<InOutStorageBom> inOutStorageBomList = map.keySet().stream().map(item -> {
|
|
|
+ InOutStorageBom inOutStorageBom = new InOutStorageBom();
|
|
|
+ inOutStorageBom.setBomSpecId(item);
|
|
|
+ inOutStorageBom.setQuantity(map.get(item));
|
|
|
+ return inOutStorageBom;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ InOutStorageDto lockPurchaseDefective = new InOutStorageDto();
|
|
|
+ lockPurchaseDefective.setType(InOutTypeEnum.OUT.getKey());
|
|
|
+ lockPurchaseDefective.setDetailType(OutDetailTypeEnum.PRODUCTION.getKey());
|
|
|
+ lockPurchaseDefective.setWarehouseId(WarehouseConstant.SEMI_FINISHED_PRODUCT);
|
|
|
+ lockPurchaseDefective.setDepartmentId(DepartmentConstant.SD_SPORTS);
|
|
|
+ lockPurchaseDefective.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
|
|
|
+ lockPurchaseDefective.setRemark("订单超领出库");
|
|
|
+ lockPurchaseDefective.setLockStorage(StatusConstant.YES);
|
|
|
+ lockPurchaseDefective.setInOutStorageBomList(JSON.parseArray(JSON.toJSONString(inOutStorageBomList), InOutStorageBom.class));
|
|
|
+ inOutStorageService.add(lockPurchaseDefective);
|
|
|
+
|
|
|
+ InOutStorageDto inStorageDto = new InOutStorageDto();
|
|
|
+ inStorageDto.setType(InOutTypeEnum.IN.getKey());
|
|
|
+ inStorageDto.setDetailType(InDetailTypeEnum.ABANDON.getKey());
|
|
|
+
|
|
|
+ if (Objects.equals(dto.getExceedReceiveReason(), 1)) {
|
|
|
+ inStorageDto.setWarehouseId(WarehouseConstant.PRODUCTION_DEFECTIVE);
|
|
|
+ } else {
|
|
|
+ inStorageDto.setWarehouseId(WarehouseConstant.PURCHASE_DEFECTIVE);
|
|
|
+ }
|
|
|
+ inStorageDto.setDepartmentId(DepartmentConstant.SD_SPORTS);
|
|
|
+ inStorageDto.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
|
|
|
+ inStorageDto.setRemark("订单超领报废入库");
|
|
|
+ inStorageDto.setInOutStorageBomList(inOutStorageBomList);
|
|
|
+ inOutStorageService.add(inStorageDto);
|
|
|
+
|
|
|
+ if (Objects.equals(dto.getExceedReceiveReason(), 1)) {
|
|
|
+ List<ProductionCost> tempProductionCostList = productionCostList.stream()
|
|
|
+ .filter(item -> item.getQuantity() != null
|
|
|
+ && item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
|
|
|
+ .map(item -> (ProductionCost) item)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ productionCostService.saveBatch(tempProductionCostList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private List<ProductionOrderDetailVo.SkuSpec> getSkuSpecList(Long orderId) {
|
|
|
|
|
|
|