forked from luyan/epmet-cloud-lingshan
				
			
				 7 changed files with 396 additions and 7 deletions
			
			
		@ -0,0 +1,75 @@ | 
				
			|||||
 | 
					package com.epmet.excel.data; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import com.alibaba.excel.annotation.ExcelProperty; | 
				
			||||
 | 
					import com.alibaba.excel.annotation.write.style.ColumnWidth; | 
				
			||||
 | 
					import lombok.Data; | 
				
			||||
 | 
					import org.hibernate.validator.constraints.Length; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import javax.validation.constraints.NotBlank; | 
				
			||||
 | 
					import javax.validation.constraints.NotNull; | 
				
			||||
 | 
					import java.util.Date; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * 行程上报excel数据 | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					@Data | 
				
			||||
 | 
					public class IcTripReportExcelData { | 
				
			||||
 | 
					    @NotBlank(message = "姓名为必填项") | 
				
			||||
 | 
					    @ExcelProperty("姓名") | 
				
			||||
 | 
					    private String name; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @NotBlank(message = "身份证号为必填项") | 
				
			||||
 | 
					    @ExcelProperty("身份证号") | 
				
			||||
 | 
					    private String idCard; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @NotBlank(message = "手机号为必填项") | 
				
			||||
 | 
					    @ExcelProperty("手机号") | 
				
			||||
 | 
					    private String mobile; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @NotBlank(message = "现居地为必填项") | 
				
			||||
 | 
					    @ExcelProperty("现居地(格式:省-市-区-街道-社区)") | 
				
			||||
 | 
					    private String presentAddress; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @NotBlank(message = "详细地址为必填项") | 
				
			||||
 | 
					    @ExcelProperty("详细地址") | 
				
			||||
 | 
					    private String detailAddress; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @NotBlank(message = "来自地区为必填项") | 
				
			||||
 | 
					    @ExcelProperty("来自地区(格式:省-市-区-街道-社区)") | 
				
			||||
 | 
					    private String sourceAddress; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @NotNull(message = "来到本地时间为必填项") | 
				
			||||
 | 
					    @ExcelProperty("来到本地时间(格式:2022-01-01)") | 
				
			||||
 | 
					    private Date arriveDate; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @ExcelProperty("离开本地时间(格式:2022-01-01)") | 
				
			||||
 | 
					    private Date leaveDate; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 备注信息 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    @Length(max = 500,message = "备注不能超过500字") | 
				
			||||
 | 
					    @ExcelProperty("备注(500字以内)") | 
				
			||||
 | 
					    private String remark; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Data | 
				
			||||
 | 
					    public static class ErrorRow { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        @ExcelProperty("姓名") | 
				
			||||
 | 
					        @ColumnWidth(20) | 
				
			||||
 | 
					        private String name; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        @ColumnWidth(20) | 
				
			||||
 | 
					        @ExcelProperty("身份证号") | 
				
			||||
 | 
					        private String idCard; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        @ExcelProperty("手机号") | 
				
			||||
 | 
					        @ColumnWidth(20) | 
				
			||||
 | 
					        private String mobile; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        @ColumnWidth(60) | 
				
			||||
 | 
					        @ExcelProperty("错误信息") | 
				
			||||
 | 
					        private String errorInfo; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,113 @@ | 
				
			|||||
 | 
					package com.epmet.excel.handler; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import com.alibaba.excel.context.AnalysisContext; | 
				
			||||
 | 
					import com.alibaba.excel.read.listener.ReadListener; | 
				
			||||
 | 
					import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; | 
				
			||||
 | 
					import com.epmet.commons.tools.exception.ExceptionUtils; | 
				
			||||
 | 
					import com.epmet.commons.tools.exception.ValidateException; | 
				
			||||
 | 
					import com.epmet.commons.tools.utils.ConvertUtils; | 
				
			||||
 | 
					import com.epmet.commons.tools.validator.ValidatorUtils; | 
				
			||||
 | 
					import com.epmet.constant.IcResiUserConstant; | 
				
			||||
 | 
					import com.epmet.entity.IcTripReportRecordEntity; | 
				
			||||
 | 
					import com.epmet.excel.data.IcTripReportExcelData; | 
				
			||||
 | 
					import com.epmet.service.impl.IcTripReportRecordServiceImpl; | 
				
			||||
 | 
					import lombok.extern.slf4j.Slf4j; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import java.util.ArrayList; | 
				
			||||
 | 
					import java.util.List; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * 行程上报excel导入监听器 | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					@Slf4j | 
				
			||||
 | 
					public class IcTripReportExcelImportListener implements ReadListener<IcTripReportExcelData> { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 最大条数阈值 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    public static final int MAX_THRESHOLD = 2; | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 当前操作用户 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private CustomerStaffInfoCacheResult staffInfo; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 数据 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private List<IcTripReportRecordEntity> datas = new ArrayList<>(); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 错误项列表 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private List<IcTripReportExcelData.ErrorRow> errorRows = new ArrayList<>(); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    private IcTripReportRecordServiceImpl tripReportRecordService; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    public IcTripReportExcelImportListener(CustomerStaffInfoCacheResult staffInfo, IcTripReportRecordServiceImpl tripReportRecordService) { | 
				
			||||
 | 
					        this.staffInfo = staffInfo; | 
				
			||||
 | 
					        this.tripReportRecordService = tripReportRecordService; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Override | 
				
			||||
 | 
					    public void invoke(IcTripReportExcelData data, AnalysisContext context) { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        try { | 
				
			||||
 | 
					            // 先校验数据
 | 
				
			||||
 | 
					            ValidatorUtils.validateEntity(data); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            IcTripReportRecordEntity tripReportRecordEntity = ConvertUtils.sourceToTarget(data, IcTripReportRecordEntity.class); | 
				
			||||
 | 
					            tripReportRecordEntity.setAgencyId(staffInfo.getAgencyId()); | 
				
			||||
 | 
					            tripReportRecordEntity.setPids(staffInfo.getAgencyPIds()); | 
				
			||||
 | 
					            tripReportRecordEntity.setUserType(IcResiUserConstant.USER_TYPE_IMPORT); | 
				
			||||
 | 
					            datas.add(tripReportRecordEntity); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            if (datas.size() == MAX_THRESHOLD) { | 
				
			||||
 | 
					                execPersist(); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } catch (Exception e) { | 
				
			||||
 | 
					            String errorMsg = null; | 
				
			||||
 | 
					            if (e instanceof ValidateException) { | 
				
			||||
 | 
					                errorMsg = ((ValidateException) e).getMsg(); | 
				
			||||
 | 
					            } else { | 
				
			||||
 | 
					                errorMsg = "未知错误"; | 
				
			||||
 | 
					                log.error("【行程上报导入】出错:{}", ExceptionUtils.getErrorStackTrace(e)); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            IcTripReportExcelData.ErrorRow errorRow = new IcTripReportExcelData.ErrorRow(); | 
				
			||||
 | 
					            errorRow.setName(data.getName()); | 
				
			||||
 | 
					            errorRow.setMobile(data.getMobile()); | 
				
			||||
 | 
					            errorRow.setIdCard(data.getIdCard()); | 
				
			||||
 | 
					            errorRow.setErrorInfo(errorMsg); | 
				
			||||
 | 
					            errorRows.add(errorRow); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Override | 
				
			||||
 | 
					    public void doAfterAllAnalysed(AnalysisContext context) { | 
				
			||||
 | 
					        // 最后几条达不到阈值,这里必须再调用一次
 | 
				
			||||
 | 
					        execPersist(); | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 执行持久化 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private void execPersist() { | 
				
			||||
 | 
					        try { | 
				
			||||
 | 
					            if (datas != null && datas.size() > 0) { | 
				
			||||
 | 
					                tripReportRecordService.batchPersist(datas); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } finally { | 
				
			||||
 | 
					            datas.clear(); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 获取错误行 | 
				
			||||
 | 
					     * @return | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    public List<IcTripReportExcelData.ErrorRow> getErrorRows() { | 
				
			||||
 | 
					        return errorRows; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue