Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

fgd 1 rok pred
rodič
commit
f753e3a923

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuBomVo.java

@@ -24,4 +24,9 @@ public class OrderSkuBomVo extends OrderSkuBom {
      */
     private String bomSpecName;
 
+    /**
+     * bom分类id
+     */
+    private Long bomClassifyId;
+
 }

+ 23 - 4
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryFinishedServiceImpl.java

@@ -15,6 +15,7 @@ import com.sd.business.mapper.inventory.InventoryFinishedMapper;
 import com.sd.business.service.inventory.InventoryFinishedOrderService;
 import com.sd.business.service.inventory.InventoryFinishedService;
 import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.sku.SkuSpecService;
 import com.sd.framework.util.excel.util.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -24,6 +25,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -48,6 +50,9 @@ public class InventoryFinishedServiceImpl extends ServiceImpl<InventoryFinishedM
     @Autowired
     private InventoryFinishedOrderService inventoryFinishedOrderService;
 
+    @Autowired
+    private SkuSpecService skuSpecService;
+
     @Override
     public Page<InventoryFinishedVo> getPage(InventoryFinishedSelectDto dto) {
         IWrapper<InventoryFinished> wrapper = getWrapper();
@@ -71,8 +76,15 @@ public class InventoryFinishedServiceImpl extends ServiceImpl<InventoryFinishedM
             return;
         }
 
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+        List<OrderSku> list = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
+                .collect(Collectors.toList());
+
         // 添加成品仓库存
-        List<InventoryFinished> inventoryFinishedList = orderSkuList.stream().map(item -> {
+        List<InventoryFinished> inventoryFinishedList = list.stream().map(item -> {
             InventoryFinished inventoryFinished = new InventoryFinished();
             inventoryFinished.setSkuSpecId(item.getSkuSpecId());
             inventoryFinished.setQuantity(item.getQuantity());
@@ -80,7 +92,7 @@ public class InventoryFinishedServiceImpl extends ServiceImpl<InventoryFinishedM
         }).collect(Collectors.toList());
         inOut(inventoryFinishedList, true);
 
-        inventoryFinishedOrderService.productionWarehousing(orderSkuList);
+        inventoryFinishedOrderService.productionWarehousing(list);
     }
 
     @Override
@@ -302,8 +314,15 @@ public class InventoryFinishedServiceImpl extends ServiceImpl<InventoryFinishedM
             return;
         }
 
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+        List<OrderSku> list = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
+                .collect(Collectors.toList());
+
         // 成品库存出库
