|
@@ -2,25 +2,41 @@ package com.sd.business.service.production.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
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.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.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.sku.po.SkuSpecLink;
|
|
|
import com.sd.business.mapper.production.ProductionOrderMapper;
|
|
|
+import com.sd.business.service.bom.BomSpecService;
|
|
|
+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.ProductionOrderService;
|
|
|
import com.sd.business.service.production.ProductionTaskService;
|
|
|
import com.sd.business.service.sku.SkuService;
|
|
|
+import com.sd.business.service.sku.SkuSpecLinkService;
|
|
|
import com.sd.business.service.sku.SkuSpecService;
|
|
|
+import com.sd.framework.util.Assert;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.List;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
@@ -41,6 +57,18 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
|
|
|
@Autowired
|
|
|
private OrderService orderService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private OrderSkuService orderSkuService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SkuSpecLinkService skuSpecLinkService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private BomSpecService bomSpecService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderPackageBomService orderPackageBomService;
|
|
|
+
|
|
|
@Override
|
|
|
public Page<ProductionOrderVo> getPage(ProductionOrderDto dto) {
|
|
|
|
|
@@ -91,4 +119,118 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
|
|
|
orderService.update(q -> q.in(BaseIdPo::getId, dto.getOrderIdList()).set(OrderInfo::getTag, dto.getTag()));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public ProductionOrderDetailVo detail(BaseSelectDto dto) {
|
|
|
+ Long id = dto.getId();
|
|
|
+ Assert.notNull(id, "订单id不能为空");
|
|
|
+
|
|
|
+ List<ProductionOrderDetailVo.SkuSpec> skuSpecList = getSkuSpecList(id);
|
|
|
+ List<ProductionOrderDetailVo.OrderPackage> packageList = getPackageList(skuSpecList);
|
|
|
+
|
|
|
+ ProductionOrderDetailVo vo = new ProductionOrderDetailVo();
|
|
|
+ vo.setSkuSpecList(skuSpecList);
|
|
|
+ vo.setPackageList(packageList);
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized void rapidPackaging(RapidPackagingDto dto) {
|
|
|
+ Long orderId = dto.getOrderId();
|
|
|
+ OrderInfo orderInfo = orderService.getById(orderId);
|
|
|
+ if (!orderInfo.getStatus().equals(OrderStatusEnum.IN_PRODUCTION.getKey())) {
|
|
|
+ throw new ServiceException("订单已被处理");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderPackageBom> orderPackageBomList = dto.getPackageList();
|
|
|
+ orderPackageBomList.forEach(item -> item.setOrderId(orderId));
|
|
|
+ orderPackageBomService.saveBatch(orderPackageBomList);
|
|
|
+
|
|
|
+ orderService.update(q -> q
|
|
|
+ .eq(BaseIdPo::getId, orderId)
|
|
|
+ .set(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey())
|
|
|
+ .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
|
|
|
+ .set(BasePo::getUpdateTime, new Date())
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<ProductionOrderDetailVo.SkuSpec> getSkuSpecList(Long orderId) {
|
|
|
+
|
|
|
+ // 获取订单sku规格
|
|
|
+ List<OrderSku> orderSkuList = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, orderId));
|
|
|
+
|
|
|
+ // 相同订单sku规格合并,数量相加
|
|
|
+ List<ProductionOrderDetailVo.SkuSpec> skuSpecList = new ArrayList<>(
|
|
|
+ orderSkuList.stream()
|
|
|
+ .map(item -> {
|
|
|
+ ProductionOrderDetailVo.SkuSpec skuSpec = new ProductionOrderDetailVo.SkuSpec();
|
|
|
+ skuSpec.setSkuSpecId(item.getSkuSpecId());
|
|
|
+ skuSpec.setQuantity(item.getQuantity());
|
|
|
+ return skuSpec;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ ProductionOrderDetailVo.SkuSpec::getSkuSpecId,
|
|
|
+ Function.identity(),
|
|
|
+ (v1, v2) -> {
|
|
|
+ v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
|
|
|
+ return v1;
|
|
|
+ })
|
|
|
+ ).values());
|
|
|
+
|
|
|
+ // 赋值订单sku规格品号以及品名
|
|
|
+ skuSpecService.attributeAssign(skuSpecList, ProductionOrderDetailVo.SkuSpec::getSkuSpecId, (item, skuSpec) -> {
|
|
|
+ item.setSkuSpecName(skuSpec.getName());
|
|
|
+ item.setSkuSpecCode(skuSpec.getCode());
|
|
|
+ });
|
|
|
+
|
|
|
+ return skuSpecList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<ProductionOrderDetailVo.OrderPackage> getPackageList(List<ProductionOrderDetailVo.SkuSpec> skuSpecList) {
|
|
|
+ // 订单sku规格id 数量map
|
|
|
+ Map<Long, BigDecimal> map = skuSpecList.stream().collect(Collectors.toMap(
|
|
|
+ ProductionOrderDetailVo.SkuSpec::getSkuSpecId,
|
|
|
+ ProductionOrderDetailVo.SkuSpec::getQuantity
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 获取订单sku规格包装列表
|
|
|
+ List<SkuSpecLink> list = skuSpecLinkService.list(q -> q
|
|
|
+ .eq(SkuSpecLink::getType, 2)
|
|
|
+ .eq(SkuSpecLink::getDepartmentId, SecurityUtils.getDeptId())
|
|
|
+ .in(SkuSpecLink::getSkuSpecId, map.keySet())
|
|
|
+ );
|
|
|
+
|
|
|
+ if (list.size() == 0) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 同一包装合并数量
|
|
|
+ List<ProductionOrderDetailVo.OrderPackage> orderPackageList = new ArrayList<>(list.stream()
|
|
|
+ .map(item -> {
|
|
|
+ ProductionOrderDetailVo.OrderPackage orderPackage = new ProductionOrderDetailVo.OrderPackage();
|
|
|
+ BigDecimal quantity = map.get(item.getSkuSpecId());
|
|
|
+ orderPackage.setBomSpecId(item.getBomSpecId());
|
|
|
+ orderPackage.setQuantity(item.getQuantity().multiply(quantity));
|
|
|
+ return orderPackage;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ ProductionOrderDetailVo.OrderPackage::getBomSpecId,
|
|
|
+ Function.identity(),
|
|
|
+ (v1, v2) -> {
|
|
|
+ v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
|
|
|
+ return v1;
|
|
|
+ }
|
|
|
+ )).values());
|
|
|
+
|
|
|
+ // 赋值品名 品号 销售单价 成本价
|
|
|
+ bomSpecService.attributeAssign(orderPackageList, ProductionOrderDetailVo.OrderPackage::getBomSpecId, (item, bomSpec) -> {
|
|
|
+ item.setBomSpecCode(bomSpec.getCode());
|
|
|
+ item.setBomSpecName(bomSpec.getName());
|
|
|
+ item.setCostPrice(bomSpec.getCostPrice());
|
|
|
+ item.setInternalSellingPrice(bomSpec.getInternalSellingPrice());
|
|
|
+ });
|
|
|
+
|
|
|
+ return orderPackageList;
|
|
|
+ }
|
|
|
+
|
|
|
}
|