|
@@ -15,11 +15,8 @@ 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.math.BigDecimal;
|
|
|
import java.text.SimpleDateFormat;
|
|
@@ -40,7 +37,8 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
|
|
|
private List<SwWaterUsageEntryDo> saveList = new ArrayList<>();
|
|
|
private SwUserManagementServiceImpl swUserManagementService;
|
|
|
private SwWaterUsageEntryServiceImpl swWaterUsageEntryService;
|
|
|
- private Date nowDate;
|
|
|
+ private Map<String, SwUserManagementDo> ownerMap;
|
|
|
+ private final Date nowDate;
|
|
|
|
|
|
// 出现重复记录的数据
|
|
|
private List<ImportMeterReadingRecordVo> duplicateRecordList = new ArrayList<>();
|
|
@@ -48,6 +46,7 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
|
|
|
private List<ImportMeterReadingRecordVo> timeAnomalyList = new ArrayList<>();
|
|
|
|
|
|
private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
|
|
+
|
|
|
public MeterReadingRecordListener(SwUserManagementServiceImpl userManagementService, SwWaterUsageEntryServiceImpl waterUsageEntryService) {
|
|
|
this.swUserManagementService = userManagementService;
|
|
|
this.swWaterUsageEntryService = waterUsageEntryService;
|
|
@@ -63,18 +62,18 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
|
|
|
@Override
|
|
|
public void invoke(ImportMeterReadingRecordVo importMeterReadingRecordVo, AnalysisContext analysisContext) {
|
|
|
Integer currentRowNum = analysisContext.readRowHolder().getRowIndex();
|
|
|
- if(StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber()) && importMeterReadingRecordVo.getReadingDate() == null &&importMeterReadingRecordVo.getConsumption() == null){
|
|
|
+ if (StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber()) && importMeterReadingRecordVo.getReadingDate() == null && importMeterReadingRecordVo.getConsumption() == null) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber())) {
|
|
|
- throw new CustomException("第"+currentRowNum+"行户号为空");
|
|
|
+ throw new CustomException("第" + currentRowNum + "行户号为空");
|
|
|
}
|
|
|
if (importMeterReadingRecordVo.getReadingDate() == null) {
|
|
|
- throw new CustomException("第"+currentRowNum+"行抄表日期");
|
|
|
+ throw new CustomException("第" + currentRowNum + "行抄表日期");
|
|
|
}
|
|
|
if (importMeterReadingRecordVo.getConsumption() == null && importMeterReadingRecordVo.getConsumption().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
- throw new CustomException("第"+currentRowNum+"行读数为空,抄表数小于0");
|
|
|
+ throw new CustomException("第" + currentRowNum + "行读数为空,抄表数小于0");
|
|
|
}
|
|
|
// 判断数据是否重复
|
|
|
boolean b = recordList.stream().anyMatch(record -> record.getAccountNumber().equals(importMeterReadingRecordVo.getAccountNumber())
|
|
@@ -114,51 +113,52 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
|
|
|
|
|
|
// 获取数据中的所有户号
|
|
|
List<String> accountNumList = recordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
|
|
|
-
|
|
|
- List<SwUserManagementDo> allAccountData = new ArrayList<>();
|
|
|
// 获取户号信息
|
|
|
- Lists.partition(accountNumList, 5000).forEach(accountNum -> {
|
|
|
- allAccountData.addAll(swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
|
|
|
- .select(SwUserManagementDo::getId,
|
|
|
- SwUserManagementDo::getUsernumber,
|
|
|
- SwUserManagementDo::getMetermaxvalue,
|
|
|
- SwUserManagementDo::getWaterprice,
|
|
|
- SwUserManagementDo::getVillagename,
|
|
|
- SwUserManagementDo::getVolumeno,
|
|
|
- SwUserManagementDo::getUsernumber,
|
|
|
- SwUserManagementDo::getUsername,
|
|
|
- SwUserManagementDo::getUsertype,
|
|
|
- SwUserManagementDo::getUsertypeid,
|
|
|
- SwUserManagementDo::getAddress,
|
|
|
- SwUserManagementDo::getExemptionamount,
|
|
|
- SwUserManagementDo::getExemptionwater,
|
|
|
- SwUserManagementDo::getWatertype,
|
|
|
- SwUserManagementDo::getLastmeterreaddate,
|
|
|
- SwUserManagementDo::getLastmeterreading
|
|
|
- )
|
|
|
- .eq(BaseDo::getDeleted, "0")
|
|
|
- .in(SwUserManagementDo::getUsernumber, accountNumList)));
|
|
|
- });
|
|
|
+ ownerMap = Lists.partition(accountNumList, 2500).stream().map(accountNum ->
|
|
|
+ swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
|
|
|
+ .select(SwUserManagementDo::getId,
|
|
|
+ SwUserManagementDo::getUsernumber,
|
|
|
+ SwUserManagementDo::getMetermaxvalue,
|
|
|
+ SwUserManagementDo::getWaterprice,
|
|
|
+ SwUserManagementDo::getVillagename,
|
|
|
+ SwUserManagementDo::getVolumeno,
|
|
|
+ SwUserManagementDo::getUsernumber,
|
|
|
+ SwUserManagementDo::getUsername,
|
|
|
+ SwUserManagementDo::getUsertype,
|
|
|
+ SwUserManagementDo::getUsertypeid,
|
|
|
+ SwUserManagementDo::getAddress,
|
|
|
+ SwUserManagementDo::getExemptionamount,
|
|
|
+ SwUserManagementDo::getExemptionwater,
|
|
|
+ SwUserManagementDo::getWatertype,
|
|
|
+ SwUserManagementDo::getLastmeterreaddate,
|
|
|
+ SwUserManagementDo::getLastmeterreading
|
|
|
+ )
|
|
|
+ .eq(BaseDo::getDeleted, "0")
|
|
|
+ .in(SwUserManagementDo::getUsernumber, accountNum)))
|
|
|
+ .flatMap(Collection::stream).collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
|
|
|
+ Collectors.reducing(
|
|
|
+ null, // 初始值(可能为 null)
|
|
|
+ (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
|
|
|
+ )));
|
|
|
+
|
|
|
|
|
|
// 校验导入的时间是否小于对应户号的最大抄表日期
|
|
|
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()))
|
|
|
+ {
|
|
|
+ SwUserManagementDo ownerData = ownerMap.getOrDefault(record.getAccountNumber(), null);
|
|
|
+ if (ownerData == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return ownerData.getLastmeterreaddate() != null && ownerData.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 );
|
|
|
+ "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();
|
|
@@ -169,7 +169,7 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
|
|
|
.collect(Collectors.groupingBy(ImportMeterReadingRecordVo::getAccountNumber, Collectors.toList()));
|
|
|
|
|
|
collect.forEach((accountNum, v) -> {
|
|
|
- SwUserManagementDo swUserManagementDo = userMap.getOrDefault(accountNum,null);
|
|
|
+ SwUserManagementDo swUserManagementDo = ownerMap.getOrDefault(accountNum, null);
|
|
|
SwWaterUsageEntryDo waterUsageEntryDo;
|
|
|
// 循环数据
|
|
|
SwUserManagementDo saveUserDo;
|
|
@@ -210,8 +210,13 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
+ // 获取Excel 中的数据
|
|
|
public List<SwWaterUsageEntryDo> getData() {
|
|
|
return saveList;
|
|
|
}
|
|
|
+
|
|
|
+ // 获取业主信息
|
|
|
+ public Map<String, SwUserManagementDo> getOwnerMap() {
|
|
|
+ return ownerMap;
|
|
|
+ }
|
|
|
}
|