-        List<InventoryFinished> inventoryFinishedList = orderSkuList.stream().map(item -> {
+        List<InventoryFinished> inventoryFinishedList = list.stream().map(item -> {
             InventoryFinished inventoryFinished = new InventoryFinished();
             inventoryFinished.setQuantity(item.getQuantity());
             inventoryFinished.setSkuSpecId(item.getSkuSpecId());
@@ -313,7 +332,7 @@ public class InventoryFinishedServiceImpl extends ServiceImpl<InventoryFinishedM
         inOut(inventoryFinishedList, false);
 
         // 产品库订单出库
-        inventoryFinishedOrderService.noSourceSaleOutOfWarehouse(orderSkuList);
+        inventoryFinishedOrderService.noSourceSaleOutOfWarehouse(list);
     }
 
     /**

+ 10 - 2
sd-business/src/main/java/com/sd/business/service/order/impl/OrderExchangeServiceImpl.java

@@ -28,6 +28,7 @@ import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.*;
 import com.sd.business.entity.order.vo.OrderExchangeDetailVo;
 import com.sd.business.entity.order.vo.OrderExchangeVo;
+import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.statement.dto.StatementOfAccountDto;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.order.OrderExchangeMapper;
@@ -275,9 +276,16 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
         statement.setOrderIdList(Collections.singletonList(orderInfo.getId()));
         statementOfAccountService.add(statement);
 
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+        List<OrderSku> tempOrderSkuList = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
+                .collect(Collectors.toList());
+
         // 售后商品入库
         if (Objects.equals(orderExchangeDto.getWarehouseId(), WarehouseConstant.PRODUCTION_DEFECTIVE)) {
-            List<InOutStorageBom> tempInOutStorageBomList = orderSkuList.stream().map(item -> {
+            List<InOutStorageBom> tempInOutStorageBomList = tempOrderSkuList.stream().map(item -> {
                 InOutStorageBom inStorageBom = new InOutStorageBom();
                 inStorageBom.setBomSpecId(item.getBomSpecId());
                 inStorageBom.setQuantity(item.getQuantity());
@@ -305,7 +313,7 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
             inOutStorageService.add(inOutStorageDto);
         } else {
             // 入成品库
-            inventoryFinishedService.noSourceInWarehousing(orderSkuList);
+            inventoryFinishedService.noSourceInWarehousing(tempOrderSkuList);
         }
     }
 

+ 16 - 3
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -255,10 +255,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         // 赋值包材配件/单品
         List<OrderSkuBom> tempOrderSkuBomList = orderSkuBomService.list(q -> q.eq(OrderSkuBom::getOrderId, id));
         List<OrderSkuBomVo> orderSkuBomList = BeanUtil.copyToList(tempOrderSkuBomList, OrderSkuBomVo.class);
-        bomSpecService.attributeAssign(orderSkuBomList, OrderSkuBom::getBomSpecId, (item, bomSpec) -> {
-            item.setBomSpecCode(bomSpec.getCode());
-            item.setBomSpecName(bomSpec.getName());
+        List<Long> bomSpecIds = orderSkuBomList.stream().map(OrderSkuBom::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+        orderSkuBomList.forEach(item -> {
+            BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+            if (bomSpecBo == null) {
+                return;
+            }
+            item.setBomSpecCode(bomSpecBo.getBomSpecCode());
+            item.setBomSpecName(bomSpecBo.getBomSpecName());
+            item.setBomClassifyId(bomSpecBo.getClassifyId());
         });
+
         Map<Long, List<OrderSkuBomVo>> orderSkuBomMap = orderSkuBomList.stream().collect(Collectors.groupingBy(OrderSkuBom::getOrderSkuId));
         for (OrderSkuVo orderSkuVo : orderSkuList) {
             orderSkuVo.setOrderSkuBomList(orderSkuBomMap.getOrDefault(orderSkuVo.getId(), Collections.emptyList()));
@@ -542,6 +550,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
 
     }
 
+    @DSTransactional
     @Override
     public void confirmation(OrderInfoDto dto) {
         OrderInfo order = getById(dto.getId());
@@ -1480,8 +1489,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
 
         List<Long> bomSpecIdList = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
         Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
 
         orderSkuList = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
                 .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
                 .collect(Collectors.toList());
 

+ 36 - 4
sd-business/src/main/java/com/sd/business/service/production/impl/StockPreparationServiceImpl.java

@@ -326,8 +326,20 @@ public class StockPreparationServiceImpl implements StockPreparationService {
 
         // 生产工单
         Map<Long, List<StockPreparationVo>> map = list.stream().collect(Collectors.groupingBy(StockPreparationVo::getOrderId));
-        Map<Long, List<OrderSku>> orderSkuMap = orderSkuService.list(q -> q.in(OrderSku::getOrderId, map.keySet()))
-                .stream().collect(Collectors.groupingBy(OrderSku::getOrderId));
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, map.keySet()));
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+
+        // 筛选掉不是主材的sku
+        List<Long> bomSpecIds = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+
+        Map<Long, List<OrderSku>> orderSkuMap = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
+                .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
+                .collect(Collectors.groupingBy(OrderSku::getOrderId));
+
         map.forEach((orderId, stockPreparationVoList) -> {
             StockPreparationVo stockPreparationVo = stockPreparationVoList.get(0);
             String orderCode = stockPreparationVo.getOrderCode();
@@ -380,8 +392,15 @@ public class StockPreparationServiceImpl implements StockPreparationService {
         // 生产工单
         List<ProductionWorkOrder> productionWorkOrderList = new ArrayList<>();
         Map<Long, List<StockPreparationVo>> map = list.stream().collect(Collectors.groupingBy(StockPreparationVo::getOrderId));
-        Map<Long, List<OrderSku>> orderSkuMap = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList))
-                .stream().collect(Collectors.groupingBy(OrderSku::getOrderId));
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, map.keySet()));
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+
+        Map<Long, List<OrderSku>> orderSkuMap = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
+                .collect(Collectors.groupingBy(OrderSku::getOrderId));
+
         map.forEach((orderId, stockPreparationVoList) -> {
             StockPreparationVo stockPreparationVo = stockPreparationVoList.get(0);
             String orderCode = stockPreparationVo.getOrderCode();
@@ -463,11 +482,15 @@ public class StockPreparationServiceImpl implements StockPreparationService {
         List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderId, orderIdList));
         List<OrderPackageBom> orderPackageBomList = orderPackageBomService.list(q -> q.in(OrderPackageBom::getOrderId, orderIdList));
         Map<Long, OrderSku> orderSkuMap = orderSkuList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
 
         Map<Long, OutBomVo> map = Stream.of(
                         // 主材
                         orderSkuList.stream()
                                 .filter(item -> outsourceOrderIds.isEmpty() || !outsourceOrderIds.contains(item.getOrderId()))
+                                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
                                 .map(item -> {
                                     OutBomVo outBomVo = new OutBomVo();
                                     outBomVo.setBomSpecId(item.getBomSpecId());
@@ -592,7 +615,12 @@ public class StockPreparationServiceImpl implements StockPreparationService {
         List<Long> orderIdList = stockPreparationVoList.stream().map(StockPreparationVo::getOrderId).distinct().collect(Collectors.toList());
         List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList));
 
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+
         Map<Long, OutSkuVo> map = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
                 .map(item -> {
                     OutSkuVo outSkuVo = new OutSkuVo();
                     outSkuVo.setSkuSpecId(item.getSkuSpecId());
@@ -727,12 +755,16 @@ public class StockPreparationServiceImpl implements StockPreparationService {
         List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderId, orderIdLockStorageMap.keySet()));
         Map<Long, OrderSku> orderSkuMap = orderSkuList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
         List<OrderPackageBom> orderPackageBomList = orderPackageBomService.list(q -> q.in(OrderPackageBom::getOrderId, orderIdLockStorageMap.keySet()));
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
 
         List<InOutStorageBomBo> inOutStorageBomBoList = Stream.of(
 
                 // 主材
                 orderSkuList.stream()
                         .filter(item -> outsourceOrderIds.isEmpty() || !outsourceOrderIds.contains(item.getOrderId()))
+                        .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
                         .map(item -> {
                             InOutStorageBomBo inOutStorageBom = new InOutStorageBomBo();
                             inOutStorageBom.setBomSpecId(item.getBomSpecId());

+ 6 - 0
sd-business/src/main/java/com/sd/business/service/sku/SkuSpecService.java

@@ -113,4 +113,10 @@ public interface SkuSpecService extends BaseService<SkuSpec> {
      * @param id
      */
     void giftDelete(Long id);
+
+    /**
+     * 根据id集合获取其中的所有赠品id
+     * @param skuSpecIdList
+     */
+    List<Long> getGiftIdListByIdList(Collection<Long> skuSpecIdList);
 }

+ 44 - 31
sd-business/src/main/java/com/sd/business/service/sku/impl/SkuSpecServiceImpl.java

@@ -303,37 +303,6 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
     }
 
     @Override
-    public Page<SkuSpecVo> getGiftPage(SkuSpecSelectDto dto) {
-        IWrapper<SkuSpec> wrapper = getWrapper();
-        wrapper.orderByDesc("ss", SkuSpec::getId);
-        wrapper.eq("ss", SkuSpec::getGiftTag, StatusConstant.YES);
-        wrapper.like("ss", SkuSpec::getName, dto.getName());
-        wrapper.like("ss", SkuSpec::getCode, dto.getCode());
-        Page<SkuSpecVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
-        return page;
-    }
-
-    @Override
-    public void giftAdd(Long id) {
-        SkuSpec skuSpec = this.getById(id);
-        if (skuSpec == null) {
-            throw new ServiceException("没有找到sku信息");
-        }
-        skuSpec.setGiftTag(StatusConstant.YES);
-        this.updateById(skuSpec);
-    }
-
-    @Override
-    public void giftDelete(Long id) {
-        SkuSpec skuSpec = this.getById(id);
-        if (skuSpec == null) {
-            throw new ServiceException("没有找到sku信息");
-        }
-        skuSpec.setGiftTag(StatusConstant.NO);
-        this.updateById(skuSpec);
-    }
-
-    @Override
     public List<SkuSpecQuotationVo> getSkuSpecQuotationList(SkuSpecQuotationDto dto) {
         Assert.notNull(dto.getDepartmentId(), "事业部id不能为空");
         Department department = departmentService.getById(dto.getDepartmentId());
@@ -500,6 +469,10 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
         List<OutBomVo> outBomVoList = new ArrayList<>();
         for (SkuSpecPriceDto skuSpecPriceDto : list) {
             SkuSpec skuSpec = skuSpecMap.get(skuSpecPriceDto.getSkuSpecId());
+            // 赠品sku不退料
+            if (Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES)) {
+                continue;
+            }
             BomSpecBo bomSpecBo = bomSpecBoMap.get(skuSpec.getBomSpecId());
             if (bomSpecBo == null) {
                 throw new ServiceException("sku未绑定bom");
@@ -578,4 +551,44 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public Page<SkuSpecVo> getGiftPage(SkuSpecSelectDto dto) {
+        IWrapper<SkuSpec> wrapper = getWrapper();
+        wrapper.orderByDesc("ss", SkuSpec::getId);
+        wrapper.eq("ss", SkuSpec::getGiftTag, StatusConstant.YES);
+        wrapper.like("ss", SkuSpec::getName, dto.getName());
+        wrapper.like("ss", SkuSpec::getCode, dto.getCode());
+        Page<SkuSpecVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public void giftAdd(Long id) {
+        SkuSpec skuSpec = this.getById(id);
+        if (skuSpec == null) {
+            throw new ServiceException("没有找到sku信息");
+        }
+        skuSpec.setGiftTag(StatusConstant.YES);
+        this.updateById(skuSpec);
+    }
+
+    @Override
+    public void giftDelete(Long id) {
+        SkuSpec skuSpec = this.getById(id);
+        if (skuSpec == null) {
+            throw new ServiceException("没有找到sku信息");
+        }
+        skuSpec.setGiftTag(StatusConstant.NO);
+        this.updateById(skuSpec);
+    }
+
+    @Override
+    public List<Long> getGiftIdListByIdList(Collection<Long> skuSpecIdList) {
+        List<SkuSpec> skuSpecList = this.list(q -> q
+                .in(BaseIdPo::getId, skuSpecIdList)
+                .eq(SkuSpec::getGiftTag, StatusConstant.YES)
+                .select(BaseIdPo::getId));
+        return skuSpecList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+    }
+
 }

+ 1 - 1
sd-business/src/main/java/com/sd/business/service/statement/impl/DocumentByOrderExcelCellMergeStrategy.java

@@ -22,7 +22,7 @@ public class DocumentByOrderExcelCellMergeStrategy extends AbstractMergeStrategy
     private final List<Integer> skuRowIndex = new ArrayList<>();
 
     // 订单需要合并的列
-    private final List<Integer> orderColIndex = Arrays.asList(0, 1, 2, 18, 19);
+    private final List<Integer> orderColIndex = Arrays.asList(0, 1, 2, 18);
     // 订单无需合并的行
     private final List<Integer> orderRowIndex = new ArrayList<>();
 

+ 37 - 8
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java

@@ -23,6 +23,7 @@ import com.sd.business.entity.order.enums.OrderClassifyEnum;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.order.po.OrderSkuBom;
+import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.statement.dto.FileUploadDto;
 import com.sd.business.entity.statement.dto.StatementOfAccountDto;
 import com.sd.business.entity.statement.dto.StatementOfAccountSelectDto;
@@ -49,6 +50,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -279,18 +281,32 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                                 .add(item.getManagementFee())
                         )
                         .build())
-                .peek(item -> item.setSubtotal(ObjectUtil.equals(item.getQuantity(), BigDecimal.ZERO) ? item.getUnitPrice() : item.getQuantity().multiply(item.getUnitPrice())))
+                .peek(item -> item.setSubtotal(item.getQuantity().multiply(item.getUnitPrice()).setScale(2, RoundingMode.HALF_UP)))
                 .peek(item -> item.setTotal(item.getSubtotal()))
+                .peek(item -> item.setUnitPrice(item.getUnitPrice().setScale(2, RoundingMode.HALF_UP)))
+                .collect(Collectors.toList());
+
+        // 查询赠品sku
+        List<Long> skuSpecIds = documentBySkuVoList.stream().map(DocumentBySkuVo::getSkuSpecId).collect(Collectors.toList());
+        Map<Long, SkuSpec> skuSpecMap = skuSpecService.byIdsToMap(skuSpecIds);
+        List<Long> giftSkuSpecIds = skuSpecMap.values().stream()
+                .filter(item -> Objects.equals(item.getGiftTag(), StatusConstant.YES))
+                .map(BaseIdPo::getId)
                 .collect(Collectors.toList());
 
         // 赋值sku规格品名和品号
-        skuSpecService.attributeAssign(documentBySkuVoList, DocumentBySkuVo::getSkuSpecId, (item, skuSpec) -> {
-            item.setSkuSpecCode(skuSpec.getCode());
-            item.setSkuSpecName(skuSpec.getName());
-        });
+        for (DocumentBySkuVo documentBySkuVo : documentBySkuVoList) {
+            SkuSpec skuSpec = skuSpecMap.get(documentBySkuVo.getSkuSpecId());
+            if (skuSpec == null) {
+                continue;
+            }
+            documentBySkuVo.setSkuSpecCode(skuSpec.getCode());
+            documentBySkuVo.setSkuSpecName(skuSpec.getName());
+        }
 
         // 合并单价、小计、sku规格id系统的对账数据
         Collection<DocumentBySkuVo> documentBySkuVoCollection = documentBySkuVoList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
                 .sorted(comparing(DocumentBySkuVo::getSkuSpecCode))
                 .collect(Collectors.toMap(
                         item -> item.getUnitPrice() + ":" + item.getSkuSpecId(),
@@ -318,8 +334,13 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
         // 获取订单sku
         List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList));
 
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+
         // 主材bom
         List<DocumentByBomVo> result = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
                 .map(item -> DocumentByBomVo.builder()
                         .bomSpecId(item.getBomSpecId())
                         .orderId(item.getOrderId())
@@ -343,6 +364,7 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                                 .add(item.getDeliveryMaterialsFeeSummary())
                                 .add(item.getPackingLaborSummary())
                                 .add(item.getManagementFeeSummary())
+                                .setScale(2, RoundingMode.HALF_UP)
                 ))
                 .peek(item -> item.setTotal(item.getSubtotal()))
                 .collect(Collectors.toList());
