Browse Source

新增E10出入库数据导出功能

fgd 1 year ago
parent
commit
5684fcfb73
19 changed files with 816 additions and 2 deletions
  1. 8 0
      sd-business/src/main/java/com/sd/business/controller/in/InOutStorageBomController.java
  2. 13 0
      sd-business/src/main/java/com/sd/business/controller/inventory/InventoryFinishedOrderController.java
  3. 68 0
      sd-business/src/main/java/com/sd/business/controller/outbound/OutboundOrderController.java
  4. 70 0
      sd-business/src/main/java/com/sd/business/entity/in/vo/InOutStorageBomErpExportVo.java
  5. 52 0
      sd-business/src/main/java/com/sd/business/entity/in/vo/InOutStorageErpExportVo.java
  6. 45 0
      sd-business/src/main/java/com/sd/business/entity/inventory/dto/InventoryFinishedErpImportDataDto.java
  7. 17 0
      sd-business/src/main/java/com/sd/business/entity/outbound/dto/OutboundOrderDto.java
  8. 17 0
      sd-business/src/main/java/com/sd/business/entity/outbound/dto/OutboundOrderSelectDto.java
  9. 69 0
      sd-business/src/main/java/com/sd/business/entity/outbound/po/OutboundOrder.java
  10. 17 0
      sd-business/src/main/java/com/sd/business/entity/outbound/vo/OutboundOrderVo.java
  11. 16 0
      sd-business/src/main/java/com/sd/business/mapper/outbound/OutboundOrderMapper.java
  12. 5 0
      sd-business/src/main/java/com/sd/business/service/in/InOutStorageBomService.java
  13. 127 1
      sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageBomServiceImpl.java
  14. 6 0
      sd-business/src/main/java/com/sd/business/service/inventory/InventoryFinishedOrderService.java
  15. 167 1
      sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryFinishedOrderServiceImpl.java
  16. 46 0
      sd-business/src/main/java/com/sd/business/service/outbound/OutboundOrderService.java
  17. 68 0
      sd-business/src/main/java/com/sd/business/service/outbound/impl/OutboundOrderServiceImpl.java
  18. 5 0
      sd-business/src/main/resources/mapper/outbound/OutboundOrderMapper.xml
  19. BIN
      sd-starter/src/main/resources/template/inOutStorageDetails.xlsx

+ 8 - 0
sd-business/src/main/java/com/sd/business/controller/in/InOutStorageBomController.java

@@ -51,4 +51,12 @@ public class InOutStorageBomController {
         ExcelUtil.export(response, "出入库流水表", "导出数据", exportList, InOutStorageBomExportVo.class);
     }
 
+    /**
+     * 出入库bom导出E10
+     */
+    @PostMapping("/exportErpExcel")
+    public void exportErpExcel(@RequestBody InOutStorageBomSelectDto dto) {
+        inOutStorageBomService.exportErpExcel(dto);
+    }
+
 }

+ 13 - 0
sd-business/src/main/java/com/sd/business/controller/inventory/InventoryFinishedOrderController.java

@@ -2,15 +2,20 @@ package com.sd.business.controller.inventory;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.inventory.dto.InventoryFinishedErpImportDataDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
 import com.sd.business.entity.inventory.vo.InventoryFinishedOrderVo;
 import com.sd.business.service.inventory.InventoryFinishedOrderService;
+import com.sd.framework.util.excel.util.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 
 /**
@@ -68,4 +73,12 @@ public class InventoryFinishedOrderController {
         inventoryFinishedOrderService.delete(dto.getId());
     }
 
+    /**
+     * 成品仓明细E10模板导出
+     */
+    @PostMapping("/excelErpExport")
+    public void excelErpExport(MultipartFile file) {
+        List<InventoryFinishedErpImportDataDto> list = ExcelUtil.read(file, 0, InventoryFinishedErpImportDataDto.class);
+        inventoryFinishedOrderService.excelErpExport(list);
+    }
 }

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

