Преглед изворни кода

运维接口:订单对比,新增库存
订单添加附件
对账单生成规则优化

24282 пре 1 година
родитељ
комит
60c4c0f5d7
18 измењених фајлова са 1272 додато и 135 уклоњено
  1. 8 0
      sd-business/src/main/java/com/sd/business/controller/inventory/InventoryController.java
  2. 9 0
      sd-business/src/main/java/com/sd/business/controller/order/OrderController.java
  3. 11 0
      sd-business/src/main/java/com/sd/business/controller/outbound/OutboundOrderController.java
  4. 6 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoDto.java
  5. 5 0
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSelectDto.java
  6. 22 0
      sd-business/src/main/java/com/sd/business/entity/order/vo/CompareVo.java
  7. 5 0
      sd-business/src/main/java/com/sd/business/service/inventory/InventoryService.java
  8. 54 0
      sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java
  9. 6 0
      sd-business/src/main/java/com/sd/business/service/order/OrderService.java
  10. 35 9
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java
  11. 8 0
      sd-business/src/main/java/com/sd/business/service/outbound/OutboundOrderService.java
  12. 29 0
      sd-business/src/main/java/com/sd/business/service/outbound/impl/OutboundOrderServiceImpl.java
  13. 1 1
      sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java
  14. 3 3
      sd-starter/src/test/java/C3_SyncInventoryTest.java
  15. 963 65
      sd-starter/src/test/java/D1_OrderCompare.java
  16. 37 0
      sd-starter/src/test/java/E1_OrderOutCompare.java
  17. 11 0
      sd-starter/src/test/java/TestList.java
  18. 59 57
      sd-wln/src/main/java/com/sd/wln/service/impl/WlnStatementOfAccountImpl.java

+ 8 - 0
sd-business/src/main/java/com/sd/business/controller/inventory/InventoryController.java

@@ -1,5 +1,6 @@
 package com.sd.business.controller.inventory;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.annotation.NonInterception;
 import com.sd.business.entity.inventory.dto.GetQuantityDto;
@@ -74,5 +75,12 @@ public class InventoryController {
         inventoryService.exportExcel(dto);
     }
 
+    /**
+     * 新增库存
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody JSONObject dto) {
+        inventoryService.add(dto.getString("str"), dto.getLong("warehouseId"), dto.getLong("departmentId"));
+    }
 
 }

+ 9 - 0
sd-business/src/main/java/com/sd/business/controller/order/OrderController.java

@@ -5,6 +5,7 @@ import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.sd.business.entity.order.dto.OrderInfoDto;
 import com.sd.business.entity.order.dto.OrderSelectDto;
 import com.sd.business.entity.order.dto.SkuSpecPriceDto;
+import com.sd.business.entity.order.vo.CompareVo;
 import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.order.vo.SkuSpecPriceVo;
 import com.sd.business.service.order.OrderService;
@@ -110,4 +111,12 @@ public class OrderController {
         orderService.deleteAndStore(dto.getId());
     }
 
+    /**
+     * 订单对比
+     */
+    @PostMapping("/compare")
+    public CompareVo compare(@RequestBody OrderSelectDto dto) {
+        return orderService.compare(dto);
+    }
+
 }

+ 11 - 0
sd-business/src/main/java/com/sd/business/controller/outbound/OutboundOrderController.java

@@ -2,6 +2,7 @@ package com.sd.business.controller.outbound;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.order.dto.OrderSelectDto;
 import com.sd.business.entity.outbound.dto.OutboundOrderDto;
 import com.sd.business.entity.outbound.dto.OutboundOrderSelectDto;
 import com.sd.business.entity.outbound.vo.OutboundOrderVo;
@@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -68,4 +71,12 @@ public class OutboundOrderController {
         outboundOrderService.delete(dto.getId());
     }
 
+    /**
+     * 订单对比对账单
+     */
+    @PostMapping("/orderDeliveryComparison")
+    public List<String> orderDeliveryComparison(@RequestBody OrderSelectDto dto) {
+        return outboundOrderService.orderDeliveryComparison(dto);
+    }
+
 }

+ 6 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoDto.java

@@ -1,5 +1,6 @@
 package com.sd.business.entity.order.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.sd.business.entity.order.po.OrderInfo;
 import lombok.Getter;
 import lombok.Setter;
@@ -30,5 +31,10 @@ public class OrderInfoDto extends OrderInfo {
     @NotEmpty(message = "产品列表不能为空")
     private List<OrderSkuDto> orderSkuList;
 
+    /**
+     * 附件列表
+     */
+    private List<ObsFile> fileList;
+
 
 }

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSelectDto.java

@@ -54,4 +54,9 @@ public class OrderSelectDto extends BaseSelectDto {
      */
     private Integer exception;
 
+    /**
+     * 对比字符串
+     */
+    private String compareStr;
+
 }

+ 22 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/CompareVo.java

@@ -0,0 +1,22 @@
+package com.sd.business.entity.order.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class CompareVo {
+
+    /**
+     * 系统缺少订单
+     */
+    private List<String> systemMissingOrderList;
+
+    /**
+     * 系统多余订单
+     */
+    private List<String> systemSurplusOrderList;
+
+}

+ 5 - 0
sd-business/src/main/java/com/sd/business/service/inventory/InventoryService.java

@@ -69,4 +69,9 @@ public interface InventoryService extends BaseService<Inventory> {
      */
     void exportExcel(InventorySelectDto dto);
 
+    /**
+     * 新增库存
+     */
+    void add(String str, Long warehouseId, Long departmentId);
+
 }

+ 54 - 0
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java

@@ -1,8 +1,10 @@
 package com.sd.business.service.inventory.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.bom.po.Bom;
@@ -192,6 +194,58 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
                 "库存数据", list, InventoryVo.class);
     }
 
+    @Override
+    public void add(String str, Long warehouseId, Long departmentId) {
+        List<List<String>> list = Arrays.stream(str.split("\n"))
+                .map(item -> Arrays.stream(item.split("\t")).filter(StrUtil::isNotBlank).collect(Collectors.toList()))
+                .collect(Collectors.toList());
+
+        Map<String, Long> bomSpecMap = bomSpecService.mapKV(BomSpec::getCode, BaseIdPo::getId, null);
+
+        for (List<String> data : list) {
+
+            String code = data.get(0);
+            String quantity = data.size() == 1 ? "0" : data.get(1);
+
+            Long bomSpecId = bomSpecMap.get(code);
+
+            boolean update = update(q -> q
+                    .eq(Inventory::getBomSpecId, bomSpecId)
+                    .eq(Inventory::getWarehouseId, warehouseId)
+                    .eq(Inventory::getDepartmentId, departmentId)
+                    .set(Inventory::getQuantity, quantity)
+            );
+
+            if (!update) {
+                Inventory inventory = new Inventory();
+                inventory.setBomSpecId(bomSpecId);
+                inventory.setWarehouseId(warehouseId);
+                inventory.setDepartmentId(departmentId);
+                inventory.setQuantity(new BigDecimal(quantity));
+                inventory.setBalanceUnitPrice(BigDecimal.ZERO);
+                save(inventory);
+            }
+
+            boolean update1 = inOutStorageDetailsService.update(q -> q
+                    .eq(InOutStorageDetails::getBomSpecId, bomSpecId)
+                    .eq(InOutStorageDetails::getWarehouseId, warehouseId)
+                    .eq(InOutStorageDetails::getDepartmentId, departmentId)
+                    .set(InOutStorageDetails::getQuantity, quantity)
+            );
+
+            if (!update1) {
+                InOutStorageDetails inOutStorageDetails = new InOutStorageDetails();
+                inOutStorageDetails.setBomSpecId(bomSpecId);
+                inOutStorageDetails.setWarehouseId(warehouseId);
+                inOutStorageDetails.setDepartmentId(departmentId);
+                inOutStorageDetails.setQuantity(new BigDecimal(quantity));
+                inOutStorageDetails.setInUnitPrice(BigDecimal.ZERO);
+                inOutStorageDetailsService.save(inOutStorageDetails);
+            }
+
+        }
+    }
+
     /**
      * 通过事业部id和出库id获取bom规格库存
      */