@@ -453,19 +475,25 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
 
         List<Long> orderIdList = orderList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
         List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList));
+        // 筛选掉赠品sku
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        List<Long> giftSkuSpecIds = skuSpecService.getGiftIdListByIdList(skuSpecIds);
+        List<OrderSku> tempOrderSkuList = orderSkuList.stream()
+                .filter(item -> giftSkuSpecIds.isEmpty() || !giftSkuSpecIds.contains(item.getSkuSpecId()))
+                .collect(Collectors.toList());
 
         SecurityContext context = SecurityContextHolder.getContext();
 
         CompletableFuture<List<DocumentByOrderVo.SkuSpec>> skuSpecListCompletableFuture = CompletableFuture.supplyAsync(
                 () -> {
                     SecurityContextHolder.setContext(context);
-                    return getSkuSpecList(orderSkuList);
+                    return getSkuSpecList(tempOrderSkuList);
                 }, threadPoolExecutor);
 
         CompletableFuture<List<DocumentByOrderVo.BomSpec>> bomSpecListCompletableFuture = CompletableFuture.supplyAsync(
                 () -> {
                     SecurityContextHolder.setContext(context);
-                    return getBomSpecList(orderIdList, orderSkuList);
+                    return getBomSpecList(orderIdList, tempOrderSkuList);
                 }, threadPoolExecutor);
 
         // 获取订单bom