@@ -0,0 +1,68 @@
+package com.sd.business.controller.outbound;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.outbound.vo.OutboundOrderVo;
+import com.sd.business.entity.outbound.dto.OutboundOrderSelectDto;
+import com.sd.business.entity.outbound.dto.OutboundOrderDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.service.outbound.OutboundOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 出库单 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+@RestController
+@RequestMapping("/outboundOrder")
+public class OutboundOrderController {
+
+    @Autowired
+    private OutboundOrderService outboundOrderService;
+
+    /**
+     * 出库单分页
+     */
+    @PostMapping("/page")
+    public Page<OutboundOrderVo> page(@RequestBody OutboundOrderSelectDto dto) {
+        return outboundOrderService.getPage(dto);
+    }
+
+    /**
+     * 出库单明细
+     */
+    @PostMapping("/detail")
+    public OutboundOrderVo detail(@RequestBody BaseSelectDto dto) {
+        return outboundOrderService.detail(dto.getId());
+    }
+
+    /**
+     * 出库单新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody OutboundOrderDto dto) {
+        outboundOrderService.add(dto);
+    }
+
+    /**
+     * 出库单编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody OutboundOrderDto dto) {
+        outboundOrderService.edit(dto);
+    }
+
+    /**
+     * 出库单删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        outboundOrderService.delete(dto.getId());
+    }
+
+}

+ 70 - 0
sd-business/src/main/java/com/sd/business/entity/in/vo/InOutStorageBomErpExportVo.java

@@ -0,0 +1,70 @@
+package com.sd.business.entity.in.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 出入库bom信息 erp导出实体
+ *
+ * @author
+ * @since 2023-10-23
+ */
+@Getter
+@Setter
+public class InOutStorageBomErpExportVo {
+
+    /**
+     * 单号
+     */
+    private String code;
+
+    /**
+     * 序号
+     */
+    private String serialNumber;
+
+    /**
+     * 产品规格品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 特征码
+     */
+    private String featureCode;
+
+    /**
+     * 业务单位
+     */
+    private String pieces;
+
+    /**
+     * 业务单位
+     */
+    private String unit;
+
+    /**
+     * 数量
+     */
+    private String quantity;
+
+    /**
+     * 仓库编号
+     */
+    private String warehouseCode;
+
+    /**
+     * 来源单据RTK
+     */
+    private String sourceRtk;
+
+    /**
+     * 单位成本
+     */
+    private String unitCost;
+
+    /**
+     * 成本金额
+     */
+    private String costAmt;
+}

+ 52 - 0
sd-business/src/main/java/com/sd/business/entity/in/vo/InOutStorageErpExportVo.java

@@ -0,0 +1,52 @@
+package com.sd.business.entity.in.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+
+/**
+ * 出入库信息 erp导出实体
+ *
+ * @author
+ * @since 2023-10-23
+ */
+@Getter
+@Setter
+public class InOutStorageErpExportVo {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 工厂编号
+     */
+    private String plantCode;
+
+    /**
+     * 单号
+     */
+    private String code;
+
+    /**
+     * 单据日期
+     */
+    private String createTime;
+
+    /**
+     * 单据类型
+     */
+    private String docCode;
+
+    /**
+     * 部门编号
+     */
+    private String deptCode;
+
+    /**
+     * 员工编号
+     */
+    private String employeeCode;
+
+}

+ 45 - 0
sd-business/src/main/java/com/sd/business/entity/inventory/dto/InventoryFinishedErpImportDataDto.java

@@ -0,0 +1,45 @@
+package com.sd.business.entity.inventory.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 成品仓E10导入实体
+ *
+ * @author
+ * @since 2023-11-10
+ */
+@Getter
+@Setter
+public class InventoryFinishedErpImportDataDto {
+    /**
+     * SKU
+     */
+    @ExcelProperty(value = "SKU")
+    private String skuSpecCode;
+
+    /**
+     * 品号
+     */
+    @ExcelProperty(value = "品号")
+    private String skuSpecFinishedCode;
+
+    /**
+     * 特征码
+     */
+    @ExcelProperty(value = "特征码")
+    private String featureCode;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty(value = "业务数量")
+    private String quantity;
+
+    /**
+     * 万里牛出库单编号
+     */
+    @ExcelProperty(value = "万里牛出库单编号")
+    private String outboundOrderCode;
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/outbound/dto/OutboundOrderDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.outbound.dto;
+
+import com.sd.business.entity.outbound.po.OutboundOrder;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 出库单新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+@Getter
+@Setter
+public class OutboundOrderDto extends OutboundOrder {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/outbound/dto/OutboundOrderSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.outbound.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 出库单列表查询入参实体
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+@Getter
+@Setter
+public class OutboundOrderSelectDto extends BaseSelectDto {
+
+}

+ 69 - 0
sd-business/src/main/java/com/sd/business/entity/outbound/po/OutboundOrder.java

@@ -0,0 +1,69 @@
+package com.sd.business.entity.outbound.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 出库单
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+@Getter
+@Setter
+@TableName("outbound_order")
+public class OutboundOrder extends BasePo {
+
+    /**
+     * 出库单号
+     */
+    private String code;
+
+    /**
+     * 订单编号
+     */
+    private String orderCode;
+
+    /**
+     * 万里牛订单编号
+     */
+    private String orderWlnCode;
+
+    /**
+     * 万里牛sku规格编号
+     */
+    private String skuSpecCode;
+
+    /**
+     * 万里牛仓库编码
+     */
+    private String storageCode;
+
+    /**
+     * 出库数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 出库时间
+     */
+    private Date outboundTime;
+
+    /**
+     * 出库时间戳
+     */
+    private Long outboundTimestamp;
+
+    /**
+     * 物流单号
+     */
+    private String express;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/outbound/vo/OutboundOrderVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.outbound.vo;
+
+import com.sd.business.entity.outbound.po.OutboundOrder;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 出库单列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+@Getter
+@Setter
+public class OutboundOrderVo extends OutboundOrder {
+
+}

+ 16 - 0
sd-business/src/main/java/com/sd/business/mapper/outbound/OutboundOrderMapper.java

@@ -0,0 +1,16 @@
+package com.sd.business.mapper.outbound;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.outbound.po.OutboundOrder;
+
+/**
+ * <p>
+ * 出库单 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+public interface OutboundOrderMapper extends BaseMapper<OutboundOrder> {
+
+}

+ 5 - 0
sd-business/src/main/java/com/sd/business/service/in/InOutStorageBomService.java

@@ -22,4 +22,9 @@ public interface InOutStorageBomService extends BaseService<InOutStorageBom> {
      */
     Page<InOutStorageBomVo> getPage(InOutStorageBomSelectDto dto);
 
+    /**
+     * 出入库bom导出E10
+     * @param dto
+     */
+    void exportErpExcel(InOutStorageBomSelectDto dto);
 }

+ 127 - 1
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageBomServiceImpl.java

@@ -1,21 +1,37 @@
 package com.sd.business.service.in.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.po.Department;
 import com.sd.business.entity.in.dto.InOutStorageBomSelectDto;
+import com.sd.business.entity.in.emums.InDetailTypeEnum;
+import com.sd.business.entity.in.emums.InOutTypeEnum;
+import com.sd.business.entity.in.emums.OutDetailTypeEnum;
 import com.sd.business.entity.in.po.InOutStorage;
 import com.sd.business.entity.in.po.InOutStorageBom;
 import com.sd.business.entity.in.vo.InOutStorageBomVo;
+import com.sd.business.entity.in.vo.InOutStorageBomErpExportVo;
+import com.sd.business.entity.in.vo.InOutStorageErpExportVo;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.warehouse.po.Warehouse;
 import com.sd.business.mapper.in.InOutStorageBomMapper;
 import com.sd.business.service.in.InOutStorageBomService;
+import com.sd.business.service.in.InOutStorageService;
+import com.sd.framework.util.TemplateExcelUtil;
 import com.sd.framework.util.sql.Sql;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static java.util.Comparator.comparing;
 
 
 /**
@@ -29,6 +45,12 @@ import java.util.List;
 @Service
 public class InOutStorageBomServiceImpl extends ServiceImpl<InOutStorageBomMapper, InOutStorageBom> implements InOutStorageBomService {
 
+    @Autowired
+    private InOutStorageService inOutStorageService;
+
+    @Autowired
+    private HttpServletResponse response;
+
     @Override
     public Page<InOutStorageBomVo> getPage(InOutStorageBomSelectDto dto) {
 
@@ -85,4 +107,108 @@ public class InOutStorageBomServiceImpl extends ServiceImpl<InOutStorageBomMappe
         return page;
     }
 
+    @Override
+    public void exportErpExcel(InOutStorageBomSelectDto dto) {
+        dto.setSearchAll(true);
+        Page<InOutStorageBomVo> page = this.getPage(dto);
+        List<InOutStorageBomVo> list = page.getRecords();
+        List<InOutStorageBomVo> inOutStorageBomList = list.stream()
+                .filter(item -> {
+                    if (!(ObjectUtil.equals(item.getWarehouseCode(), "509")
+                            || ObjectUtil.equals(item.getWarehouseCode(),"503"))) {
+                        return false;
+                    }
+                    if (dto.getDetailType() != null) {
+                        return true;
+                    }
+                    // 数据筛选,出库导出生产出库,入库导出退货和归还
+                    if (ObjectUtil.equals(dto.getType(), InOutTypeEnum.IN.getKey())
+                            && (ObjectUtil.equals(item.getDetailType(), InDetailTypeEnum.RETURN_GOODS.getKey())
+                            || ObjectUtil.equals(item.getDetailType(), InDetailTypeEnum.GIVE_BACK.getKey()))) {
+                        return true;
+                    } else if (ObjectUtil.equals(dto.getType(), InOutTypeEnum.OUT.getKey())
+                            && ObjectUtil.equals(item.getDetailType(), OutDetailTypeEnum.PRODUCTION.getKey())) {
+                        return true;
+                    }
+                    return false;
+                })
+                .collect(Collectors.toList());
+        // 查询详情信息
+        Set<Long> inOutStorageIds = inOutStorageBomList.stream().map(InOutStorageBom::getInOutStorageId).collect(Collectors.toSet());
+        if (ObjectUtil.isEmpty(inOutStorageIds)) {
+            inOutStorageIds.add(-1L);
+        }
+        List<InOutStorage> inOutStorageList = inOutStorageService.list(q -> q
+                .in(BaseIdPo::getId, inOutStorageIds)
+                .orderByAsc(InOutStorage::getInOutStorageTime));
+
+        List<InOutStorageErpExportVo> inOutStorageErpExportVoList = new ArrayList<>();
+        String dateFormat = "";
+        for (InOutStorage inOutStorage : inOutStorageList) {
+            InOutStorageErpExportVo inOutStorageErpExportVo = new InOutStorageErpExportVo();
+            inOutStorageErpExportVo.setId(inOutStorage.getId());
+            inOutStorageErpExportVo.setPlantCode("SDTY");
+            if (Objects.equals(inOutStorage.getType(), InOutTypeEnum.OUT.getKey())) {
+                inOutStorageErpExportVo.setDocCode("T118");
+            } else {
+                inOutStorageErpExportVo.setDocCode("T119");
+            }
+            // 获取单号 系统单号 XX-yyMMdd-000001
+            String[] codes = inOutStorage.getCode().split("-");
+            String substring = codes[1].substring(0, codes[1].length() - 2);
+            String format = "-20" + substring;
+            if (!Objects.equals(dateFormat, format)) {
+                dateFormat = format;
+            }
+            // 后四位生成规则,取系统单号 dd01
+            int codeNum = Integer.parseInt(codes[1].substring(codes[1].length() - 2) + codes[2].substring(codes[2].length() - 2));
+            String code = inOutStorageErpExportVo.getDocCode() + format + String.format("%04d", codeNum);
+            inOutStorageErpExportVo.setCode(code);
+            inOutStorageErpExportVo.setCreateTime(DateUtil.format(inOutStorage.getInOutStorageTime(), "yyyy/MM/dd HH:mm:ss"));
+            inOutStorageErpExportVo.setDeptCode("STWH");
+            inOutStorageErpExportVo.setEmployeeCode("SKWH002");
+
+            inOutStorageErpExportVoList.add(inOutStorageErpExportVo);
+        }
+
+        Map<Long, String> map = inOutStorageErpExportVoList.stream()
+                .collect(Collectors.toMap(InOutStorageErpExportVo::getId, InOutStorageErpExportVo::getCode));
+        Map<String, Integer> serialNumberMap = new HashMap<>();
+        List<InOutStorageBomErpExportVo> inOutStorageBomErpExportVoList = inOutStorageBomList.stream()
+                .map(item -> {
+                    InOutStorageBomErpExportVo inOutStorageBomErpExportVo = new InOutStorageBomErpExportVo();
+                    inOutStorageBomErpExportVo.setCode(map.get(item.getInOutStorageId()));
+                    inOutStorageBomErpExportVo.setBomSpecCode(item.getBomSpecCode());
+                    inOutStorageBomErpExportVo.setQuantity(item.getQuantity().toPlainString());
+                    inOutStorageBomErpExportVo.setWarehouseCode(item.getWarehouseCode());
+                    inOutStorageBomErpExportVo.setUnit("PCS");
+                    inOutStorageBomErpExportVo.setPieces("0");
+                    inOutStorageBomErpExportVo.setSourceRtk("OTHER");
+                    if (item.getUnitPrice() == null) {
+                        item.setUnitPrice(BigDecimal.ZERO);
+                    }
+                    inOutStorageBomErpExportVo.setUnitCost(item.getUnitPrice().toPlainString());
+                    inOutStorageBomErpExportVo.setCostAmt(item.getUnitPrice().multiply(item.getQuantity()).toPlainString());
+                    return inOutStorageBomErpExportVo;
+                })
+                .sorted(comparing(InOutStorageBomErpExportVo::getCode))
+                .peek(item -> {
+                    Integer serialNumber = serialNumberMap.get(item.getCode());
+                    if (serialNumber == null) {
+                        serialNumber = 1;
+                        serialNumberMap.put(item.getCode(), serialNumber);
+                    } else {
+                        serialNumberMap.put(item.getCode(), serialNumber+=1);
+                    }
+                    item.setSerialNumber(serialNumber.toString());
+                }).collect(Collectors.toList());
+        String fileName;
+        if (Objects.equals(dto.getType(), 1)) {
+            fileName = "入库单";
+        } else {
+            fileName = "出库单";
+        }
+        TemplateExcelUtil.writeBrowserMultiSheet("inOutStorageDetails.xlsx", 2, fileName, response, inOutStorageErpExportVoList, inOutStorageBomErpExportVoList);
+    }
+
 }

+ 6 - 0
sd-business/src/main/java/com/sd/business/service/inventory/InventoryFinishedOrderService.java

@@ -2,6 +2,7 @@ package com.sd.business.service.inventory;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.inventory.dto.InventoryFinishedErpImportDataDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
 import com.sd.business.entity.inventory.po.InventoryFinishedOrder;
@@ -60,4 +61,9 @@ public interface InventoryFinishedOrderService extends BaseService<InventoryFini
      */
     void removeByOrderId(Long orderId);
 
+    /**
+     * 成品仓明细E10模板导出
+     * @param list
+     */
+    void excelErpExport(List<InventoryFinishedErpImportDataDto> list);
 }

+ 167 - 1
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryFinishedOrderServiceImpl.java

@@ -1,31 +1,48 @@
 package com.sd.business.service.inventory.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.sd.business.entity.department.constant.DepartmentConstant;
 import com.sd.business.entity.department.po.Department;
+import com.sd.business.entity.in.vo.InOutStorageBomErpExportVo;
+import com.sd.business.entity.in.vo.InOutStorageErpExportVo;
+import com.sd.business.entity.inventory.dto.InventoryFinishedErpImportDataDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderDto;
 import com.sd.business.entity.inventory.dto.InventoryFinishedOrderSelectDto;
 import com.sd.business.entity.inventory.enums.FinishedOperationTypeEnum;
 import com.sd.business.entity.inventory.po.InventoryFinishedOrder;
 import com.sd.business.entity.inventory.po.InventoryFinishedOrderDetail;
 import com.sd.business.entity.inventory.vo.InventoryFinishedOrderVo;
+import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.outbound.po.OutboundOrder;
 import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.mapper.inventory.InventoryFinishedOrderMapper;
 import com.sd.business.service.inventory.InventoryFinishedOrderDetailService;
 import com.sd.business.service.inventory.InventoryFinishedOrderService;
+import com.sd.business.service.order.OrderInfoService;
+import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.outbound.OutboundOrderService;
+import com.sd.business.service.sku.SkuSpecService;
 import com.sd.framework.util.Assert;
+import com.sd.framework.util.TemplateExcelUtil;
 import com.sd.framework.util.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static java.util.Comparator.comparing;
+
 
 /**
  * <p>
@@ -41,6 +58,21 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
     @Autowired
     private InventoryFinishedOrderDetailService inventoryFinishedOrderDetailService;
 
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
+    private OutboundOrderService outboundOrderService;
+
+    @Autowired
+    private HttpServletResponse response;
+
     @Override
     public Page<InventoryFinishedOrderVo> getPage(InventoryFinishedOrderSelectDto dto) {
 
@@ -128,4 +160,138 @@ public class InventoryFinishedOrderServiceImpl extends ServiceImpl<InventoryFini
         inventoryFinishedOrderDetailService.remove(q -> q.eq(InventoryFinishedOrderDetail::getOrderInfoId, orderId));
     }
 
+    @Override
+    public void excelErpExport(List<InventoryFinishedErpImportDataDto> list) {
+        List<String> outboundOrderCodes = list.stream().map(InventoryFinishedErpImportDataDto::getOutboundOrderCode).collect(Collectors.toList());
+        Map<String, OutboundOrder> outboundOrderMap = outboundOrderService.mapKEntity(
+                OutboundOrder::getCode,
+                q -> q.in(OutboundOrder::getCode, outboundOrderCodes));
+
+        List<String> wlnCodes = outboundOrderMap.values().stream().map(OutboundOrder::getOrderWlnCode).collect(Collectors.toList());
+        if (wlnCodes.isEmpty()) {
+            wlnCodes.add("-1");
+        }
+
+        Map<String, OrderInfo> orderInfoMap = orderInfoService.mapKEntity(
+                OrderInfo::getWlnCode,
+                q -> q.in(OrderInfo::getWlnCode, wlnCodes)
+                        .eq(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey()));
+
+        List<Long> orderIds = orderInfoMap.values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        if (orderIds.isEmpty()) {
+            orderIds.add(-1L);
+        }
+
+        Map<Long, List<InventoryFinishedOrderDetail>> inventoryFinishedOrderMap = inventoryFinishedOrderDetailService.mapKGroup(
+                InventoryFinishedOrderDetail::getOrderInfoId,
+                q -> q.eq(InventoryFinishedOrderDetail::getOperationType, 1)
+                        .in(InventoryFinishedOrderDetail::getOrderInfoId, orderIds));
+        Map<Long, OrderSku> orderSkuMap = orderSkuService.mapKEntity(BaseIdPo::getId, q -> q.in(OrderSku::getOrderId, orderIds));
+
+        List<InOutStorageErpExportVo> inOutStorageErpExportVoList = new ArrayList<>();
+        Map<Long, String> codeMap = new HashMap<>();
+        // 生成入库单
+        for (OutboundOrder outboundOrder : outboundOrderMap.values()) {
+            Date outboundTime = outboundOrder.getOutboundTime();
+            int num;
+            if (Objects.equals("T007", outboundOrder.getStorageCode())) {
+                num = 33;
+            } else {
+                num = 66;
+            }
+            Long format = Long.parseLong(DateUtil.format(outboundTime, num + "MMddHH"));
+            if (codeMap.get(format) != null) {
+                continue;
+            }
+
+            InOutStorageErpExportVo inOutStorageErpExportVo = new InOutStorageErpExportVo();
+            inOutStorageErpExportVo.setId(format);
+            inOutStorageErpExportVo.setPlantCode("SDTY");
+            inOutStorageErpExportVo.setDocCode("T119");
+
+            // 生成单号,后四位生成规则,取系统单号 dd01
+            // 生成e10入库单号后四位,当前天数+num 防止与bom入库导出单号重复
+            int day = DateUtil.dayOfMonth(outboundTime);
+            int hour = DateUtil.hour(outboundTime, true);
+            int codeNum = Integer.parseInt((day + num) + String.format("%02d", hour));
+            String code = inOutStorageErpExportVo.getDocCode() + DateUtil.format(outboundTime, "-yyyyMM") + String.format("%04d", codeNum);
+            inOutStorageErpExportVo.setCode(code);
+            inOutStorageErpExportVo.setCreateTime(DateUtil.format(outboundTime, "yyyy/MM/dd HH:mm:ss"));
+            inOutStorageErpExportVo.setDeptCode("STWH");
+            inOutStorageErpExportVo.setEmployeeCode("SKWH002");
+
+            codeMap.put(inOutStorageErpExportVo.getId(), code);
+            inOutStorageErpExportVoList.add(inOutStorageErpExportVo);
+        }
+        inOutStorageErpExportVoList.sort(comparing(InOutStorageErpExportVo::getCode));
+
+        Map<String, Integer> serialNumberMap = new HashMap<>();
+        List<String> skuSpecCodes = list.stream().map(InventoryFinishedErpImportDataDto::getSkuSpecCode).collect(Collectors.toList());
+        Map<String, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getCode, q -> q.in(SkuSpec::getCode, skuSpecCodes));
+
+        // 生成明细
+        List<InOutStorageBomErpExportVo> inOutStorageBomErpExportVoList = list.stream()
+                .map(item -> {
+                    if (!NumberUtil.isNumber(item.getQuantity())) {
+                        item.setQuantity("0");
+                    }
+                    InOutStorageBomErpExportVo inOutStorageBomErpExportVo = new InOutStorageBomErpExportVo();
+                    inOutStorageBomErpExportVo.setBomSpecCode(item.getSkuSpecFinishedCode());
+                    inOutStorageBomErpExportVo.setFeatureCode(item.getFeatureCode());
+                    inOutStorageBomErpExportVo.setQuantity(item.getQuantity());
+                    inOutStorageBomErpExportVo.setWarehouseCode("501");
+                    inOutStorageBomErpExportVo.setUnit("PCS");
+                    inOutStorageBomErpExportVo.setPieces("0");
+                    inOutStorageBomErpExportVo.setSourceRtk("OTHER");
+
+                    OutboundOrder outboundOrder = outboundOrderMap.get(item.getOutboundOrderCode());
+                    SkuSpec skuSpec = skuSpecMap.get(item.getSkuSpecCode());
+                    if (outboundOrder == null || skuSpec == null) {
+                        return inOutStorageBomErpExportVo;
+                    }
+                    int num;
+                    if (Objects.equals("T007", outboundOrder.getStorageCode())) {
+                        num = 33;
+                    } else {
+                        num = 66;
+                    }
+                    inOutStorageBomErpExportVo.setCode(codeMap.get(Long.parseLong(DateUtil.format(outboundOrder.getOutboundTime(), num + "MMddHH"))));
+                    OrderInfo orderInfo = orderInfoMap.get(outboundOrder.getOrderWlnCode());
+                    if (orderInfo == null) {
+                        return inOutStorageBomErpExportVo;
+                    }
+                    List<InventoryFinishedOrderDetail> orderDetailList = inventoryFinishedOrderMap.getOrDefault(orderInfo.getId(), Collections.emptyList());
+                    InventoryFinishedOrderDetail detail = orderDetailList.stream()
+                            .filter(i -> Objects.equals(i.getSkuSpecId(), skuSpec.getId()))
+                            .findAny().orElse(null);
+                    if (detail == null) {
+                        return inOutStorageBomErpExportVo;
+                    }
+                    BigDecimal unitCost = BigDecimal.ZERO;
+                    OrderSku orderSku = orderSkuMap.get(detail.getOrderSkuId());
+                    if (orderSku != null) {
+                        unitCost = orderSku.getUnitPrice()
+                                .add(orderSku.getDeliveryMaterialsFee())
+                                .add(orderSku.getPackagingMaterialCost());
+                    }
+                    inOutStorageBomErpExportVo.setUnitCost(unitCost.toPlainString());
+                    inOutStorageBomErpExportVo.setCostAmt(unitCost.multiply(new BigDecimal(item.getQuantity())).toPlainString());
+                    return inOutStorageBomErpExportVo;
+                })
+                .sorted(comparing(InOutStorageBomErpExportVo::getCode, Comparator.nullsFirst(String::compareTo)))
+                .peek(item -> {
+                    Integer serialNumber = serialNumberMap.get(item.getCode());
+                    if (serialNumber == null) {
+                        serialNumber = 1;
+                        serialNumberMap.put(item.getCode(), serialNumber);
+                    } else {
+                        serialNumberMap.put(item.getCode(), serialNumber+=1);
+                    }
+                    item.setSerialNumber(serialNumber.toString());
+                })
+                .collect(Collectors.toList());
+        String fileName = "成品入库单";
+        TemplateExcelUtil.writeBrowserMultiSheet("inOutStorageDetails.xlsx", 2, fileName, response, inOutStorageErpExportVoList, inOutStorageBomErpExportVoList);
+    }
+
 }

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

@@ -0,0 +1,46 @@
+package com.sd.business.service.outbound;
+
+import com.sd.business.entity.outbound.po.OutboundOrder;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.outbound.vo.OutboundOrderVo;
+import com.sd.business.entity.outbound.dto.OutboundOrderSelectDto;
+import com.sd.business.entity.outbound.dto.OutboundOrderDto;
+
+
+/**
+ * <p>
+ * 出库单 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+public interface OutboundOrderService extends BaseService<OutboundOrder> {
+
+    /**
+     * 出库单分页
+     */
+    Page<OutboundOrderVo> getPage(OutboundOrderSelectDto dto);
+
+    /**
+     * 出库单明细
+     */
+    OutboundOrderVo detail(Long id);
+
+    /**
+     * 出库单新增
+     */
+    void add(OutboundOrderDto dto);
+
+    /**
+     * 出库单编辑
+     */
+    void edit(OutboundOrderDto dto);
+
+    /**
+     * 出库单删除
+     */
+    void delete(Long id);
+
+}

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

@@ -0,0 +1,68 @@
+package com.sd.business.service.outbound.impl;
+
+import com.sd.business.entity.outbound.po.OutboundOrder;
+import com.sd.business.mapper.outbound.OutboundOrderMapper;
+import com.sd.business.service.outbound.OutboundOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.outbound.vo.OutboundOrderVo;
+import com.sd.business.entity.outbound.dto.OutboundOrderSelectDto;
+import com.sd.business.entity.outbound.dto.OutboundOrderDto;
+import com.sd.framework.util.sql.Sql;
+import com.sd.framework.util.Assert;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 出库单 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-15
+ */
+@Service
+public class OutboundOrderServiceImpl extends ServiceImpl<OutboundOrderMapper, OutboundOrder> implements OutboundOrderService {
+
+    @Override
+    public Page<OutboundOrderVo> getPage(OutboundOrderSelectDto dto) {
+
+        Page<OutboundOrderVo> page = Sql.create(OutboundOrderVo.class)
+                .selectAll(OutboundOrder.class)
+                .from(OutboundOrder.class)
+                .orderByDesc(OutboundOrder::getId)
+                .page(dto);
+
+        return page;
+    }
+
+    @Override
+    public OutboundOrderVo detail(Long id) {
+
+        OutboundOrderVo vo = Sql.create(OutboundOrderVo.class)
+                .selectAll(OutboundOrder.class)
+                .from(OutboundOrder.class)
+                .eq(OutboundOrder::getId, id)
+                .one();
+
+        Assert.notNull(vo, "未知数据");
+
+        return vo;
+    }
+
+    @Override
+    public void add(OutboundOrderDto dto) {
+        save(dto);
+    }
+
+    @Override
+    public void edit(OutboundOrderDto dto) {
+        updateById(dto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        removeById(id);
+    }
+
+}

+ 5 - 0
sd-business/src/main/resources/mapper/outbound/OutboundOrderMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.outbound.OutboundOrderMapper">
+
+</mapper>

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