chengf
2025-08-04 1aed87083c1153c1ff2e559e01100213dd5bfa43
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
package com.java110.job.cmd.importCarInout;
 
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.java110.dto.machine.CarInoutDto;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
 
import java.io.InputStream;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.time.Instant;
import java.util.*;
 
public class CarInoutExcelParser {
 
    public static List<CarInoutDto> parseExcel(InputStream inputStream, String communityId) {
        List<CarInoutDto> records = new ArrayList<>();
 
        EasyExcel.read(inputStream)
                .head(ExcelRowData.class)
                .sheet()
                .registerReadListener(new PageReadListener<ExcelRowData>(dataList -> {
                    for (ExcelRowData rowData : dataList) {
                        CarInoutDto entity = convertToEntity(rowData, communityId);
                        if (entity != null) {
                            records.add(entity);
                        }
                    }
                }))
                .doRead();
 
        return records;
    }
 
    private static CarInoutDto convertToEntity(ExcelRowData rowData, String communityId) {
        CarInoutDto entity = new CarInoutDto();
        // 设置小区ID
        entity.setCommunityId(communityId);
 
        // 处理车牌号(非空校验)
        if (StringUtils.isEmpty(rowData.getPlateNumber())) {
            return null;
        }
        entity.setCarNum(rowData.getPlateNumber().trim());
 
        // 处理进入时间(转换为 Timestamp)
        try {
            Date entryDate = DateUtils.parseDate(rowData.getEntryTime(), Locale.CHINA, "yyyy/MM/dd");
            entity.setInTime(String.valueOf(new Timestamp(entryDate.getTime())));
        } catch (ParseException e) {
            System.err.println("进入时间格式错误,跳过该行:" + rowData.getEntryTime());
            return null;
        }
 
        // 处理出去时间(转换为 Timestamp,允许为空)
        if (StringUtils.isNotEmpty(rowData.getExitTime())) {
            try {
                Date exitDate = DateUtils.parseDate(rowData.getExitTime(), Locale.CHINA, "yyyy/MM/dd");
                entity.setOutTime(String.valueOf(new Timestamp(exitDate.getTime())));
            } catch (ParseException e) {
                System.err.println("出去时间格式错误,跳过该行:" + rowData.getExitTime());
                return null;
            }
        }
 
        // 处理车辆类型(非空,按 Excel 内容赋值)
        entity.setVehicleType(rowData.getVehicleType());
 
        // 处理付款状态(允许为空,直接赋值)
        entity.setState(rowData.getPaidStatus());
 
        // 处理付款金额(转换为 BigDecimal,允许为空)
        if (StringUtils.isNotEmpty(rowData.getPaymentAmount())) {
            try {
                entity.setPaymentAmount(String.valueOf(new BigDecimal(rowData.getPaymentAmount())));
            } catch (NumberFormatException e) {
                System.err.println("付款金额格式错误,跳过该行:" + rowData.getPaymentAmount());
                return null;
            }
        }
 
        // 处理付款商户号(允许为空,直接赋值)
        entity.setMerchantId(rowData.getMerchantId());
 
        // 处理进出方向(非空,直接赋值)
        entity.setDirection(rowData.getDirection());
 
        // 其他默认值设置
        entity.setCreateTime(new Timestamp(System.currentTimeMillis()));
        // inoutId 可根据需求生成,比如用 UUID:entity.setInoutId(UUID.randomUUID().toString()); 
        // 这里先简单示例,实际可按业务规则完善
        long timestamp = Instant.now().toEpochMilli();
        entity.setInoutId(String.format("%010d", timestamp % 10000000000L));
 
        return entity;
    }
 
    // 映射 Excel 一行数据的临时类
    public static class ExcelRowData {
        private String plateNumber;     // 对应 Excel 的 plate_number
        private String communityName;   // 对应 Excel 的 community_name(可用于校验小区,这里暂未用)
        private String entryTime;       // 对应 Excel 的 entry_time
        private String exitTime;        // 对应 Excel 的 exit_time
        private String vehicleType;     // 对应 Excel 的 vehicle_type
        private String paidStatus;      // 对应 Excel 的 paid_status
        private String paymentAmount;   // 对应 Excel 的 payment_amount
        private String merchantId;      // 对应 Excel 的 merchant_id
        private String direction;       // 对应 Excel 的 direction
 
        // Getter 和 Setter 方法
        public String getPlateNumber() {
            return plateNumber;
        }
 
        public void setPlateNumber(String plateNumber) {
            this.plateNumber = plateNumber;
        }
 
        public String getCommunityName() {
            return communityName;
        }
 
        public void setCommunityName(String communityName) {
            this.communityName = communityName;
        }
 
        public String getEntryTime() {
            return entryTime;
        }
 
        public void setEntryTime(String entryTime) {
            this.entryTime = entryTime;
        }
 
        public String getExitTime() {
            return exitTime;
        }
 
        public void setExitTime(String exitTime) {
            this.exitTime = exitTime;
        }
 
        public String getVehicleType() {
            return vehicleType;
        }
 
        public void setVehicleType(String vehicleType) {
            this.vehicleType = vehicleType;
        }
 
        public String getPaidStatus() {
            return paidStatus;
        }
 
        public void setPaidStatus(String paidStatus) {
            this.paidStatus = paidStatus;
        }
 
        public String getPaymentAmount() {
            return paymentAmount;
        }
 
        public void setPaymentAmount(String paymentAmount) {
            this.paymentAmount = paymentAmount;
        }
 
        public String getMerchantId() {
            return merchantId;
        }
 
        public void setMerchantId(String merchantId) {
            this.merchantId = merchantId;
        }
 
        public String getDirection() {
            return direction;
        }
 
        public void setDirection(String direction) {
            this.direction = direction;
        }
    }
}