@@ -576,7 +604,8 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                             .add(item.getManagementFee()));
                     return skuSpec;
                 })
-                .peek(item -> item.setSubtotal(item.getQuantity().multiply(item.getUnitPrice())))
+                .peek(item -> item.setSubtotal(item.getQuantity().multiply(item.getUnitPrice()).setScale(2, RoundingMode.HALF_UP)))
+                .peek(item -> item.setUnitPrice(item.getUnitPrice().setScale(2, RoundingMode.HALF_UP)))
                 .collect(Collectors.toList());
 
         skuSpecService.attributeAssign(skuSpecList, DocumentByOrderVo.SkuSpec::getSkuSpecId, (item, skuSpec) -> {

BIN
sd-starter/src/main/resources/template/orderDocument.xlsx


+ 39 - 6
sd-wln/src/main/java/com/sd/wln/service/impl/WlnOrderServiceImpl.java

@@ -472,18 +472,29 @@ public class WlnOrderServiceImpl implements WlnOrderService {
             SkuSpec skuSpec = skuSpecMap.get(wlnOrderSku.getString("sys_spec_uid"));
             if (skuSpec == null) {
                 addExceptionType(orderInfo, OrderExceptionTypeEnum.UNKNOWN_SKU_SPEC);
-            } else if (skuSpec.getBomSpecId() == null) {
+            } else if (skuSpec.getBomSpecId() == null && !Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES)) {
                 addExceptionType(orderInfo, OrderExceptionTypeEnum.UNKNOWN_BOM_SPEC);
             }
 
             // 创建订单sku
             OrderSku orderSku = createOrderSku(context, wlnOrderSku, orderInfo, skuSpec);
 
-            // 获取订单sku包材
-            List<OrderSkuBom> tempOrderSkuBomList = createOrderSkuBoom(context, orderSku);
+            List<OrderSkuBom> tempOrderSkuBomList;
+            List<OrderPackageBom> tempOrderPackageBomList;
 
-            // 获取订单sku快递包材
-            List<OrderPackageBom> tempOrderPackageBomList = createOrderPackageBomList(context, orderSku);
+            // 赠品sku不创建包材
+            if (skuSpec != null && Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES)) {
+                tempOrderSkuBomList = new ArrayList<>();
+                tempOrderPackageBomList = new ArrayList<>();
+                // 增加代发费,使订单总金额不变
+                orderSku.setLssueFee(new BigDecimal("0.5"));
+            } else {
+                // 获取订单sku包材
+                tempOrderSkuBomList = createOrderSkuBoom(context, orderSku);
+
+                // 获取订单sku快递包材
+                tempOrderPackageBomList = createOrderPackageBomList(context, orderSku);
+            }
 
             // 获取订单sku成本
             OrderSkuProductionCost productionCostList = createOrderSkuProductionCostList(orderSku, tempOrderSkuBomList);
@@ -506,6 +517,23 @@ public class WlnOrderServiceImpl implements WlnOrderService {
                     return v1;
                 }
         ));
