|
@@ -15,13 +15,15 @@ import com.rongwei.zhsw.system.service.impl.SwUserManagementServiceImpl;
|
|
|
import com.rongwei.zhsw.system.service.impl.SwWaterUsageEntryServiceImpl;
|
|
|
import com.rongwei.zhsw.system.utils.ZHSWCommonUtils;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
+import org.apache.poi.ss.formula.functions.T;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Calendar;
|
|
|
-import java.util.List;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.rongwei.zhsw.system.utils.ZHSWCommonUtils.getCurrentUser;
|
|
@@ -34,105 +36,165 @@ import static com.rongwei.zhsw.system.utils.ZHSWCommonUtils.getCurrentUser;
|
|
|
*/
|
|
|
public class MeterReadingRecordListener extends AnalysisEventListener<ImportMeterReadingRecordVo> {
|
|
|
private static final Logger log = LoggerFactory.getLogger(MeterReadingRecordListener.class);
|
|
|
- private ThreadLocal<List<ImportMeterReadingRecordVo>> recordList = ThreadLocal.withInitial(ArrayList::new);
|
|
|
- private ThreadLocal<List<SwWaterUsageEntryDo>> saveList = ThreadLocal.withInitial(ArrayList::new);
|
|
|
+ private List<ImportMeterReadingRecordVo> recordList = new ArrayList<>();
|
|
|
+ private List<SwWaterUsageEntryDo> saveList = new ArrayList<>();
|
|
|
private SwUserManagementServiceImpl swUserManagementService;
|
|
|
private SwWaterUsageEntryServiceImpl swWaterUsageEntryService;
|
|
|
+ private Date nowDate;
|
|
|
|
|
|
- public MeterReadingRecordListener(SwUserManagementServiceImpl userManagementService,SwWaterUsageEntryServiceImpl waterUsageEntryService) {
|
|
|
+ // 出现重复记录的数据
|
|
|
+ private List<ImportMeterReadingRecordVo> duplicateRecordList = new ArrayList<>();
|
|
|
+ // 时间异常的记录
|
|
|
+ private List<ImportMeterReadingRecordVo> timeAnomalyList = new ArrayList<>();
|
|
|
+
|
|
|
+
|
|
|
+ public MeterReadingRecordListener(SwUserManagementServiceImpl userManagementService, SwWaterUsageEntryServiceImpl waterUsageEntryService) {
|
|
|
this.swUserManagementService = userManagementService;
|
|
|
this.swWaterUsageEntryService = waterUsageEntryService;
|
|
|
+ this.nowDate = new Date();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 导入前数据校验
|
|
|
+ *
|
|
|
+ * @param importMeterReadingRecordVo
|
|
|
+ * @param analysisContext
|
|
|
+ */
|
|
|
@Override
|
|
|
public void invoke(ImportMeterReadingRecordVo importMeterReadingRecordVo, AnalysisContext analysisContext) {
|
|
|
-
|
|
|
if (StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber())) {
|
|
|
throw new CustomException("户号为空");
|
|
|
}
|
|
|
if (importMeterReadingRecordVo.getReadingDate() == null) {
|
|
|
throw new CustomException("抄表日期");
|
|
|
}
|
|
|
- if (importMeterReadingRecordVo.getConsumption() == null) {
|
|
|
- throw new CustomException("读数为空");
|
|
|
+ if (importMeterReadingRecordVo.getConsumption() == null && importMeterReadingRecordVo.getConsumption().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ throw new CustomException("读数为空,抄表数小于0");
|
|
|
}
|
|
|
- // 校验户号是否能重复
|
|
|
-
|
|
|
-
|
|
|
- // 校验当前睡觉是否存在抄表记录
|
|
|
- int count = swWaterUsageEntryService.count(new LambdaQueryWrapper<SwWaterUsageEntryDo>()
|
|
|
- .eq(BaseDo::getDeleted, "0")
|
|
|
- .eq(SwWaterUsageEntryDo::getUsernumber, importMeterReadingRecordVo.getAccountNumber())
|
|
|
- .ge(SwWaterUsageEntryDo::getCurrentreadingdate, importMeterReadingRecordVo.getReadingDate()));
|
|
|
- if(count==0) {
|
|
|
- recordList.get().add(importMeterReadingRecordVo);
|
|
|
+ // 判断数据是否重复
|
|
|
+ boolean b = recordList.stream().anyMatch(record -> record.getAccountNumber().equals(importMeterReadingRecordVo.getAccountNumber())
|
|
|
+ && record.getReadingDate().equals(importMeterReadingRecordVo.getReadingDate())
|
|
|
+ );
|
|
|
+ if (b) {
|
|
|
+ duplicateRecordList.add(importMeterReadingRecordVo);
|
|
|
+ return;
|
|
|
}
|
|
|
+ // 判断抄表日期和当前日期的关系
|
|
|
+ if (importMeterReadingRecordVo.getReadingDate().compareTo(nowDate) > 0) {
|
|
|
+ timeAnomalyList.add(importMeterReadingRecordVo);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 校验导入的日期和当前日期的关系
|
|
|
+ */
|
|
|
+ recordList.add(importMeterReadingRecordVo);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
|
|
|
- if(recordList.get().isEmpty()){
|
|
|
+ if (recordList.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
- List<String> accountNumList = recordList.get().stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
|
|
|
+ if (!duplicateRecordList.isEmpty()) {
|
|
|
+ throw new CustomException(
|
|
|
+ "Excel表中" +
|
|
|
+ duplicateRecordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).collect(Collectors.joining("、"))
|
|
|
+ + "户号存在相同抄表日期记录,请检查!");
|
|
|
+ }
|
|
|
+ if (!timeAnomalyList.isEmpty()) {
|
|
|
+ throw new CustomException(
|
|
|
+ "Excel表中" +
|
|
|
+ timeAnomalyList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).collect(Collectors.joining("、"))
|
|
|
+ + "户号存在抄表日期大于当前日期的记录,请检查!");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 获取数据中的所有户号
|
|
|
+ List<String> accountNumList = recordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
List<SwUserManagementDo> allAccountData = new ArrayList<>();
|
|
|
- Lists.partition(accountNumList,5000).forEach(accountNum -> {
|
|
|
+ // 获取户号信息
|
|
|
+ Lists.partition(accountNumList, 5000).parallelStream().forEach(accountNum -> {
|
|
|
allAccountData.addAll(swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
|
|
|
.eq(BaseDo::getDeleted, "0")
|
|
|
.in(SwUserManagementDo::getUsernumber, accountNumList)));
|
|
|
});
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+
|
|
|
+ // 校验导入的时间是否小于对应户号的最大抄表日期
|
|
|
+ String errorStrDesc = recordList.parallelStream()
|
|
|
+ .filter(record ->
|
|
|
+ allAccountData.parallelStream().anyMatch(userAccount -> userAccount.getUsernumber()
|
|
|
+ .equals(record.getAccountNumber()) &&
|
|
|
+ (userAccount.getLastmeterreaddate() != null && userAccount.getLastmeterreaddate().compareTo(record.getReadingDate()) >= 0))
|
|
|
+ ).map(info -> info.getAccountNumber() + '-' + sdf.format(info.getReadingDate()))
|
|
|
+ .collect(Collectors.joining(" "));
|
|
|
+ if (StringUtils.isNotBlank(errorStrDesc)) {
|
|
|
+ throw new CustomException(
|
|
|
+ "Excel表中" +
|
|
|
+ errorStrDesc
|
|
|
+ + "记录日期小于对应用户最近抄表日期,请检查!");
|
|
|
+ }
|
|
|
+ // 按照户号分组 减少遍历时间
|
|
|
+ Map<String, SwUserManagementDo> userMap = allAccountData.stream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
|
|
|
+ Collectors.reducing(
|
|
|
+ null, // 初始值(可能为 null)
|
|
|
+ (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
|
|
|
+ )));
|
|
|
+
|
|
|
+ // 当前导入用户的操作人
|
|
|
SysUserVo currentUser = getCurrentUser();
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
- recordList.get().forEach(record->{
|
|
|
- SwUserManagementDo swUserManagementDo = allAccountData.stream().filter(accountInfo -> accountInfo.getUsernumber().equals(record.getAccountNumber()))
|
|
|
- .findFirst()
|
|
|
- .orElse(null);
|
|
|
- SwWaterUsageEntryDo swWaterUsageEntryDo = new SwWaterUsageEntryDo();
|
|
|
- if(swUserManagementDo!=null){
|
|
|
- // 如果时间一致不让当如
|
|
|
- if(record.getReadingDate().equals(swUserManagementDo.getLastmeterreaddate())){
|
|
|
- log.error("本次抄表日期和最后一次抄表日期一致");
|
|
|
- return;
|
|
|
+ /**********数据解析开始************/
|
|
|
+ recordList = recordList.stream().sorted(Comparator.comparing(ImportMeterReadingRecordVo::getReadingDate)).collect(Collectors.toList());
|
|
|
+ // 解决同一个excel中出现多次相同的户号数据 要记录上次读数的问题 对数据按照户号分组
|
|
|
+ Map<String, List<ImportMeterReadingRecordVo>> collect = recordList.stream()
|
|
|
+ .collect(Collectors.groupingBy(ImportMeterReadingRecordVo::getAccountNumber, Collectors.toList()));
|
|
|
+
|
|
|
+ collect.forEach((accountNum, v) -> {
|
|
|
+ SwUserManagementDo swUserManagementDo = userMap.getOrDefault(accountNum,null);
|
|
|
+ SwWaterUsageEntryDo waterUsageEntryDo;
|
|
|
+ // 循环数据
|
|
|
+ SwUserManagementDo saveUserDo;
|
|
|
+ for (int i = 0; i < v.size(); i++) {
|
|
|
+ ImportMeterReadingRecordVo importMeterReadingRecordVo = v.get(i);
|
|
|
+ calendar.setTime(importMeterReadingRecordVo.getReadingDate());
|
|
|
+ waterUsageEntryDo = new SwWaterUsageEntryDo();
|
|
|
+ waterUsageEntryDo.setId(SecurityUtil.getUUID());
|
|
|
+ waterUsageEntryDo.setUsernumber(accountNum);
|
|
|
+ waterUsageEntryDo.setThisreading(importMeterReadingRecordVo.getConsumption());
|
|
|
+ waterUsageEntryDo.setCurrentreadingdate(importMeterReadingRecordVo.getReadingDate());
|
|
|
+ waterUsageEntryDo.setReadingsource("1");
|
|
|
+ // 当前户号在系统中不存在
|
|
|
+ if (swUserManagementDo == null) {
|
|
|
+ // 户号不存在
|
|
|
+ waterUsageEntryDo.setState(2);
|
|
|
+ } else {
|
|
|
+ // 增加用户信息
|
|
|
+ waterUsageEntryDo.setAddress(swUserManagementDo.getAddress());
|
|
|
+ waterUsageEntryDo.setUsername(swUserManagementDo.getUsername());
|
|
|
+ waterUsageEntryDo.setUserid(swUserManagementDo.getId());
|
|
|
+ waterUsageEntryDo.setState(0);
|
|
|
+ waterUsageEntryDo.setLastreading(swUserManagementDo.getLastmeterreading());
|
|
|
+ waterUsageEntryDo.setLastreadingdate(swUserManagementDo.getLastmeterreaddate());
|
|
|
+ waterUsageEntryDo.setCommunityname(swUserManagementDo.getVillagename());
|
|
|
+ waterUsageEntryDo.setCommunitycode(swUserManagementDo.getVolumeno());
|
|
|
+ // 修改用户表的最后一次 抄表日期和抄表度数
|
|
|
+ swUserManagementDo.setLastmeterreading(importMeterReadingRecordVo.getConsumption());
|
|
|
+ swUserManagementDo.setLastmeterreaddate(importMeterReadingRecordVo.getReadingDate());
|
|
|
}
|
|
|
- swWaterUsageEntryDo.setAddress(swUserManagementDo.getAddress());
|
|
|
- swWaterUsageEntryDo.setUsername(swUserManagementDo.getUsername());
|
|
|
- swWaterUsageEntryDo.setUserid(swUserManagementDo.getId());
|
|
|
- swWaterUsageEntryDo.setState(0);
|
|
|
- swWaterUsageEntryDo.setLastreading(swUserManagementDo.getLastmeterreading());
|
|
|
- swWaterUsageEntryDo.setLastreadingdate(swUserManagementDo.getLastmeterreaddate());
|
|
|
- swWaterUsageEntryDo.setCommunityname(swUserManagementDo.getVillagename());
|
|
|
- swWaterUsageEntryDo.setCommunitycode(swUserManagementDo.getVolumeno());
|
|
|
- }else{
|
|
|
- swWaterUsageEntryDo.setState(2);
|
|
|
+ waterUsageEntryDo.setYear(calendar.get(Calendar.YEAR));
|
|
|
+ waterUsageEntryDo.setMonth(calendar.get(Calendar.MONTH) + 1);
|
|
|
+ waterUsageEntryDo.setIsds(String.valueOf(0));
|
|
|
+ ZHSWCommonUtils.initModelGeneralParameters(waterUsageEntryDo, currentUser);
|
|
|
+ saveList.add(waterUsageEntryDo);
|
|
|
}
|
|
|
- calendar.setTime(record.getReadingDate());
|
|
|
- swWaterUsageEntryDo.setId(SecurityUtil.getUUID());
|
|
|
- swWaterUsageEntryDo.setUsernumber(record.getAccountNumber());
|
|
|
- swWaterUsageEntryDo.setThisreading(record.getConsumption());
|
|
|
-
|
|
|
- swWaterUsageEntryDo.setCurrentreadingdate(record.getReadingDate());
|
|
|
- swWaterUsageEntryDo.setReadingsource("1");
|
|
|
-
|
|
|
- swWaterUsageEntryDo.setYear(calendar.get(Calendar.YEAR));
|
|
|
- swWaterUsageEntryDo.setMonth(calendar.get(Calendar.MONTH)+1);
|
|
|
- swWaterUsageEntryDo.setIsds(String.valueOf(0));
|
|
|
- ZHSWCommonUtils.initModelGeneralParameters(swWaterUsageEntryDo,currentUser);
|
|
|
- saveList.get().add(swWaterUsageEntryDo);
|
|
|
});
|
|
|
- save(saveList.get());
|
|
|
-
|
|
|
- recordList.remove();
|
|
|
- }
|
|
|
- @Transactional
|
|
|
- public void save(List<SwWaterUsageEntryDo> saveList){
|
|
|
- if(!saveList.isEmpty()){
|
|
|
- swWaterUsageEntryService.saveBatch(saveList,500);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
- public List<SwWaterUsageEntryDo> getDatas() {
|
|
|
- List<SwWaterUsageEntryDo> swWaterUsageEntryDos = saveList.get();
|
|
|
- saveList.remove();
|
|
|
- return swWaterUsageEntryDos;
|
|
|
+
|
|
|
+
|
|
|
+ public List<SwWaterUsageEntryDo> getData() {
|
|
|
+ return saveList;
|
|
|
}
|
|
|
}
|