+ 6 - 0
sd-business/src/main/java/com/sd/business/service/order/OrderService.java

@@ -7,6 +7,7 @@ import com.sd.business.entity.order.dto.OrderInfoDto;
 import com.sd.business.entity.order.dto.OrderSelectDto;
 import com.sd.business.entity.order.dto.SkuSpecPriceDto;
 import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.order.vo.CompareVo;
 import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.order.vo.SkuSpecPriceVo;
 
@@ -75,4 +76,9 @@ public interface OrderService extends BaseService<OrderInfo> {
      */
     void deleteAndStore(Long id);
 
+    /**
+     * 订单对比
+     */
+    CompareVo compare(OrderSelectDto dto);
+
 }

+ 35 - 9
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -4,8 +4,10 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.file.utils.ObsFileUtil;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.common.constant.StatusConstant;
 import com.ruoyi.common.core.domain.BaseIdPo;
@@ -29,10 +31,7 @@ import com.sd.business.entity.order.dto.SkuSpecPriceDto;
 import com.sd.business.entity.order.enums.OrderExceptionTypeEnum;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.*;
-import com.sd.business.entity.order.vo.OrderInfoVo;
-import com.sd.business.entity.order.vo.OrderSkuBomVo;
-import com.sd.business.entity.order.vo.OrderSkuVo;
-import com.sd.business.entity.order.vo.SkuSpecPriceVo;
+import com.sd.business.entity.order.vo.*;
 import com.sd.business.entity.price.po.PriceBillingStandard;
 import com.sd.business.entity.price.po.PriceBillingStandardDetail;
 import com.sd.business.entity.sku.po.SkuSpec;
@@ -49,7 +48,6 @@ 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 org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -206,7 +204,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         return result;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public void add(OrderInfoDto orderDto) {
         orderDto.setSource(1);
@@ -237,9 +235,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         orderOperatingLog.setOrderId(orderDto.getId());
         orderOperatingLog.setOrderCode(orderDto.getCode());
         orderOperatingLogService.save(orderOperatingLog);
+
+        ObsFileUtil.saveFile(orderDto.getFileList(), orderDto.getId());
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public void edit(OrderInfoDto orderDto) {
         this.updateById(orderDto);
@@ -266,9 +266,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
             orderOperatingLog.setOrderCode(orderDto.getCode());
             orderOperatingLogService.save(orderOperatingLog);
         }
+
+        ObsFileUtil.editFile(orderDto.getFileList(), orderDto.getId());
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public void delete(Long id, boolean saveLog) {
         OrderInfo orderInfo = getById(id);
@@ -434,7 +436,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
 
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public synchronized void deleteAndStore(Long id) {
 
@@ -530,6 +532,28 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
 
     }
 
+    @Override
+    public CompareVo compare(OrderSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(999999999);
+        Page<OrderInfoVo> page = getPage(dto);
+        List<OrderInfoVo> records = page.getRecords();
+        List<String> wlnCodeList = records.stream().map(OrderInfo::getWlnCode).collect(Collectors.toList());
+
+
+        String compareStr = dto.getCompareStr();
+        List<String> list = Arrays.asList(compareStr.split("\n"));
+
+        List<String> systemMissingOrderList = list.stream().filter(item -> !wlnCodeList.contains(item)).collect(Collectors.toList());
+        List<String> systemSurplusOrderList = wlnCodeList.stream().filter(item -> !list.contains(item)).collect(Collectors.toList());
+
+        CompareVo compareVo = new CompareVo();
+        compareVo.setSystemMissingOrderList(systemMissingOrderList);
+        compareVo.setSystemSurplusOrderList(systemSurplusOrderList);
+
+        return compareVo;
+    }
+
     /**
      * 删除订单以及订单关联数据
      */
@@ -538,6 +562,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         orderSkuService.remove(q -> q.eq(OrderSku::getOrderId, id));
         orderSkuBomService.remove(q -> q.eq(OrderSkuBom::getOrderId, id));
         orderPackageBomService.remove(q -> q.eq(OrderPackageBom::getOrderId, id));
+
+        ObsFileUtil.removeFile(id);
     }
 
 }

+ 8 - 0
sd-business/src/main/java/com/sd/business/service/outbound/OutboundOrderService.java

@@ -2,11 +2,14 @@ package com.sd.business.service.outbound;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.order.dto.OrderSelectDto;
 import com.sd.business.entity.outbound.dto.OutboundOrderDto;
 import com.sd.business.entity.outbound.dto.OutboundOrderSelectDto;
 import com.sd.business.entity.outbound.po.OutboundOrder;
 import com.sd.business.entity.outbound.vo.OutboundOrderVo;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -43,4 +46,9 @@ public interface OutboundOrderService extends BaseService<OutboundOrder> {
      */
     void delete(Long id);
 
+    /**
+     * 订单出库缺少对比
+     */
+    List<String> orderDeliveryComparison(OrderSelectDto dto);
+
 }

+ 29 - 0
sd-business/src/main/java/com/sd/business/service/outbound/impl/OutboundOrderServiceImpl.java

@@ -4,14 +4,23 @@ import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.order.dto.OrderSelectDto;
+import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.outbound.dto.OutboundOrderDto;
 import com.sd.business.entity.outbound.dto.OutboundOrderSelectDto;
 import com.sd.business.entity.outbound.po.OutboundOrder;
 import com.sd.business.entity.outbound.vo.OutboundOrderVo;
 import com.sd.business.mapper.outbound.OutboundOrderMapper;
+import com.sd.business.service.order.OrderService;
 import com.sd.business.service.outbound.OutboundOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
 
 /**
  * <p>
@@ -24,6 +33,9 @@ import org.springframework.stereotype.Service;
 @Service
 public class OutboundOrderServiceImpl extends ServiceImpl<OutboundOrderMapper, OutboundOrder> implements OutboundOrderService {
 
+    @Autowired
+    private OrderService orderService;
+
     @Override
     public Page<OutboundOrderVo> getPage(OutboundOrderSelectDto dto) {
         IWrapper<OutboundOrder> wrapper = getWrapper();
@@ -54,4 +66,21 @@ public class OutboundOrderServiceImpl extends ServiceImpl<OutboundOrderMapper, O
         this.removeById(id);
     }
 
+    @Override
+    public List<String> orderDeliveryComparison(OrderSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(999999999);
+        Page<OrderInfoVo> page = orderService.getPage(dto);
+        List<OrderInfoVo> records = page.getRecords();
+        if (records.size() == 0) {
+            return Collections.emptyList();
+        }
+
+        List<String> wlnCodeList = records.stream().map(OrderInfo::getWlnCode).collect(Collectors.toList());
+        List<OutboundOrder> list = list(q -> q.in(OutboundOrder::getOrderWlnCode, wlnCodeList));
+        List<String> outboundOrderWlnCodeList = list.stream().map(OutboundOrder::getOrderWlnCode).collect(Collectors.toList());
+
+        return wlnCodeList.stream().filter(item -> !outboundOrderWlnCodeList.contains(item)).collect(Collectors.toList());
+    }
+
 }

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

@@ -93,7 +93,7 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
         wrapper.eq("soa", StatementOfAccount::getDepartmentId, dto.getDepartmentId());
         wrapper.ge("soa", StatementOfAccount::getTimePeriod, dto.getBeginTime());
         wrapper.le("soa", StatementOfAccount::getTimePeriod, dto.getEndTime());
-        wrapper.orderByDesc("soa", StatementOfAccount::getId);
+        wrapper.orderByDesc("soa", StatementOfAccount::getCode);
 
         Page<StatementOfAccountVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<StatementOfAccountVo> records = page.getRecords();

+ 3 - 3
sd-starter/src/test/java/C3_SyncInventoryTest.java

@@ -52,7 +52,7 @@ public class C3_SyncInventoryTest {
 
         DataListener<ExcelData> listener = new DataListener<>();
 
-        FileInputStream fileInputStream = new FileInputStream("E:\\入库明细表.xlsx");
+        FileInputStream fileInputStream = new FileInputStream("E:\\新增库存.xlsx");
 
         ExcelReaderBuilder read = EasyExcel.read(fileInputStream, ExcelData.class, listener);
         read.sheet(0).doRead();
@@ -62,12 +62,12 @@ public class C3_SyncInventoryTest {
 
         Map<Long, Inventory> inventoryMap = inventoryService.mapKEntity(
                 Inventory::getBomSpecId,
-                q -> q.eq(Inventory::getWarehouseId, 1684037244354052098L).eq(Inventory::getDepartmentId, 0L));
+                q -> q.eq(Inventory::getDepartmentId, 0L));
 
 
         Map<Long, InOutStorageDetails> inOutStorageDetailsMap = inOutStorageDetailsService.mapKEntity(
                 InOutStorageDetails::getBomSpecId,
-                q -> q.eq(InOutStorageDetails::getWarehouseId, 1684037244354052098L).eq(InOutStorageDetails::getDepartmentId, 0L));
+                q -> q.eq(InOutStorageDetails::getDepartmentId, 0L));
 
         for (ExcelData excelData : list) {
             String code = excelData.getCode();

+ 963 - 65
sd-starter/src/test/java/D1_OrderCompare.java

@@ -23,7 +23,6 @@ public class D1_OrderCompare {
     @Autowired
     private OrderController orderController;
 
-
     /**
      * 订单对比
      */
@@ -31,74 +30,973 @@ public class D1_OrderCompare {
     @Test
     public void test() {
 
-        String a = "XD230901000205\n" +
-                "XD230901000446\n" +
-                "XD230901000406\n" +
-                "XD230901000111\n" +
-                "XD230831001407\n" +
-                "XD230901000898\n" +
-                "XD230901000755\n" +
-                "XD230901001211\n" +
-                "XD230901001140\n" +
-                "XD230901001234\n" +
-                "XD230902001795\n" +
-                "XD230903000642\n" +
-                "XD230902000928\n" +
-                "XD230902002266\n" +
-                "XD230902001717\n" +
-                "XD230903000577\n" +
-                "XD230903000755\n" +
-                "XD230903000349\n" +
-                "XD230903001169\n" +
-                "XD230902001756\n" +
-                "XD230830000702\n" +
-                "XD230904000583\n" +
-                "XD230901001291\n" +
-                "XD230904000483\n" +
-                "XD230904000592\n" +
-                "XD230903002250\n" +
-                "XD230903000992\n" +
-                "XD230903002487\n" +
-                "XD230901001346\n" +
-                "XD230904001322\n" +
-                "XD230905000637\n" +
-                "XD230904002241\n" +
-                "XD230904001352\n" +
-                "XD230904001686\n" +
-                "XD230904001675\n" +
-                "XD230905000765\n" +
-                "XD230904001637\n" +
-                "XD230904001761\n" +
-                "XD230904001917\n" +
-                "XD230902002563\n" +
-                "XD230904001308\n" +
-                "XD230904001521\n" +
-                "XD230904001639\n" +
-                "XD230904001494\n" +
-                "XD230904002136\n" +
-                "XD230904001874\n" +
-                "XD230905001281\n" +
-                "XD230905000716\n" +
-                "XD230905002201\n" +
-                "XD230905001984\n" +
-                "XD230905001938\n" +
-                "XD230905001714\n" +
-                "XD230905001340\n" +
-                "XD230905001476\n" +
-                "XD230906000523\n" +
-                "XD230906000658\n" +
-                "XD230905000821\n" +
-                "XD230905002169\n" +
-                "XD230905001271\n" +
-                "XD230905000649\n" +
-                "XD230906001349\n" +
-                "XD230906000907";
-
+        String a = "XD230908000295\n" +
+                "XD230908000700\n" +
+                "XD230908000776\n" +
+                "XD230908000714\n" +
+                "XD230908000068\n" +
+                "XD230908000432\n" +
+                "XD230908000012\n" +
+                "XD230908000351\n" +
+                "XD230908000049\n" +
+                "XD230908000573\n" +
+                "XD230908000070\n" +
+                "XD230908000530\n" +
+                "XD230908000537\n" +
+                "XD230908000483\n" +
+                "XD230908000103\n" +
+                "XD230908000155\n" +
+                "XD230908000401\n" +
+                "XD230908000168\n" +
+                "XD230908000608\n" +
+                "XD230907002745\n" +
+                "XD230908000575\n" +
+                "XD230908000424\n" +
+                "XD230907002717\n" +
+                "XD230908000158\n" +
+                "XD230908000034\n" +
+                "XD230907003159\n" +
+                "XD230908000065\n" +
+                "XD230908000710\n" +
+                "XD230908000660\n" +
+                "XD230907002958\n" +
+                "XD230908000078\n" +
+                "XD230908000227\n" +
+                "XD230908000721\n" +
+                "XD230908000804\n" +
+                "XD230908000935\n" +
+                "XD230908000541\n" +
+                "XD230908000733\n" +
+                "XD230908000171\n" +
+                "XD230908000752\n" +
+                "XD230908000038\n" +
+                "XD230908000468\n" +
+                "XD230908000110\n" +
+                "XD230908000036\n" +
+                "XD230908000882\n" +
+                "XD230908000604\n" +
+                "XD230908000016\n" +
+                "XD230908001059\n" +
+                "XD230908000090\n" +
+                "XD230908000195\n" +
+                "XD230908000711\n" +
+                "XD230907002835\n" +
+                "XD230907003204\n" +
+                "XD230908000362\n" +
+                "XD230908000025\n" +
+                "XD230908000547\n" +
+                "XD230908000315\n" +
+                "XD230908000440\n" +
+                "XD230908000427\n" +
+                "XD230907002953\n" +
+                "XD230908000305\n" +
+                "XD230908000138\n" +
+                "XD230908000421\n" +
+                "XD230907003086\n" +
+                "XD230908000051\n" +
+                "XD230908000735\n" +
+                "XD230908000833\n" +
+                "XD230908000148\n" +
+                "XD230908000126\n" +
+                "XD230908000334\n" +
+                "XD230908000849\n" +
+                "XD230908000085\n" +
+                "XD230908000492\n" +
+                "XD230908000556\n" +
+                "XD230908000728\n" +
+                "XD230907002677\n" +
+                "XD230908000557\n" +
+                "XD230908000742\n" +
+                "XD230908000678\n" +
+                "XD230908000459\n" +
+                "XD230908000731\n" +
+                "XD230908000258\n" +
+                "XD230908000261\n" +
+                "XD230908000169\n" +
+                "XD230908000350\n" +
+                "XD230908000626\n" +
+                "XD230908000467\n" +
+                "XD230907003026\n" +
+                "XD230908000749\n" +
+                "XD230908000637\n" +
+                "XD230908000979\n" +
+                "XD230908000153\n" +
+                "XD230907002687\n" +
+                "XD230908000027\n" +
+                "XD230908000211\n" +
+                "XD230908000236\n" +
+                "XD230908000127\n" +
+                "XD230908000501\n" +
+                "XD230907002840\n" +
+                "XD230908000843\n" +
+                "XD230908000193\n" +
+                "XD230908000854\n" +
+                "XD230907002627\n" +
+                "XD230908000443\n" +
+                "XD230908000217\n" +
+                "XD230908000878\n" +
+                "XD230908000753\n" +
+                "XD230908000098\n" +
+                "XD230908000623\n" +
+                "XD230908000974\n" +
+                "XD230908000089\n" +
+                "XD230907002737\n" +
+                "XD230907002747\n" +
+                "XD230908000500\n" +
+                "XD230908000762\n" +
+                "XD230908000080\n" +
+                "XD230908000789\n" +
+                "XD230908000737\n" +
+                "XD230908000917\n" +
+                "XD230908000899\n" +
+                "XD230908000454\n" +
+                "XD230908000260\n" +
+                "XD230908000884\n" +
+                "XD230908001014\n" +
+                "XD230908000420\n" +
+                "XD230907003036\n" +
+                "XD230908000073\n" +
+                "XD230908000995\n" +
+                "XD230908000952\n" +
+                "XD230908000817\n" +
+                "XD230908000871\n" +
+                "XD230908000892\n" +
+                "XD230907002882\n" +
+                "XD230907002885\n" +
+                "XD230908000011\n" +
+                "XD230908000874\n" +
+                "XD230908000812\n" +
+                "XD230908000411\n" +
+                "XD230908000994\n" +
+                "XD230908000901\n" +
+                "XD230908000590\n" +
+                "XD230908000877\n" +
+                "XD230908000865\n" +
+                "XD230908000803\n" +
+                "XD230908000692\n" +
+                "XD230908000802\n" +
+                "XD230908000593\n" +
+                "XD230908000783\n" +
+                "XD230908000702\n" +
+                "XD230908000945\n" +
+                "XD230908000423\n" +
+                "XD230908000924\n" +
+                "XD230908000942\n" +
+                "XD230908000502\n" +
+                "XD230908000018\n" +
+                "XD230908000863\n" +
+                "XD230908000266\n" +
+                "XD230908000079\n" +
+                "XD230908000774\n" +
+                "XD230908000781\n" +
+                "XD230908000344\n" +
+                "XD230908000954\n" +
+                "XD230908000932\n" +
+                "XD230907002637\n" +
+                "XD230908000875\n" +
+                "XD230908000962\n" +
+                "XD230907002842\n" +
+                "XD230908000693\n" +
+                "XD230907002820\n" +
+                "XD230908000280\n" +
+                "XD230908000417\n" +
+                "XD230907002900\n" +
+                "XD230908000921\n" +
+                "XD230908000603\n" +
+                "XD230908000982\n" +
+                "XD230908000033\n" +
+                "XD230908000404\n" +
+                "XD230908000318\n" +
+                "XD230908000151\n" +
+                "XD230908001025\n" +
+                "XD230907003028\n" +
+                "XD230908000985\n" +
+                "XD230907002986\n" +
+                "XD230908000825\n" +
+                "XD230908000094\n" +
+                "XD230908001035\n" +
+                "XD230908000720\n" +
+                "XD230907002697\n" +
+                "XD230908000586\n" +
+                "XD230908000314\n" +
+                "XD230907003221\n" +
+                "XD230907003008\n" +
+                "XD230907003056\n" +
+                "XD230907002880\n" +
+                "XD230908000618\n" +
+                "XD230908000120\n" +
+                "XD230908000360\n" +
+                "XD230908000096\n" +
+                "XD230908000969\n" +
+                "XD230908000229\n" +
+                "XD230908000076\n" +
+                "XD230907002862\n" +
+                "XD230908000444\n" +
+                "XD230907002770\n" +
+                "XD230908000407\n" +
+                "XD230908000041\n" +
+                "XD230908000014\n" +
+                "XD230908000527\n" +
+                "XD230908000564\n" +
+                "XD230907002727\n" +
+                "XD230908000722\n" +
+                "XD230908000414\n" +
+                "XD230908000730\n" +
+                "XD230907002988\n" +
+                "XD230908000647\n" +
+                "XD230908000723\n" +
+                "XD230907003106\n" +
+                "XD230907002978\n" +
+                "XD230908000858\n" +
+                "XD230908000657\n" +
+                "XD230908000947\n" +
+                "XD230908000577\n" +
+                "XD230907002865\n" +
+                "XD230908000022\n" +
+                "XD230907003066\n" +
+                "XD230908000794\n" +
+                "XD230908000999\n" +
+                "XD230908000286\n" +
+                "XD230908000852\n" +
+                "XD230908001209\n" +
+                "XD230908000970\n" +
+                "XD230908001058\n" +
+                "XD230908001112\n" +
+                "XD230908001441\n" +
+                "XD230908001598\n" +
+                "XD230908002935\n" +
+                "XD230908002957\n" +
+                "XD230909000143\n" +
+                "XD230908001635\n" +
+                "XD230908002260\n" +
+                "XD230908002623\n" +
+                "XD230908002792\n" +
+                "XD230909000099\n" +
+                "XD230908002765\n" +
+                "XD230908002479\n" +
+                "XD230908001780\n" +
+                "XD230909000284\n" +
+                "XD230908002020\n" +
+                "XD230909000027\n" +
+                "XD230909000133\n" +
+                "XD230908002925\n" +
+                "XD230909000382\n" +
+                "XD230908002412\n" +
+                "XD230908002112\n" +
+                "XD230909000067\n" +
+                "XD230908002366\n" +
+                "XD230908001887\n" +
+                "XD230909000273\n" +
+                "XD230908002668\n" +
+                "XD230909000201\n" +
+                "XD230908002877\n" +
+                "XD230908002578\n" +
+                "XD230909000076\n" +
+                "XD230908002889\n" +
+                "XD230908002057\n" +
+                "XD230909000245\n" +
+                "XD230908002650\n" +
+                "XD230908002440\n" +
+                "XD230908002176\n" +
+                "XD230908001520\n" +
+                "XD230909000072\n" +
+                "XD230909000488\n" +
+                "XD230909000082\n" +
+                "XD230909000147\n" +
+                "XD230908002690\n" +
+                "XD230909000433\n" +
+                "XD230909000474\n" +
+                "XD230908002439\n" +
+                "XD230909000243\n" +
+                "XD230908002944\n" +
+                "XD230908002156\n" +
+                "XD230909000437\n" +
+                "XD230908001116\n" +
+                "XD230908002446\n" +
+                "XD230909000208\n" +
+                "XD230908002572\n" +
+                "XD230909000402\n" +
+                "XD230909000058\n" +
+                "XD230908002984\n" +
+                "XD230908001699\n" +
+                "XD230908002356\n" +
+                "XD230908002654\n" +
+                "XD230908002474\n" +
+                "XD230908002306\n" +
+                "XD230908001473\n" +
+                "XD230908002720\n" +
+                "XD230908002330\n" +
+                "XD230908002515\n" +
+                "XD230909000529\n" +
+                "XD230908002941\n" +
+                "XD230909000262\n" +
+                "XD230908002006\n" +
+                "XD230909000470\n" +
+                "XD230909000369\n" +
+                "XD230909000475\n" +
+                "XD230909000215\n" +
+                "XD230908002272\n" +
+                "XD230909000519\n" +
+                "XD230908002362\n" +
+                "XD230908002701\n" +
+                "XD230909000081\n" +
+                "XD230908001792\n" +
+                "XD230908002420\n" +
+                "XD230908002748\n" +
+                "XD230908002746\n" +
+                "XD230909000040\n" +
+                "XD230908001895\n" +
+                "XD230909000491\n" +
+                "XD230908001619\n" +
+                "XD230909000118\n" +
+                "XD230909000039\n" +
+                "XD230909000123\n" +
+                "XD230908002683\n" +
+                "XD230908001188\n" +
+                "XD230908001654\n" +
+                "XD230908002129\n" +
+                "XD230908001840\n" +
+                "XD230908001543\n" +
+                "XD230909000126\n" +
+                "XD230909000127\n" +
+                "XD230908001989\n" +
+                "XD230908002421\n" +
+                "XD230908001680\n" +
+                "XD230908001834\n" +
+                "XD230908001681\n" +
+                "XD230908002182\n" +
+                "XD230908001629\n" +
+                "XD230908001982\n" +
+                "XD230908002942\n" +
+                "XD230909000083\n" +
+                "XD230908001750\n" +
+                "XD230908001280\n" +
+                "XD230908001193\n" +
+                "XD230908001632\n" +
+                "XD230908001603\n" +
+                "XD230908001449\n" +
+                "XD230908001824\n" +
+                "XD230908001234\n" +
+                "XD230908001720\n" +
+                "XD230908000988\n" +
+                "XD230908002317\n" +
+                "XD230908001904\n" +
+                "XD230908002011\n" +
+                "XD230908002242\n" +
+                "XD230908001703\n" +
+                "XD230908001517\n" +
+                "XD230908001938\n" +
+                "XD230908001514\n" +
+                "XD230908001300\n" +
+                "XD230908001910\n" +
+                "XD230908001873\n" +
+                "XD230908001983\n" +
+                "XD230908002785\n" +
+                "XD230908001169\n" +
+                "XD230908001704\n" +
+                "XD230909000413\n" +
+                "XD230908002519\n" +
+                "XD230908002794\n" +
+                "XD230908000237\n" +
+                "XD230908001067\n" +
+                "XD230908002552\n" +
+                "XD230909000454\n" +
+                "XD230908001330\n" +
+                "XD230908001406\n" +
+                "XD230908002258\n" +
+                "XD230908001855\n" +
+                "XD230909000062\n" +
+                "XD230909000195\n" +
+                "XD230908001697\n" +
+                "XD230908002899\n" +
+                "XD230909000029\n" +
+                "XD230908002442\n" +
+                "XD230908001412\n" +
+                "XD230908001374\n" +
+                "XD230908002253\n" +
+                "XD230908002696\n" +
+                "XD230909000259\n" +
+                "XD230909000095\n" +
+                "XD230908002388\n" +
+                "XD230909000306\n" +
+                "XD230908002200\n" +
+                "XD230908001436\n" +
+                "XD230908002617\n" +
+                "XD230908003101\n" +
+                "XD230908001013\n" +
+                "XD230909000218\n" +
+                "XD230909000041\n" +
+                "XD230908001836\n" +
+                "XD230908001146\n" +
+                "XD230908001931\n" +
+                "XD230908000940\n" +
+                "XD230908001990\n" +
+                "XD230908002122\n" +
+                "XD230908001353\n" +
+                "XD230909000053\n" +
+                "XD230909000226\n" +
+                "XD230909000416\n" +
+                "XD230909000501\n" +
+                "XD230908002901\n" +
+                "XD230908001066\n" +
+                "XD230909000461\n" +
+                "XD230908002844\n" +
+                "XD230908001533\n" +
+                "XD230908001555\n" +
+                "XD230908002653\n" +
+                "XD230908002490\n" +
+                "XD230909000078\n" +
+                "XD230909000233\n" +
+                "XD230909000213\n" +
+                "XD230908002512\n" +
+                "XD230909000327\n" +
+                "XD230908002771\n" +
+                "XD230908002915\n" +
+                "XD230908002575\n" +
+                "XD230909000131\n" +
+                "XD230909000065\n" +
+                "XD230909000462\n" +
+                "XD230909000277\n" +
+                "XD230908002982\n" +
+                "XD230909000031\n" +
+                "XD230908002699\n" +
+                "XD230908002133\n" +
+                "XD230908002307\n" +
+                "XD230909000060\n" +
+                "XD230908002867\n" +
+                "XD230908002809\n" +
+                "XD230908002804\n" +
+                "XD230909000189\n" +
+                "XD230908002215\n" +
+                "XD230908001376\n" +
+                "XD230908002619\n" +
+                "XD230908001261\n" +
+                "XD230908002710\n" +
+                "XD230908001503\n" +
+                "XD230908001643\n" +
+                "XD230908002209\n" +
+                "XD230908001168\n" +
+                "XD230909000205\n" +
+                "XD230908001789\n" +
+                "XD230908001507\n" +
+                "XD230908001565\n" +
+                "XD230909000014\n" +
+                "XD230908001948\n" +
+                "XD230908001786\n" +
+                "XD230908002142\n" +
+                "XD230908001544\n" +
+                "XD230908001023\n" +
+                "XD230908001181\n" +
+                "XD230908002513\n" +
+                "XD230908002630\n" +
+                "XD230909000390\n" +
+                "XD230908002314\n" +
+                "XD230908002308\n" +
+                "XD230908002471\n" +
+                "XD230908002643\n" +
+                "XD230908002894\n" +
+                "XD230909000034\n" +
+                "XD230908002196\n" +
+                "XD230909000091\n" +
+                "XD230908002464\n" +
+                "XD230908001980\n" +
+                "XD230908002010\n" +
+                "XD230908001344\n" +
+                "XD230908002430\n" +
+                "XD230908002107\n" +
+                "XD230908001143\n" +
+                "XD230908002372\n" +
+                "XD230908002713\n" +
+                "XD230908002764\n" +
+                "XD230908001554\n" +
+                "XD230909000038\n" +
+                "XD230908002149\n" +
+                "XD230909000255\n" +
+                "XD230909000319\n" +
+                "XD230908001206\n" +
+                "XD230908002357\n" +
+                "XD230908002932\n" +
+                "XD230908002664\n" +
+                "XD230909000487\n" +
+                "XD230908002160\n" +
+                "XD230908002546\n" +
+                "XD230908002286\n" +
+                "XD230908002403\n" +
+                "XD230908002774\n" +
+                "XD230908002120\n" +
+                "XD230909000456\n" +
+                "XD230909000409\n" +
+                "XD230908002341\n" +
+                "XD230909000377\n" +
+                "XD230908002500\n" +
+                "XD230909000049\n" +
+                "XD230908002050\n" +
+                "XD230908001960\n" +
+                "XD230908002594\n" +
+                "XD230908002390\n" +
+                "XD230908002392\n" +
+                "XD230909000167\n" +
+                "XD230908002246\n" +
+                "XD230908002523\n" +
+                "XD230908002233\n" +
+                "XD230908002415\n" +
+                "XD230908001828\n" +
+                "XD230908002854\n" +
+                "XD230909000048\n" +
+                "XD230908002036\n" +
+                "XD230909000585\n" +
+                "XD230908001714\n" +
+                "XD230908002805\n" +
+                "XD230908001390\n" +
+                "XD230908002485\n" +
+                "XD230908002292\n" +
+                "XD230908002801\n" +
+                "XD230909000283\n" +
+                "XD230909000411\n" +
+                "XD230909000227\n" +
+                "XD230909000023\n" +
+                "XD230908002614\n" +
+                "XD230909000497\n" +
+                "XD230908002689\n" +
+                "XD230908002557\n" +
+                "XD230909000064\n" +
+                "XD230908002480\n" +
+                "XD230909000350\n" +
+                "XD230908002321\n" +
+                "XD230909000538\n" +
+                "XD230909000286\n" +
+                "XD230908002684\n" +
+                "XD230908002460\n" +
+                "XD230908002427\n" +
+                "XD230908002662\n" +
+                "XD230908002228\n" +
+                "XD230909000165\n" +
+                "XD230908002402\n" +
+                "XD230908001669\n" +
+                "XD230908002316\n" +
+                "XD230908002510\n" +
+                "XD230908002144\n" +
+                "XD230908001593\n" +
+                "XD230908000993\n" +
+                "XD230908002048\n" +
+                "XD230908002914\n" +
+                "XD230909000339\n" +
+                "XD230908002542\n" +
+                "XD230908001729\n" +
+                "XD230908001377\n" +
+                "XD230908001691\n" +
+                "XD230908001859\n" +
+                "XD230908002071\n" +
+                "XD230908001974\n" +
+                "XD230908002184\n" +
+                "XD230908001727\n" +
+                "XD230908001832\n" +
+                "XD230908001413\n" +
+                "XD230908002128\n" +
+                "XD230908001633\n" +
+                "XD230908002309\n" +
+                "XD230908001323\n" +
+                "XD230908001439\n" +
+                "XD230908002319\n" +
+                "XD230908001379\n" +
+                "XD230908001172\n" +
+                "XD230908001553\n" +
+                "XD230908001599\n" +
+                "XD230908001469\n" +
+                "XD230908002033\n" +
+                "XD230908001673\n" +
+                "XD230908001248\n" +
+                "XD230908001205\n" +
+                "XD230908001050\n" +
+                "XD230908000977\n" +
+                "XD230908001995\n" +
+                "XD230908001480\n" +
+                "XD230908001564\n" +
+                "XD230908001689\n" +
+                "XD230908001853\n" +
+                "XD230908000900\n" +
+                "XD230908002108\n" +
+                "XD230908001609\n" +
+                "XD230908001715\n" +
+                "XD230909000595\n" +
+                "XD230909000010\n" +
+                "XD230908002450\n" +
+                "XD230908002694\n" +
+                "XD230909000150\n" +
+                "XD230908001327\n" +
+                "XD230908003091\n" +
+                "XD230908002483\n" +
+                "XD230908002003\n" +
+                "XD230908002574\n" +
+                "XD230908001061\n" +
+                "XD230908002511\n" +
+                "XD230909000033\n" +
+                "XD230909000057\n" +
+                "XD230908002053\n" +
+                "XD230908002328\n" +
+                "XD230908001356\n" +
+                "XD230908001644\n" +
+                "XD230909000343\n" +
+                "XD230908002727\n" +
+                "XD230908000930\n" +
+                "XD230908001304\n" +
+                "XD230908003041\n" +
+                "XD230908002587\n" +
+                "XD230908002216\n" +
+                "XD230908002789\n" +
+                "XD230908002824\n" +
+                "XD230908002706\n" +
+                "XD230909000260\n" +
+                "XD230909000061\n" +
+                "XD230909000422\n" +
+                "XD230908002488\n" +
+                "XD230908002742\n" +
+                "XD230908001371\n" +
+                "XD230908002009\n" +
+                "XD230908001388\n" +
+                "XD230908002172\n" +
+                "XD230908001438\n" +
+                "XD230908001899\n" +
+                "XD230908001872\n" +
+                "XD230908001660\n" +
+                "XD230908001913\n" +
+                "XD230908001022\n" +
+                "XD230908002055\n" +
+                "XD230908001446\n" +
+                "XD230908001497\n" +
+                "XD230908002435\n" +
+                "XD230909000103\n" +
+                "XD230908001601\n" +
+                "XD230908002708\n" +
+                "XD230908002897\n" +
+                "XD230908002398\n" +
+                "XD230909000021\n" +
+                "XD230908002772\n" +
+                "XD230909000139\n" +
+                "XD230908002751\n" +
+                "XD230909000384\n" +
+                "XD230908001094\n" +
+                "XD230908002181\n" +
+                "XD230908001523\n" +
+                "XD230908002753\n" +
+                "XD230908002533\n" +
+                "XD230908002534\n" +
+                "XD230908002399\n" +
+                "XD230908002345\n" +
+                "XD230909000358\n" +
+                "XD230909000236\n" +
+                "XD230908001986\n" +
+                "XD230908002599\n" +
+                "XD230908002303\n" +
+                "XD230908002590\n" +
+                "XD230908002380\n" +
+                "XD230908002605\n" +
+                "XD230908002537\n" +
+                "XD230908002346\n" +
+                "XD230908002648\n" +
+                "XD230908002907\n" +
+                "XD230908002502\n" +
+                "XD230908000896\n" +
+                "XD230908002274\n" +
+                "XD230908001778\n" +
+                "XD230908002466\n" +
+                "XD230908001212\n" +
+                "XD230908002609\n" +
+                "XD230908002447\n" +
+                "XD230909000035\n" +
+                "XD230908002922\n" +
+                "XD230909000443\n" +
+                "XD230908001702\n" +
+                "XD230908002259\n" +
+                "XD230908001685\n" +
+                "XD230908000960\n" +
+                "XD230909000269\n" +
+                "XD230908001074\n" +
+                "XD230908002237\n" +
+                "XD230908001501\n" +
+                "XD230908001900\n" +
+                "XD230908001997\n" +
+                "XD230908002101\n" +
+                "XD230909000412\n" +
+                "XD230908002042\n" +
+                "XD230908001608\n" +
+                "XD230908001284\n" +
+                "XD230908002211\n" +
+                "XD230908000890\n" +
+                "XD230908002037\n" +
+                "XD230908001317\n" +
+                "XD230908001020\n" +
+                "XD230908001389\n" +
+                "XD230908001320\n" +
+                "XD230908002099\n" +
+                "XD230908001398\n" +
+                "XD230908001883\n" +
+                "XD230908002718\n" +
+                "XD230908002525\n" +
+                "XD230908002499\n" +
+                "XD230909000146\n" +
+                "XD230908002540\n" +
+                "XD230908001250\n" +
+                "XD230908002367\n" +
+                "XD230908002682\n" +
+                "XD230908002276\n" +
+                "XD230908002702\n" +
+                "XD230908002837\n" +
+                "XD230908002348\n" +
+                "XD230908002864\n" +
+                "XD230908002769\n" +
+                "XD230908002243\n" +
+                "XD230908001130\n" +
+                "XD230908002410\n" +
+                "XD230909000312\n" +
+                "XD230908002726\n" +
+                "XD230908002592\n" +
+                "XD230908001804\n" +
+                "XD230908002230\n" +
+                "XD230908002711\n" +
+                "XD230908002629\n" +
+                "XD230908001652\n" +
+                "XD230908001303\n" +
+                "XD230908002604\n" +
+                "XD230908001316\n" +
+                "XD230909000137\n" +
+                "XD230908002700\n" +
+                "XD230908002722\n" +
+                "XD230908002647\n" +
+                "XD230908002535\n" +
+                "XD230908002607\n" +
+                "XD230908002405\n" +
+                "XD230909000281\n" +
+                "XD230909000185\n" +
+                "XD230908002931\n" +
+                "XD230908002153\n" +
+                "XD230908001943\n" +
+                "XD230908001783\n" +
+                "XD230908002675\n" +
+                "XD230908001222\n" +
+                "XD230908002067\n" +
+                "XD230908002231\n" +
+                "XD230908001402\n" +
+                "XD230908002217\n" +
+                "XD230908000950\n" +
+                "XD230908002606\n" +
+                "XD230908001656\n" +
+                "XD230908001536\n" +
+                "XD230908001919\n" +
+                "XD230908001270\n" +
+                "XD230908001361\n" +
+                "XD230908001048\n" +
+                "XD230908001908\n" +
+                "XD230908002161\n" +
+                "XD230908001962\n" +
+                "XD230908001363\n" +
+                "XD230908002312\n" +
+                "XD230908001245\n" +
+                "XD230908001578\n" +
+                "XD230908002021\n" +
+                "XD230908001401\n" +
+                "XD230908001424\n" +
+                "XD230908001561\n" +
+                "XD230908001298\n" +
+                "XD230909000394\n" +
+                "XD230908002909\n" +
+                "XD230908002641\n" +
+                "XD230908001675\n" +
+                "XD230908002971\n" +
+                "XD230908002103\n" +
+                "XD230908002125\n" +
+                "XD230908002845\n" +
+                "XD230908001754\n" +
+                "XD230908002917\n" +
+                "XD230908002461\n" +
+                "XD230908002218\n" +
+                "XD230908002425\n" +
+                "XD230908001762\n" +
+                "XD230908002767\n" +
+                "XD230909000565\n" +
+                "XD230909000199\n" +
+                "XD230908002433\n" +
+                "XD230908002737\n" +
+                "XD230909000042\n" +
+                "XD230908002704\n" +
+                "XD230908002536\n" +
+                "XD230908002665\n" +
+                "XD230908001687\n" +
+                "XD230908002238\n" +
+                "XD230908002229\n" +
+                "XD230908001558\n" +
+                "XD230908002497\n" +
+                "XD230908002373\n" +
+                "XD230909000044\n" +
+                "XD230908002277\n" +
+                "XD230909000052\n" +
+                "XD230909000140\n" +
+                "XD230908002007\n" +
+                "XD230908002624\n" +
+                "XD230908001559\n" +
+                "XD230908001547\n" +
+                "XD230908001777\n" +
+                "XD230909000406\n" +
+                "XD230908001831\n" +
+                "XD230908002152\n" +
+                "XD230908001701\n" +
+                "XD230908002034\n" +
+                "XD230908002195\n" +
+                "XD230908001160\n" +
+                "XD230908002058\n" +
+                "XD230908001607\n" +
+                "XD230908001905\n" +
+                "XD230908000898\n" +
+                "XD230908002621\n" +
+                "XD230908001202\n" +
+                "XD230908002151\n" +
+                "XD230908001341\n" +
+                "XD230908001888\n" +
+                "XD230909000036\n" +
+                "XD230908002302\n" +
+                "XD230909000372\n" +
+                "XD230908002192\n" +
+                "XD230908002386\n" +
+                "XD230908000880\n" +
+                "XD230908002022\n" +
+                "XD230908003021\n" +
+                "XD230908002945\n" +
+                "XD230908001532\n" +
+                "XD230909000455\n" +
+                "XD230909000022\n" +
+                "XD230908002326\n" +
+                "XD230909000157\n" +
+                "XD230909000151\n" +
+                "XD230908002545\n" +
+                "XD230909000397\n" +
+                "XD230908001623\n" +
+                "XD230908002902\n" +
+                "XD230908002354\n" +
+                "XD230908001162\n" +
+                "XD230908002731\n" +
+                "XD230908002715\n" +
+                "XD230908002265\n" +
+                "XD230908001890\n" +
+                "XD230908002622\n" +
+                "XD230908001622\n" +
+                "XD230908000860\n" +
+                "XD230908001314\n" +
+                "XD230908002419\n" +
+                "XD230908002627\n" +
+                "XD230908002178\n" +
+                "XD230908001875\n" +
+                "XD230908002693\n" +
+                "XD230908002203\n" +
+                "XD230908002147\n" +
+                "XD230908001785\n" +
+                "XD230908002530\n" +
+                "XD230908002620\n" +
+                "XD230908002271\n" +
+                "XD230908001122\n" +
+                "XD230908002493\n" +
+                "XD230909000423\n" +
+                "XD230908002261\n" +
+                "XD230908002528\n" +
+                "XD230908001166\n" +
+                "XD230908002240\n" +
+                "XD230908002775\n" +
+                "XD230907001997\n" +
+                "XD230908001761\n" +
+                "XD230909000391\n" +
+                "XD230908002871\n" +
+                "XD230908001003\n" +
+                "XD230908002185\n" +
+                "XD230908001240\n" +
+                "XD230908001145\n" +
+                "XD230908001893\n" +
+                "XD230908002473\n" +
+                "XD230908002638\n" +
+                "XD230908002288\n" +
+                "XD230908002163\n" +
+                "XD230908002671\n" +
+                "XD230909000429\n" +
+                "XD230908002573\n" +
+                "XD230908001634\n" +
+                "XD230908001282\n" +
+                "XD230908001748\n" +
+                "XD230908001287\n" +
+                "XD230908001485\n" +
+                "XD230908002013\n" +
+                "XD230909000401\n" +
+                "XD230908002484\n" +
+                "XD230908002566\n" +
+                "XD230908002491\n" +
+                "XD230908001408\n" +
+                "XD230909000340\n" +
+                "XD230908001431\n" +
+                "XD230908001721\n" +
+                "XD230908002672\n" +
+                "XD230908001083\n" +
+                "XD230908001998\n" +
+                "XD230909000046\n" +
+                "XD230908001670\n" +
+                "XD230908002538\n" +
+                "XD230908003071\n" +
+                "XD230908002012\n" +
+                "XD230908003061\n" +
+                "XD230908003064\n" +
+                "XD230908001052\n" +
+                "XD230909000117\n" +
+                "XD230908002632\n" +
+                "XD230908002131\n" +
+                "XD230908001961\n" +
+                "XD230908001477\n" +
+                "XD230909000241\n" +
+                "XD230908001256\n" +
+                "XD230908001382\n" +
+                "XD230908002874\n" +
+                "XD230908001474\n" +
+                "XD230908001911\n" +
+                "XD230908001573\n" +
+                "XD230909000221\n" +
+                "XD230908002558\n" +
+                "XD230908002359\n" +
+                "XD230908001380\n" +
+                "XD230909000063\n" +
+                "XD230908001126\n" +
+                "XD230908001694\n" +
+                "XD230908002379\n" +
+                "XD230908002162\n" +
+                "XD230908001149\n" +
+                "XD230909000092\n" +
+                "XD230908002263\n" +
+                "XD230908002304\n" +
+                "XD230908002455\n" +
+                "XD230908002282\n" +
+                "XD230908002526\n" +
+                "XD230908002350\n" +
+                "XD230908001076\n" +
+                "XD230908002947\n" +
+                "XD230908002961\n" +
+                "XD230908001557\n" +
+                "XD230908002121\n" +
+                "XD230908001626\n" +
+                "XD230908001515\n" +
+                "XD230908002116\n" +
+                "XD230907002536\n" +
+                "XD230908002549\n" +
+                "XD230907003091\n" +
+                "XD230908002851\n" +
+                "XD230909000110\n" +
+                "XD230908001815\n" +
+                "XD230908002478\n" +
+                "XD230908001522\n" +
+                "XD230909000329\n" +
+                "XD230908002043\n" +
+                "XD230908002092\n" +
+                "XD230908001214\n" +
+                "XD230908001794";
 
         OrderSelectDto orderSelectDto = new OrderSelectDto();
         orderSelectDto.setPageNum(1);
         orderSelectDto.setPageSize(999999999);
-        orderSelectDto.setDepartmentId(1689164611148677121L);
+        orderSelectDto.setDepartmentId(1689164627162529793L);
+        orderSelectDto.setStatus(20);
         orderSelectDto.setException(0);
         Page<OrderInfoVo> page = orderController.page(orderSelectDto);
         List<OrderInfoVo> records = page.getRecords();

+ 37 - 0
sd-starter/src/test/java/E1_OrderOutCompare.java

@@ -0,0 +1,37 @@
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.sd.SdApplication;
+import com.sd.business.entity.order.dto.OrderSelectDto;
+import com.sd.business.service.outbound.OutboundOrderService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = SdApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class E1_OrderOutCompare {
+
+    @Autowired
+    private OutboundOrderService outboundOrderService;
+
+    /**
+     * 订单对比
+     */
+    @DSTransactional
+    @Test
+    public void test() {
+        OrderSelectDto orderSelectDto = new OrderSelectDto();
+        orderSelectDto.setDepartmentId(1689164611148677121L);
+        orderSelectDto.setException(0);
+        orderSelectDto.setStatus(30);
+
+        List<String> list = outboundOrderService.orderDeliveryComparison(orderSelectDto);
+        list.forEach(System.out::println);
+
+    }
+
+
+}

+ 11 - 0
sd-starter/src/test/java/TestList.java

@@ -1,7 +1,9 @@
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.sd.SdApplication;
 import com.sd.business.entity.production.dto.StockPreparationDto;
 import com.sd.business.entity.production.vo.UncompletedVo;
 import com.sd.business.service.production.StockPreparationService;
+import com.sd.wln.service.WlnStatementOfAccount;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +19,15 @@ public class TestList {
     @Autowired
     private StockPreparationService stockPreparationService;
 
+    @Autowired
+    private WlnStatementOfAccount wlnStatementOfAccount;
+
+    @DSTransactional
+    @Test
+    public void test2() {
+        wlnStatementOfAccount.createStatementOfAccount();
+    }
+
     @Test
     public void test() {
         StockPreparationDto stockPreparationDto = new StockPreparationDto();

+ 59 - 57
sd-wln/src/main/java/com/sd/wln/service/impl/WlnStatementOfAccountImpl.java

@@ -1,10 +1,8 @@
 package com.sd.wln.service.impl;
 
 import cn.hutool.core.convert.Convert;
-import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.ruoyi.common.core.domain.BasePo;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.outbound.po.OutboundOrder;
@@ -12,7 +10,6 @@ import com.sd.business.entity.statement.po.StatementOfAccount;
 import com.sd.business.service.order.OrderService;
 import com.sd.business.service.outbound.OutboundOrderService;
 import com.sd.business.service.statement.StatementOfAccountService;
-import com.sd.business.util.CodeEnum;
 import com.sd.wln.service.WlnStatementOfAccount;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -36,74 +33,79 @@ public class WlnStatementOfAccountImpl implements WlnStatementOfAccount {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void createStatementOfAccount() {
-        Date date = new Date();
-        DateTime beginDay = DateUtil.beginOfDay(date);
-        DateTime endDay = DateUtil.endOfDay(date);
 
         List<StatementOfAccount> saveStatementOfAccountList = new ArrayList<>();
         List<OrderInfo> editOrderInfoList = new ArrayList<>();
 
-        // 获取当天出库单
-        List<OutboundOrder> list = outboundOrderService.list(q -> q.between(BasePo::getCreateTime, beginDay, endDay));
-
-        if (list.size() == 0) {
+        // 获取没绑定对账单的订单
+        List<OrderInfo> orderList = orderService.list(q -> q
+                .ge(OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey())
+                .isNotNull(OrderInfo::getWlnCode)
+                .isNull(OrderInfo::getStatementOfAccountId));
+        if (orderList.size() == 0) {
             return;
         }
 
-        // 根据出库单查询订单
-        Map<String, Date> map = list.stream().collect(
-                Collectors.toMap(OutboundOrder::getOrderWlnCode, OutboundOrder::getOutboundTime, (t1, t2) -> t1));
+        // 订单万里牛编号集合
+        List<String> wlnCodeList = orderList.stream().map(OrderInfo::getWlnCode).collect(Collectors.toList());
 
-        // 查询与出库单关联的订单
-        List<OrderInfo> orderList = orderService.list(q -> q
-                .in(OrderInfo::getWlnCode, map.keySet())
-                .ge(OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey())
-                .isNull(OrderInfo::getStatementOfAccountId)
-        );
-
-        if (orderList.size() == 0) {
+        // 根据万里牛编号查询出库记录
+        List<OutboundOrder> outboundOrderList = outboundOrderService.list(q -> q.in(OutboundOrder::getOrderWlnCode, wlnCodeList));
+        if (outboundOrderList.size() == 0) {
             return;
         }
 
+        // 订单编号以及出库时间
+        Map<String, Date> map = outboundOrderList.stream().collect(
+                Collectors.toMap(OutboundOrder::getOrderWlnCode, OutboundOrder::getOutboundTime, (t1, t2) -> t1));
+
         // 生成对账单
-        Map<Long, StatementOfAccount> statementOfAccountMap = statementOfAccountService.mapKEntity(
-                StatementOfAccount::getDepartmentId,
-                q -> q.eq(StatementOfAccount::getType, 2).between(BasePo::getCreateTime, beginDay, endDay));
-
-        Map<String, String> codeMap = new HashMap<>(1);
-        Map<Long, List<OrderInfo>> orderByDepartmentIdMap = orderList.stream().collect(Collectors.groupingBy(OrderInfo::getDepartmentId));
-        orderByDepartmentIdMap.forEach((departmentId, tempOrderList) -> {
-
-            StatementOfAccount statementOfAccount = statementOfAccountMap.computeIfAbsent(departmentId, item -> {
-                String code = codeMap.get("code");
-                if (code == null) {
-                    codeMap.put("code", CodeEnum.STATEMENT_OF_ACCOUNT_CODE.getCode());
-                } else {
-                    int number = Convert.toInt(code.substring(code.length() - 6));
-                    codeMap.put("code", code.substring(0, code.length() - 6) + String.format("%06d", number + 1));
-                }
-                StatementOfAccount tempStatementOfAccount = new StatementOfAccount();
-                tempStatementOfAccount.setId(IdWorker.getId());
-                tempStatementOfAccount.setCode(codeMap.get("code"));
-                tempStatementOfAccount.setDepartmentId(departmentId);
-                tempStatementOfAccount.setTimePeriod(date);
-                tempStatementOfAccount.setType(2);
-                saveStatementOfAccountList.add(tempStatementOfAccount);
-                return tempStatementOfAccount;
-            });
-
-            for (OrderInfo order : tempOrderList) {
-                OrderInfo editOrderInfo = new OrderInfo();
-                editOrderInfo.setId(order.getId());
-                editOrderInfo.setStatementOfAccountId(statementOfAccount.getId());
-                if (order.getStatus().equals(OrderStatusEnum.IN_PRODUCTION.getKey())) {
-                    editOrderInfo.setStatus(OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
-                    editOrderInfo.setShippingTime(map.get(order.getWlnCode()));
-                }
-                editOrderInfoList.add(editOrderInfo);
+        Map<String, List<StatementOfAccount>> statementOfAccountMap = new HashMap<>();
+
+        for (OrderInfo order : orderList) {
+
+            Date date = map.get(order.getWlnCode());
+            if (date == null) {
+                continue;
             }
 
-        });
+            String outDate = DateUtil.format(date, "yyMMdd");
+            Date timePeriod = DateUtil.parse(DateUtil.format(date, "yyyy-MM-dd 19:00:00"));
+            Date beginDate = DateUtil.beginOfDay(date);
+            Date endDate = DateUtil.endOfDay(date);
+
+            List<StatementOfAccount> statementOfAccountList = statementOfAccountMap.computeIfAbsent(outDate, item ->
+                    statementOfAccountService.list(q -> q.between(StatementOfAccount::getTimePeriod, beginDate, endDate)));
+
+            StatementOfAccount statementOfAccount = statementOfAccountList.stream()
+                    .filter(item -> Objects.equals(item.getType(), 2))
+                    .filter(item -> Objects.equals(item.getDepartmentId(), order.getDepartmentId()))
+                    .findFirst().orElse(null);
+
+            if (statementOfAccount == null) {
+                int codeNumber = statementOfAccountList.stream()
+                        .mapToInt(item -> Convert.toInt(item.getCode().split("-")[2]))
+                        .max().orElse(0);
+
+                statementOfAccount = new StatementOfAccount();
+                statementOfAccount.setId(IdWorker.getId());
+                statementOfAccount.setCode("SOA-" + outDate + "-" + (codeNumber + 1));
+                statementOfAccount.setDepartmentId(order.getDepartmentId());
+                statementOfAccount.setTimePeriod(timePeriod);
+                statementOfAccount.setType(2);
+                statementOfAccountList.add(statementOfAccount);
+                saveStatementOfAccountList.add(statementOfAccount);
+            }
+
+            OrderInfo editOrderInfo = new OrderInfo();
+            editOrderInfo.setId(order.getId());
+            editOrderInfo.setStatementOfAccountId(statementOfAccount.getId());
+            if (order.getStatus().equals(OrderStatusEnum.IN_PRODUCTION.getKey())) {
+                editOrderInfo.setStatus(OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+                editOrderInfo.setShippingTime(map.get(order.getWlnCode()));
+            }
+            editOrderInfoList.add(editOrderInfo);
+        }
 
         orderService.updateBatchById(editOrderInfoList);