+
+        // 查询所有赠品sku,将赠品代发费添加到正常sku上面
+        List<OrderSku> giftSkuList = orderSkuList.stream().filter(item -> {
+            SkuSpec skuSpec = skuSpecMap.get(item.getWlnSkuSpecId());
+           return skuSpec != null && Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES);
+        }).collect(Collectors.toList());
+        if (!giftSkuList.isEmpty()) {
+            List<Long> giftSkuIds = giftSkuList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+            for (OrderSku giftOrderSku : giftSkuList) {
+                orderSkuList.stream()
+                        .filter(item -> !giftSkuIds.contains(item.getId()) && ObjectUtil.equals(item.getQuantity(), giftOrderSku.getQuantity()))
+                        .findAny()
+                        .ifPresent(orderSku -> orderSku.setLssueFee(orderSku.getLssueFee().add(giftOrderSku.getLssueFee())));
+                giftOrderSku.setLssueFee(BigDecimal.ZERO);
+            }
+        }
+
         context.getSaveOrderList().add(orderInfo);
         context.getSaveOrderSkuList().addAll(orderSkuList);
         context.getSaveOrderSkuBomList().addAll(orderSkuBomList);
@@ -555,7 +583,8 @@ public class WlnOrderServiceImpl implements WlnOrderService {
             assignedOrderSkuPrice(context, orderSku, skuSpec);
 
             if (OrderStatusEnum.STOCK_PREPARATION.getKey().equals(orderInfo.getStatus())
-                    && orderSku.getArtworkLibraryId() == null) {
+                    && orderSku.getArtworkLibraryId() == null
+                    && !Objects.equals(skuSpec.getGiftTag(), StatusConstant.YES)) {
                 addExceptionType(orderInfo, OrderExceptionTypeEnum.NO_DESIGN_DOCUMENT);
             }
 
@@ -724,6 +753,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
         List<OrderInfo> saveOrderList = context.getSaveOrderList();
         List<OrderSku> saveOrderSkuList = context.getSaveOrderSkuList();
         Map<Long, BomSpecBo> bomSpecBoMap = context.getBomSpecBoMap();
+        Map<String, SkuSpec> skuSpecMap = context.getSkuSpecMap();
         List<OrderInfo> updateOrderList = context.getUpdateOrderList();
         Map<Long, List<OrderSku>> existOrderSkuMap = context.getExistOrderSkuMap();
 
@@ -738,6 +768,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
                 .filter(item -> orderMap.get(item.getOrderId()).getExceptionType().equals(OrderExceptionTypeEnum.NORMAL.getKey().toString()))
                 .filter(item -> Objects.equals(orderMap.get(item.getOrderId()).getStatus(), OrderStatusEnum.STOCK_PREPARATION.getKey()))
                 .filter(item -> Objects.equals(orderMap.get(item.getOrderId()).getLockStorage(), StatusConstant.NO))
+                .filter(item -> !Objects.equals(skuSpecMap.get(item.getWlnSkuSpecId()).getGiftTag(), StatusConstant.YES))
                 .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
                 .collect(Collectors.groupingBy(OrderSku::getOrderId));
 
@@ -770,6 +801,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
         List<OrderInfo> updateOrderList = context.getUpdateOrderList();
         Map<Long, List<OrderSku>> existOrderSkuMap = context.getExistOrderSkuMap();
         Map<Long, BomSpecBo> bomSpecBoMap = context.getBomSpecBoMap();
+        Map<String, SkuSpec> skuSpecMap = context.getSkuSpecMap();
 
         // 半成品解锁库存sku
         List<OrderSku> unlockStorageOrderSkuList = new ArrayList<>();
@@ -784,6 +816,7 @@ public class WlnOrderServiceImpl implements WlnOrderService {
 
             List<OrderSku> orderSkuList = existOrderSkuMap.get(orderInfo.getId())
                     .stream()
+                    .filter(item -> !Objects.equals(skuSpecMap.get(item.getWlnSkuSpecId()).getGiftTag(), StatusConstant.YES))
                     .filter(item -> {
                         Long bomSpecId = item.getBomSpecId();
                         BomSpecBo bomSpecBo = bomSpecBoMap.get(bomSpecId);