zouyu
4 天以前 e1284aa3b1b400ecebb59126d7110a3bb4a6b000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package com.ruoyi.inspect.excel;
 
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
 
@Slf4j
public class OrderSplitExcelListener extends AnalysisEventListener<Map<Integer,Object>> {
 
    //表头模板
    private static final String HEAD_TEMPLATE = "[零件编号, 系统编号, 规格, 零件批号, 库存数量1, 库存数量2, 绝缘颜色, 外护颜色, 印字信息, 盘号, 库位编号, 库位来源, 备注]";
 
    AtomicInteger index = new AtomicInteger(0);//符合表格模板的行数
 
    @Getter
    List<OrderSplitExcelData> dataList = new ArrayList<>();//导入的数据列表
 
    IfsInventoryQuantity ifsInventoryQuantity;//对应报检ifs信息
 
    public String errorMsg = "";
 
    public OrderSplitExcelListener(IfsInventoryQuantity ifsInventoryQuantity) {
        this.ifsInventoryQuantity = ifsInventoryQuantity;
    }
 
    AtomicReference<String> prePartLotBatchNo = new AtomicReference<>("");//上一条数据的零件批号
 
    AtomicReference<BigDecimal> storeQty2Sum = new AtomicReference<>(BigDecimal.ZERO);//导入数据库存数量2的总和
 
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        String temp = headMap.values().toString();
        if(StringUtils.equals(HEAD_TEMPLATE,temp)){
            index.getAndIncrement();
        }
    }
 
    @Override
    public void invoke(Map<Integer,Object> mapData, AnalysisContext analysisContext) {
        Integer currentRowNum = analysisContext.getCurrentRowNum();
        OrderSplitExcelData data = transformExcelData(mapData, currentRowNum);
        if(Objects.nonNull(data)){
            dataList.add(data);
        }
    }
 
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if(index.get()==0){
            throw new RuntimeException("文件内容格式与模板不符");
        }
        if(storeQty2Sum.get().compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){
            throw new RuntimeException("库存数量2不能大于报检零件的抵达采购数量");
        }
    }
 
    /**
     * 校验数据
     * @param mapData
     * @param rowNumber
     */
    private void validateRowData(Map<Integer,Object> mapData,Integer rowNumber){
        String rowStr = "</br>第"+(rowNumber+1)+"行:";
        List<String> errorMsgList = new ArrayList<>();
        //零件编号
        if(Objects.isNull(mapData.get(0))){
            errorMsgList.add("零件编号不能为空");
        }else if(!StringUtils.equals(mapData.get(0).toString(),ifsInventoryQuantity.getPartNo())){
            errorMsgList.add("零件编号与报检零件不一致");
        }
        //零件批号
        if(Objects.isNull(mapData.get(3))){
            errorMsgList.add("零件批号不能为空");
        }else if(StringUtils.equals(mapData.get(3).toString(),ifsInventoryQuantity.getLotBatchNo())){
            errorMsgList.add("零件批号与报检零件批号相同");
        }else if(StringUtils.equals(prePartLotBatchNo.get(),mapData.get(3).toString())){
            errorMsgList.add("零件批号存在重复");
        }
        prePartLotBatchNo.getAndSet(mapData.get(3).toString());
        //库存数量2
        if(Objects.isNull(mapData.get(5))){
            errorMsgList.add("库存数量2不能为空");
        }else{
            BigDecimal storeQty2 = BigDecimal.ZERO;
            try{
                storeQty2 = new BigDecimal(mapData.get(5).toString());
            }catch (Exception e){
                errorMsgList.add("库存数量2格式异常");
            }
            if(storeQty2.compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){
                errorMsgList.add("库存数量2不能大于报检零件的抵达采购数量");
            }
            BigDecimal oldSum = storeQty2Sum.get();
            storeQty2Sum.getAndSet(oldSum.add(storeQty2));
        }
        //库位编号
        if(Objects.isNull(mapData.get(10))){
            errorMsgList.add("库位编号不能为空");
        }else if(!StringUtils.equals(mapData.get(10).toString(),ifsInventoryQuantity.getLocationNo())){
            errorMsgList.add("库位编号与报检零件的库位编号不一致");
        }
        if(!errorMsgList.isEmpty()){
            String errorStr = String.join(";",errorMsgList);
            errorMsg+= rowStr + errorStr ;
        }
    }
 
    /**
     * 转换excel导入行数据
     * @param mapData
     * @return
     */
    private OrderSplitExcelData transformExcelData(Map<Integer,Object> mapData,Integer rowNumber){
        validateRowData(mapData,rowNumber);
        if(StringUtils.isBlank(errorMsg)){
            OrderSplitExcelData data = new OrderSplitExcelData();
            data.setPartNo(mapData.get(0).toString());
            data.setSystemNo(Objects.isNull(mapData.get(1))?"":mapData.get(1).toString());
            data.setSpec(Objects.isNull(mapData.get(2))?"":mapData.get(2).toString());
            data.setLotBatchNo(Objects.isNull(mapData.get(3))?"":mapData.get(3).toString());
            data.setLength(new BigDecimal(mapData.get(4).toString()));
            data.setQtyStock(new BigDecimal(mapData.get(5).toString()));
            data.setInsulationColor(Objects.isNull(mapData.get(6))?"":mapData.get(6).toString());
            data.setOuterColor(Objects.isNull(mapData.get(7))?"":mapData.get(7).toString());
            data.setLetteringInfo(Objects.isNull(mapData.get(8))?"":mapData.get(8).toString());
            data.setDrumNo(Objects.isNull(mapData.get(9))?"":mapData.get(9).toString());
            data.setLocationNo(Objects.isNull(mapData.get(10))?"":mapData.get(10).toString());
            data.setStockSource(Objects.isNull(mapData.get(11))?"":mapData.get(11).toString());
            data.setRemark(Objects.isNull(mapData.get(12))?"":mapData.get(12).toString());
            return data;
        }
        return null;
    }
 
}