wangxianzhang 4 years ago
parent
commit
92496ca7d8
  1. 2
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java
  2. 33
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
  3. 26
      epmet-user/epmet-user-client/src/main/java/com/epmet/constant/ImportTaskConstants.java
  4. 13
      epmet-user/epmet-user-server/src/main/java/com/epmet/bean/ResiImportCategoryData.java
  5. 7
      epmet-user/epmet-user-server/src/main/java/com/epmet/bean/ResiImportResiCategoryChangedCache.java
  6. 30
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java
  7. 31
      epmet-user/epmet-user-server/src/main/java/com/epmet/dao/ImportTaskDao.java
  8. 48
      epmet-user/epmet-user-server/src/main/java/com/epmet/entity/ImportTaskEntity.java
  9. 73
      epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java
  10. 189
      epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcResiImportDynamicExcelListener.java
  11. 2
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java
  12. 35
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/ImportTaskService.java
  13. 255
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java
  14. 57
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/ImportTaskServiceImpl.java
  15. 5
      epmet-user/epmet-user-server/src/main/resources/bootstrap.yml
  16. 33
      epmet-user/epmet-user-server/src/main/resources/mapper/ImportTaskDao.xml

2
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/BaseRequestLogAspect.java

@ -10,6 +10,7 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
@ -286,6 +287,7 @@ public abstract class BaseRequestLogAspect {
if (object != null if (object != null
&& !(object instanceof ServletRequest) && !(object instanceof ServletRequest)
&& !(object instanceof ServletResponse) && !(object instanceof ServletResponse)
&& !(object instanceof MultipartFile)
) { ) {
try { try {
// 尝试作为json解析 // 尝试作为json解析

33
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java

@ -640,4 +640,37 @@ public class RedisKeys {
public static String getHouseInfoCacheKey(String houseId,String customerId){ public static String getHouseInfoCacheKey(String houseId,String customerId){
return rootPrefix.concat("house:").concat(customerId).concat(":").concat(houseId); return rootPrefix.concat("house:").concat(customerId).concat(":").concat(houseId);
} }
/**
* 居民导入-缓存目录key
* @param importTag
* @return
*/
public static String icResiImportBaseKey(String importTag) {
return rootPrefix.concat("resi:").concat("import:").concat(importTag);
}
/**
* 居民导入-数据分类的key
* add新增居民
* category类别变更
* transfer调动
* @param importTag
* @param type
* @return
*/
public static String icResiImportTypeKey(String importTag, String type) {
return icResiImportBaseKey(importTag).concat(":").concat(type);
}
/**
* 居民导入-详细信息key
* @param importTag
* @param type
* @param resiId
* @return
*/
public static String icResiImportResiCategoryKey(String importTag, String type, String resiId) {
return icResiImportTypeKey(importTag, type).concat(":").concat(resiId);
}
} }

26
epmet-user/epmet-user-client/src/main/java/com/epmet/constant/ImportTaskConstants.java

@ -0,0 +1,26 @@
package com.epmet.constant;
/**
* 导入任务的业务类型常量
*/
public interface ImportTaskConstants {
/**
* 居民
*/
String BIZ_TYPE_RESI = "resi";
/**
* 处理状态处理中
*/
String PROCESS_STATUS_PROCESSING = "processing";
/**
* 处理状态成功
*/
String PROCESS_STATUS_FINISHED_SUCCESS = "finished_success";
/**
* 处理状态完成但未完全成功
*/
String PROCESS_STATUS_FINISHED_FAIL = "finished_fail";
}

13
epmet-user/epmet-user-server/src/main/java/com/epmet/bean/ResiImportCategoryData.java

@ -14,6 +14,7 @@ import java.util.Map;
@Data @Data
public class ResiImportCategoryData { public class ResiImportCategoryData {
private String resiId;
private String agencyId; private String agencyId;
private String gridId; private String gridId;
private String villageId; private String villageId;
@ -30,7 +31,8 @@ public class ResiImportCategoryData {
public ResiImportCategoryData() { public ResiImportCategoryData() {
} }
public ResiImportCategoryData(String agencyId, String gridId, String villageId, String buildId, String unitId, String homeId, Map<String, String> categories) { public ResiImportCategoryData(String resiId, String agencyId, String gridId, String villageId, String buildId, String unitId, String homeId, Map<String, String> categories) {
this.resiId = resiId;
this.agencyId = agencyId; this.agencyId = agencyId;
this.gridId = gridId; this.gridId = gridId;
this.villageId = villageId; this.villageId = villageId;
@ -39,13 +41,4 @@ public class ResiImportCategoryData {
this.homeId = homeId; this.homeId = homeId;
this.categories = categories; this.categories = categories;
} }
public ResiImportCategoryData(String agencyId, String gridId, String villageId, String buildId, String unitId, String homeId) {
this.agencyId = agencyId;
this.gridId = gridId;
this.villageId = villageId;
this.buildId = buildId;
this.unitId = unitId;
this.homeId = homeId;
}
} }

7
epmet-user/epmet-user-server/src/main/java/com/epmet/bean/ResiImportResiCategoryChangedCache.java

@ -11,11 +11,16 @@ import java.util.Map;
@Data @Data
public class ResiImportResiCategoryChangedCache { public class ResiImportResiCategoryChangedCache {
/**
* 导入的tag用来标记唯一一次导入操作
*/
private String importTag;
/** /**
* 新增居民 * 新增居民
* Map<resiId:<ResiImportCategoryData>> * Map<resiId:<ResiImportCategoryData>>
*/ */
private Map<String, ResiImportCategoryData> newResis = new HashMap<>(); // private Map<String, ResiImportCategoryData> newResis = new HashMap<>();
/** /**
* 调动的居民 * 调动的居民

30
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

@ -38,11 +38,13 @@ import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.redis.common.CustomerStaffRedis;
import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.security.user.LoginUserUtil;
import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.ExcelUtils;
import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.HttpClientManager;
import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.IpUtils;
import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.constant.ImportTaskConstants;
import com.epmet.constant.SystemMessageType; import com.epmet.constant.SystemMessageType;
import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.IcResiUserDTO;
import com.epmet.dto.form.*; import com.epmet.dto.form.*;
@ -54,6 +56,7 @@ import com.epmet.feign.OperCustomizeOpenFeignClient;
import com.epmet.feign.OssFeignClient; import com.epmet.feign.OssFeignClient;
import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserImportService;
import com.epmet.service.IcResiUserService; import com.epmet.service.IcResiUserService;
import com.epmet.service.ImportTaskService;
import jodd.io.FileUtil; import jodd.io.FileUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@ -118,6 +121,11 @@ public class IcResiUserController {
private RedisUtils redisUtils; private RedisUtils redisUtils;
@Autowired @Autowired
private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient;
@Autowired
private LoginUserUtil loginUserUtil;
@Autowired
private ImportTaskService importTaskService;
/** /**
* 模板枚举 * 模板枚举
@ -431,6 +439,18 @@ public class IcResiUserController {
throw new RenException("文件类型不匹配"); throw new RenException("文件类型不匹配");
} }
String operatorId = loginUserUtil.getLoginUserId();
String importTaskId;
// 记录导入任务
if (importTaskService.existsProcessingTask(operatorId, ImportTaskConstants.BIZ_TYPE_RESI)) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),
"已存在执行中的导入任务,请等待执行完成。",
"已存在执行中的导入任务,请等待执行完成。");
} else {
importTaskId = importTaskService.createProcessTask(operatorId, ImportTaskConstants.BIZ_TYPE_RESI);
}
Path savePath = null; Path savePath = null;
try { try {
String fileName = UUID.randomUUID().toString().concat(".").concat(extension); String fileName = UUID.randomUUID().toString().concat(".").concat(extension);
@ -438,10 +458,14 @@ public class IcResiUserController {
IOUtils.copy(file.getInputStream(), new FileOutputStream(savePath.toString())); IOUtils.copy(file.getInputStream(), new FileOutputStream(savePath.toString()));
List<FormItemResult> formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode()); List<FormItemResult> formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode());
icResiUserImportService.importIcResiInfoFromExcel(formItemList, savePath.toString(), response);
} catch (IOException e) { icResiUserImportService.importIcResiInfoFromExcel(importTaskId, formItemList, savePath.toString(), response);
String errorMsg = ExceptionUtils.getErrorStackTrace(e); } catch (Throwable e) {
String errorMsg = ExceptionUtils.getThrowableErrorStackTrace(e);
log.error("【导入居民信息失败】导入失败:{}", errorMsg); log.error("【导入居民信息失败】导入失败:{}", errorMsg);
// 要将导入任务状态设置为结束但不成功
importTaskService.finish(importTaskId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, operatorId, null, e.getMessage());
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode());
} finally { } finally {
try { try {

31
epmet-user/epmet-user-server/src/main/java/com/epmet/dao/ImportTaskDao.java

@ -0,0 +1,31 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.entity.ImportTaskEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
*
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-02-15
*/
@Mapper
public interface ImportTaskDao extends BaseDao<ImportTaskEntity> {
/**
* 完成导入
* @param taskId 任务id
* @param processStatus 处理状态
* @param operatorId 操作者id
* @param resultDesc 结果文字描述
* @param resultDescFile 结果描述文件
* @return
*/
int finish(@Param("taskId") String taskId,
@Param("process_status") String processStatus,
@Param("operatorId") String operatorId,
@Param("resultDesc") String resultDesc,
@Param("resultDescFile") String resultDescFile);
}

48
epmet-user/epmet-user-server/src/main/java/com/epmet/entity/ImportTaskEntity.java

@ -0,0 +1,48 @@
package com.epmet.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
*
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-02-15
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("import_task")
public class ImportTaskEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* 业务类型resi:居民楼栋:building房屋:house依次补充
*/
private String bizType;
/**
* 处理状态processing:处理中finished:完成
*/
private String processStatus;
/**
* 谁导入的
*/
private String operatorId;
/**
* 开始导入的时间
*/
private Date startTime;
private String resultDescFile;
private String resultDesc;
}

73
epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java

@ -1,73 +0,0 @@
package com.epmet.excel.handler;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 创建一个监听器
*/
@Slf4j
public class DynamicEasyExcelListener extends AnalysisEventListener<Map<Integer, String>> {
/**
* 表头数据存储所有的表头数据
*/
private List<Map<Integer, String>> headList = new ArrayList<>();
/**
* 数据体
*/
private List<Map<Integer, String>> dataList = new ArrayList<>();
// Map<Integer, String> dataList = new HashMap<>();
/**
* 这里会一行行的返回头
*
* @param headMap
* @param context
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
//log.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
//存储全部表头数据
headList.add(headMap);
}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
//log.info("解析到一条数据:{}", JSON.toJSONString(data));
dataList.add(data);
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
//log.info("所有数据解析完成!");
}
public List<Map<Integer, String>> getHeadList() {
return headList;
}
public List<Map<Integer, String>> getDataList() {
return dataList;
}
}

189
epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcResiImportDynamicExcelListener.java

@ -0,0 +1,189 @@
package com.epmet.excel.handler;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.epmet.dto.result.FormItemResult;
import com.epmet.service.impl.IcResiUserImportServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 创建一个监听器
*/
@Slf4j
public class IcResiImportDynamicExcelListener extends AnalysisEventListener<Map<Integer, String>> {
/**
* 一次性导入的条数
*/
private static final Integer ONCE_BATCH_IMPORT_ITEMS_SIZE = 2000;
/**
* 客户id
*/
private String customerId;
/**
* 当前操作人的AgencyId
*/
private String currUserAgencyId;
/**
* 当前用户ID
*/
private String currentUserId;
/**
* 当前用户agencyId
*/
private String currUserAgencyPids;
/**
* 数据库表名
*/
private String tableName;
private IcResiUserImportServiceImpl icResiUserImportService;
/**
* item列表
*/
private List<FormItemResult> formItemList;
/**
* 是否是基础信息表
*/
private Boolean isPrimary;
/**
* 有几行是表头
*/
private Integer headRowNumber;
/**
* key:itemId
* value:ColumnWrapper 列封装信息列基础信息和列值
*/
private Map<String, IcResiUserImportServiceImpl.ColumnWrapper> itemIdAndColumnWrapper;
/**
* 被丢弃的header原因checkbox的情况下选项在表格中是多列但是在item中不存在
*/
private Map<Integer, String> abandonedHeaders;
/**
* 表头数据存储所有的表头数据
*/
private List<Map<Integer, String>> headList = new ArrayList<>();
/**
* 数据体
*/
private List<Map<Integer, String>> dataList = new ArrayList<>();
// Map<Integer, String> dataList = new HashMap<>();
public IcResiImportDynamicExcelListener(IcResiUserImportServiceImpl icResiUserImportService, String customerId,
String currentUserId, String currUserAgencyId,
String currUserAgencyPids, Boolean isPrimary, String tableName,
List<FormItemResult> formItemList, Integer headRowNumber) {
this.customerId = customerId;
this.icResiUserImportService = icResiUserImportService;
this.formItemList = formItemList;
this.isPrimary = isPrimary;
this.currentUserId = currentUserId;
this.currUserAgencyId = currUserAgencyId;
this.currUserAgencyPids = currUserAgencyPids;
this.tableName = tableName;
this.headRowNumber = headRowNumber;
}
/**
* 这里会一行行的返回头
*
* @param headMap
* @param context
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
headList.add(headMap);
if (headList.size() < headRowNumber) {
return;
}
// 合并多级表头到一个list中,key为列序号
Map<Integer, List<String>> headers = icResiUserImportService.mergeMultiLevelHeadLabels(headList);
// 清洗表头数据,通过items剔除,并且得到options
abandonedHeaders = icResiUserImportService.removeAndGetOptionsFromHeaders(headers, formItemList);
// 交换表头信息,以label连起来的string作为key,列号的列表作为value
HashMap<String, List<Integer>> combinedHeaders = icResiUserImportService.exchangeKeyAndValueOfHeaders(headers);
// 得到客户配置item数据。<"兴趣爱好:兴趣特长", item对象>
Map<String, FormItemResult> customizedLabelCompbinedItemsMap = formItemList.stream().collect(
Collectors.toMap(formItem -> {
String groupLabel = formItem.getGroupLabel();
String label = formItem.getLabel();
if (StringUtils.isNotBlank(groupLabel)) {
return groupLabel.concat(":").concat(label);
} else {
return label;
}
}, formItem -> formItem)
);
itemIdAndColumnWrapper = icResiUserImportService.convertExcelHeaders2DBColumnWrappers(customizedLabelCompbinedItemsMap, combinedHeaders);
}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
// 每2000条数据处理一次
dataList.add(data);
// 达到了批量导入的阈值,执行一次持久化
if (dataList.size() >= ONCE_BATCH_IMPORT_ITEMS_SIZE) {
execPersistant();
}
}
/**
* 所有数据解析完成了会调用
* 此处也要判断然后执行持久化因为最后一部分数据达不到批量阈值不能漏掉在最后结束的时候给他执行进去
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (dataList.size() != 0) {
execPersistant();
}
}
/**
* 执行持久化
*/
private void execPersistant() {
// 持久化
if (isPrimary) {
icResiUserImportService.persistIcResiBaseInfo(itemIdAndColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId, tableName);
} else {
icResiUserImportService.persistIcResiExtraInfo(itemIdAndColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, tableName, customerId);
}
dataList.clear();
}
}

2
epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java

@ -12,5 +12,5 @@ import java.util.List;
*/ */
public interface IcResiUserImportService { public interface IcResiUserImportService {
void importIcResiInfoFromExcel(List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response); void importIcResiInfoFromExcel(String importTaskId, List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response);
} }

35
epmet-user/epmet-user-server/src/main/java/com/epmet/service/ImportTaskService.java

@ -0,0 +1,35 @@
package com.epmet.service;
/**
*
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-02-15
*/
public interface ImportTaskService {
/**
* 检查指定类型该用户是否存在处理中的导入任务
* @param operatorId 操作者ID
* @param bizType 业务类型resi居民
* @return
*/
boolean existsProcessingTask(String operatorId, String bizType);
/**
* 创建处理任务
* @param operatorId
* @param bizType
*/
String createProcessTask(String operatorId, String bizType);
/**
* 结束导入
* @param taskId 任务id
* @param processStatus 处理状态
* @param resultDescFile 结果描述文件
* @param resultDesc 结果描述文本
*/
Boolean finish(String taskId, String processStatus, String operatorId, String resultDescFile, String resultDesc);
}

255
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

@ -3,8 +3,10 @@ package com.epmet.service.impl;
import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.EasyExcelFactory;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.epmet.bean.ResiImportCategoryData; import com.epmet.bean.ResiImportCategoryData;
import com.epmet.bean.ResiImportResiCategoryChangedCache; import com.epmet.bean.ResiImportResiCategoryChangedCache;
import com.epmet.bean.ResiImportChangedData; import com.epmet.bean.ResiImportChangedData;
@ -16,9 +18,13 @@ import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.feign.ResultDataResolver;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.redis.common.CustomerStaffRedis;
import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.security.user.LoginUserUtil;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.ImportTaskConstants;
import com.epmet.dao.IcResiUserDao; import com.epmet.dao.IcResiUserDao;
import com.epmet.dao.IcUserChangeDetailedDao; import com.epmet.dao.IcUserChangeDetailedDao;
import com.epmet.dao.IcUserChangeRecordDao; import com.epmet.dao.IcUserChangeRecordDao;
@ -31,7 +37,7 @@ import com.epmet.entity.IcUserChangeDetailedEntity;
import com.epmet.entity.IcUserChangeRecordEntity; import com.epmet.entity.IcUserChangeRecordEntity;
import com.epmet.entity.IcUserTransferRecordEntity; import com.epmet.entity.IcUserTransferRecordEntity;
import com.epmet.enums.IcResiUserTableEnum; import com.epmet.enums.IcResiUserTableEnum;
import com.epmet.excel.handler.DynamicEasyExcelListener; import com.epmet.excel.handler.IcResiImportDynamicExcelListener;
import com.epmet.feign.EpmetAdminOpenFeignClient; import com.epmet.feign.EpmetAdminOpenFeignClient;
import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient;
@ -67,7 +73,6 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
// 错误和跳过excel行暂存 // 错误和跳过excel行暂存
public static final ThreadLocal<Map<String, List<ErrorRow>>> errorRows = new ThreadLocal<>(); public static final ThreadLocal<Map<String, List<ErrorRow>>> errorRows = new ThreadLocal<>();
public static final ThreadLocal<Map<String, List<SkipedRow>>> skipedRows = new ThreadLocal<>();
/** /**
* 导入的居民中新增或者变动的居民 * 导入的居民中新增或者变动的居民
@ -118,6 +123,12 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired
private RedisUtils redisUtils;
@Autowired
private ImportTaskService importTaskService;
/** /**
* 字表中不需要的列 * 字表中不需要的列
@ -204,11 +215,13 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
/** /**
* 导入居民信息 * 导入居民信息
* 导入主表和所有子表信息 * @param importTaskId 导入任务id
* @return * @param formItemList item列表
* @param excelPathName excel缓存路径
* @param response 响应对象
*/ */
@Override @Override
public void importIcResiInfoFromExcel(List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response) { public void importIcResiInfoFromExcel(String importTaskId, List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response) {
String loginUserId = loginUserUtil.getLoginUserId(); String loginUserId = loginUserUtil.getLoginUserId();
String loginUserApp = loginUserUtil.getLoginUserApp(); String loginUserApp = loginUserUtil.getLoginUserApp();
@ -227,12 +240,14 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null);
String customerId = agencyInfo.getCustomerId(); String customerId = agencyInfo.getCustomerId();
boolean hasErrorRows = false;
try { try {
initImportThreadLocal(customerId); initImportThreadLocal(customerId);
// 上传主表信息 // 上传主表信息
importIcResiBaseInfoFromExcel(formItemList,excelPathName, IcResiUserTableEnum.IC_RESI_USER.getSheetNo(), IcResiUserTableEnum.IC_RESI_USER.getHeadRowNo(), importIcResiBaseInfoFromExcel(formItemList,excelPathName, IcResiUserTableEnum.IC_RESI_USER.getSheetNo(), IcResiUserTableEnum.IC_RESI_USER.getHeadRowNo(),
currUserAgencyId, agencyInfo.getPids(), loginUserId, IcResiUserTableEnum.IC_RESI_USER.getTableName()); currUserAgencyId, agencyInfo.getPids(), loginUserId, IcResiUserTableEnum.IC_RESI_USER.getTableName(), customerId);
// 上传附表信息 // 上传附表信息
for (IcResiUserTableEnum sheet : IcResiUserTableEnum.values()) { for (IcResiUserTableEnum sheet : IcResiUserTableEnum.values()) {
@ -253,22 +268,50 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
} }
// 执行人员类别变更记录 // 执行人员类别变更记录
Map<String, ResiImportCategoryData> newResis = newlyOrChangedResi.get().getNewResis(); // Map<String, ResiImportCategoryData> newResis = newlyOrChangedResi.get().getNewResis();
Map<String, ResiImportChangedData> categoryChangedResis = newlyOrChangedResi.get().getCategoryChangedResis(); Map<String, ResiImportChangedData> categoryChangedResis = newlyOrChangedResi.get().getCategoryChangedResis();
Map<String, ResiImportChangedData> transferedResis = newlyOrChangedResi.get().getTransferedResis(); Map<String, ResiImportChangedData> transferedResis = newlyOrChangedResi.get().getTransferedResis();
log.info("类别变动居民数:{}", categoryChangedResis.size());
log.info("调动居民数:{}", transferedResis.size());
//保存调动或者变更记录 //保存调动或者变更记录
saveNewResiCategoryRecord(newResis); saveNewResiCategoryRecord();
saveResiCategoryChangedRecord(categoryChangedResis); saveResiCategoryChangedRecord(categoryChangedResis);
saveTransferedResiRecord(transferedResis); saveTransferedResiRecord(transferedResis);
hasErrorRows = hasErrorRows();
try { try {
downLoadResults(response); // todo 做了导入记录之后,这里就要判断,没有错误就不生成文件了
} catch (IOException e) { downLoadResults(hasErrorRows, response);
} catch (Exception e) {
log.error("【导入IC居民附加信息】下载导入结果信息失败:{}", ExceptionUtils.getErrorStackTrace(e)); log.error("【导入IC居民附加信息】下载导入结果信息失败:{}", ExceptionUtils.getErrorStackTrace(e));
} }
// 更新上传记录
if (hasErrorRows) {
importTaskService.finish(importTaskId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, loginUserId,
null, null);
} else {
importTaskService.finish(importTaskId, ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS, loginUserId,
null, null);
}
} catch (Exception e) {
// 抛出,让外层捕获处理,记录
throw e;
} finally { } finally {
skipedRows.remove(); // 清空rediskey
try {
String importTag = newlyOrChangedResi.get().getImportTag();
redisUtils.deleteByPattern(RedisKeys.icResiImportBaseKey(importTag).concat("*"));
} catch (Exception e) {
String errorMsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【导入IC居民附加信息】清空redis 类别缓存出错:{}", errorMsg);
}
// 清空线程变量
errorRows.remove(); errorRows.remove();
newlyOrChangedResi.remove(); newlyOrChangedResi.remove();
resiCategoryColumnNameAndLabel.remove(); resiCategoryColumnNameAndLabel.remove();
@ -276,16 +319,35 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
} }
} }
/**
* 是否有错误行
* @return
*/
private Boolean hasErrorRows() {
boolean hasError = false;
Map<String, List<ErrorRow>> tableAndErrorRows = errorRows.get();
for (Map.Entry<String, List<ErrorRow>> entry:tableAndErrorRows.entrySet()) {
if (entry.getValue().size() != 0) {
hasError = true;
}
}
return hasError;
}
/** /**
* threadLocal初始化 * threadLocal初始化
*/ */
private void initImportThreadLocal(String customerId) { private void initImportThreadLocal(String customerId) {
// 生成importTag,用于标记唯一一次导入操作,导入完成之后,用来删除redis里面临时的key
String operatorId = loginUserUtil.getLoginUserId();
String importTag = operatorId + System.currentTimeMillis();
// 跳过的,不导入的行 // 跳过的,不导入的行
Map<String, List<SkipedRow>> skipedRowsMap = new LinkedHashMap<>(); Map<String, List<SkipedRow>> skipedRowsMap = new LinkedHashMap<>();
for (IcResiUserTableEnum e : IcResiUserTableEnum.values()) { for (IcResiUserTableEnum e : IcResiUserTableEnum.values()) {
skipedRowsMap.put(e.getTableName(), new LinkedList<>()); skipedRowsMap.put(e.getTableName(), new LinkedList<>());
} }
skipedRows.set(skipedRowsMap);
// 错误信息 // 错误信息
Map<String, List<ErrorRow>> errorRowsMap = new LinkedHashMap<>(); Map<String, List<ErrorRow>> errorRowsMap = new LinkedHashMap<>();
@ -296,6 +358,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
// 居民类别信息 // 居民类别信息
ResiImportResiCategoryChangedCache c = new ResiImportResiCategoryChangedCache(); ResiImportResiCategoryChangedCache c = new ResiImportResiCategoryChangedCache();
c.setImportTag(importTag);
newlyOrChangedResi.set(c); newlyOrChangedResi.set(c);
List<ResiCategoryItemResultDTO> resiCategoryItems = getResultDataOrThrowsException(operCustomizeOpenFeignClient.listResiCategoryItems(customerId), List<ResiCategoryItemResultDTO> resiCategoryItems = getResultDataOrThrowsException(operCustomizeOpenFeignClient.listResiCategoryItems(customerId),
@ -320,43 +383,12 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param currentUserId * @param currentUserId
* @return * @return
*/ */
private Object importIcResiBaseInfoFromExcel(List<FormItemResult> formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId, private void importIcResiBaseInfoFromExcel(List<FormItemResult> formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId,
String tableName) { String tableName, String customerId) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
//EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
EasyExcel.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
List<Map<Integer, String>> headList = readListener.getHeadList();
List<Map<Integer, String>> dataList = readListener.getDataList();
// 合并多级表头到一个list中,key为列序号
Map<Integer, List<String>> headers = mergeMultiLevelHeadLabels(headList);
// 清洗表头数据,通过items剔除,并且得到options IcResiImportDynamicExcelListener readListener = new IcResiImportDynamicExcelListener(this, customerId, currentUserId, currUserAgencyId, currUserAgencyPids,
Map<Integer, String> abandonedHeaders = removeAndGetOptionsFromHeaders(headers, formItemList); true, tableName, formItemList, headRowNumber);
EasyExcel.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
// 交换表头信息,以label连起来的string作为key,列号的列表作为value
HashMap<String, List<Integer>> combinedHeaders = exchangeKeyAndValueOfHeaders(headers);
// 得到客户配置item数据。<"兴趣爱好:兴趣特长", item对象>
Map<String, FormItemResult> customizedLabelCompbinedItemsMap = formItemList.stream().collect(
Collectors.toMap(formItem -> {
String groupLabel = formItem.getGroupLabel();
String label = formItem.getLabel();
if (StringUtils.isNotBlank(groupLabel)) {
return groupLabel.concat(":").concat(label);
} else {
return label;
}
}, formItem -> formItem)
);
Map<String, ColumnWrapper> itemIdAndColumnWrapper = convertExcelHeaders2DBColumnWrappers(customizedLabelCompbinedItemsMap, combinedHeaders);
// 持久化
persistIcResiBaseInfo(itemIdAndColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId, tableName);
return headers;
} }
/** /**
@ -371,34 +403,12 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param targetTableName 要插入哪一个表 * @param targetTableName 要插入哪一个表
* @return * @return
*/ */
private Object importIcResiExtraInfoFromExcel(List<FormItemResult> formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId, private void importIcResiExtraInfoFromExcel(List<FormItemResult> formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId,
String targetTableName, String customerId) { String targetTableName, String customerId) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
List<Map<Integer, String>> headList = readListener.getHeadList(); IcResiImportDynamicExcelListener readListener = new IcResiImportDynamicExcelListener(this, customerId, currentUserId, currUserAgencyId, null,
List<Map<Integer, String>> dataList = readListener.getDataList(); false, targetTableName, formItemList, headRowNumber);
EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
Map<Integer, List<String>> headers = mergeMultiLevelHeadLabels(headList);
Map<Integer, String> abandonedHeaders = removeAndGetOptionsFromHeaders(headers, formItemList);
HashMap<String, List<Integer>> combinedHeaders = exchangeKeyAndValueOfHeaders(headers);
Map<String, FormItemResult> formItemMap = formItemList.stream().collect(
Collectors.toMap(formItem -> {
String groupLabel = formItem.getGroupLabel();
String label = formItem.getLabel();
if (StringUtils.isNotBlank(groupLabel)) {
return groupLabel.concat(":").concat(label);
} else {
return label;
}
}, formItem -> formItem)
);
Map<String, ColumnWrapper> headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders);
persistIcResiExtraInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, targetTableName, customerId);
return headerColumnWrapper;
} }
/** /**
@ -408,7 +418,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param currUserAgencyId 当前用户的组织id * @param currUserAgencyId 当前用户的组织id
* @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文
*/ */
private void persistIcResiBaseInfo(Map<String, ColumnWrapper> itemIdAndColumnWrapper, List<Map<Integer, String>> dataRows, public void persistIcResiBaseInfo(Map<String, ColumnWrapper> itemIdAndColumnWrapper, List<Map<Integer, String>> dataRows,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel, String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
String currUserAgencyPids, String currentUserId, String tableName) { String currUserAgencyPids, String currentUserId, String tableName) {
@ -468,8 +478,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
} }
} else { } else {
// 新增居民 // 新增居民
String resiId = IdWorker.getIdStr();
columnAndValues.put("CREATED_BY", currentUserId); columnAndValues.put("CREATED_BY", currentUserId);
columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); columnAndValues.put("ID", resiId);
icResiUserDao.add(tableName, columnAndValues); icResiUserDao.add(tableName, columnAndValues);
// 过滤出本居民含有哪些类别 // 过滤出本居民含有哪些类别
@ -478,14 +490,26 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
.filter((categoryColumnName) -> "1".equals(columnAndValues.get(categoryColumnName))) .filter((categoryColumnName) -> "1".equals(columnAndValues.get(categoryColumnName)))
.collect(Collectors.toMap((k) -> k, (k) -> columnAndValues.get(k))); .collect(Collectors.toMap((k) -> k, (k) -> columnAndValues.get(k)));
newlyOrChangedResi.get().getNewResis().put(columnAndValues.get("ID"), // newlyOrChangedResi.get().getNewResis().put(resiId,
new ResiImportCategoryData(columnAndValues.get("AGENCY_ID"), // new ResiImportCategoryData(columnAndValues.get("AGENCY_ID"),
// columnAndValues.get("GRID_ID"),
// columnAndValues.get("VILLAGE_ID"),
// columnAndValues.get("BUILD_ID"),
// columnAndValues.get("UNIT_ID"),
// columnAndValues.get("HOME_ID"),
// resiCategories));
ResiImportCategoryData categoryData = new ResiImportCategoryData(resiId,
columnAndValues.get("AGENCY_ID"),
columnAndValues.get("GRID_ID"), columnAndValues.get("GRID_ID"),
columnAndValues.get("VILLAGE_ID"), columnAndValues.get("VILLAGE_ID"),
columnAndValues.get("BUILD_ID"), columnAndValues.get("BUILD_ID"),
columnAndValues.get("UNIT_ID"), columnAndValues.get("UNIT_ID"),
columnAndValues.get("HOME_ID"), columnAndValues.get("HOME_ID"),
resiCategories)); resiCategories);
redisUtils.hMSet(RedisKeys.icResiImportResiCategoryKey(newlyOrChangedResi.get().getImportTag(), "add", resiId), BeanUtil.beanToMap(categoryData));
categoryData = null;
} }
} catch (Exception e) { } catch (Exception e) {
@ -517,7 +541,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文
* @param targetTableName 要插入到哪一个表 * @param targetTableName 要插入到哪一个表
*/ */
private void persistIcResiExtraInfo(Map<String, ColumnWrapper> headerColumnWrapper, List<Map<Integer, String>> dataRows, public void persistIcResiExtraInfo(Map<String, ColumnWrapper> headerColumnWrapper, List<Map<Integer, String>> dataRows,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel, String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
String currentUserId, String targetTableName, String customerId) { String currentUserId, String targetTableName, String customerId) {
@ -709,7 +733,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @author wxz * @author wxz
* @date 2021.10.28 21:27:18 * @date 2021.10.28 21:27:18
*/ */
private HashMap<String, List<Integer>> exchangeKeyAndValueOfHeaders(Map<Integer, List<String>> headers) { public HashMap<String, List<Integer>> exchangeKeyAndValueOfHeaders(Map<Integer, List<String>> headers) {
HashMap<String, List<Integer>> itemAndColIndexs = new LinkedHashMap<>(); HashMap<String, List<Integer>> itemAndColIndexs = new LinkedHashMap<>();
headers.forEach((k, v) -> { headers.forEach((k, v) -> {
@ -734,7 +758,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @author wxz * @author wxz
* @date 2021.10.28 21:07:12 * @date 2021.10.28 21:07:12
*/ */
private Map<Integer, String> removeAndGetOptionsFromHeaders(Map<Integer, List<String>> headers, List<FormItemResult> items) { public Map<Integer, String> removeAndGetOptionsFromHeaders(Map<Integer, List<String>> headers, List<FormItemResult> items) {
List<String> itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList()); List<String> itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList());
Map<Integer, String> abandonedOptions = new HashMap<>(); Map<Integer, String> abandonedOptions = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry:headers.entrySet()) { for (Map.Entry<Integer, List<String>> entry:headers.entrySet()) {
@ -765,7 +789,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* value列号组成的列表(例如[1,2,3]) * value列号组成的列表(例如[1,2,3])
* @return key:itemIdvaluecolumnWrapper * @return key:itemIdvaluecolumnWrapper
*/ */
private Map<String, ColumnWrapper> convertExcelHeaders2DBColumnWrappers(Map<String, FormItemResult> customizedLabelCompbinedItemsMap, Map<String, List<Integer>> combinedHeaders) { public Map<String, ColumnWrapper> convertExcelHeaders2DBColumnWrappers(Map<String, FormItemResult> customizedLabelCompbinedItemsMap, Map<String, List<Integer>> combinedHeaders) {
// HashMap<String, List<ColumnWrapper>> tables = new HashMap<>(); // HashMap<String, List<ColumnWrapper>> tables = new HashMap<>();
Map<String, ColumnWrapper> columns = new LinkedHashMap<>(combinedHeaders.size()); Map<String, ColumnWrapper> columns = new LinkedHashMap<>(combinedHeaders.size());
@ -835,7 +859,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @author wxz * @author wxz
* @date 2021.10.27 16:17:34 * @date 2021.10.27 16:17:34
*/ */
private Map<Integer, List<String>> mergeMultiLevelHeadLabels(List<Map<Integer, String>> headList) { public Map<Integer, List<String>> mergeMultiLevelHeadLabels(List<Map<Integer, String>> headList) {
Map<Integer, String> lastNotNullHeads = new LinkedHashMap<>(); Map<Integer, String> lastNotNullHeads = new LinkedHashMap<>();
@ -1013,19 +1037,11 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param response * @param response
* @throws IOException * @throws IOException
*/ */
public void downLoadResults(HttpServletResponse response) throws IOException { public void downLoadResults(Boolean hasErrorRows, HttpServletResponse response) throws IOException {
String fileName; String fileName;
// 判断是否有错误信息,以确定文件名 // 判断是否有错误信息,以确定文件名
boolean hasError = false; if (hasErrorRows) {
Map<String, List<ErrorRow>> tableAndErrorRows = errorRows.get();
for (Map.Entry<String, List<ErrorRow>> entry:tableAndErrorRows.entrySet()) {
if (entry.getValue().size() != 0) {
hasError = true;
}
}
if (hasError) {
fileName = "导入失败条目清单.xls"; fileName = "导入失败条目清单.xls";
} else { } else {
fileName = "导入成功.xls"; fileName = "导入成功.xls";
@ -1093,6 +1109,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
} }
ResiImportCategoryData oldOne = new ResiImportCategoryData( ResiImportCategoryData oldOne = new ResiImportCategoryData(
existingResiMap.get("ID"),
existingResiMap.get("AGENCY_ID"), existingResiMap.get("AGENCY_ID"),
existingResiMap.get("GRID_ID"), existingResiMap.get("GRID_ID"),
existingResiMap.get("VILLAGE_ID"), existingResiMap.get("VILLAGE_ID"),
@ -1102,7 +1119,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
existingResiCategories); existingResiCategories);
ResiImportCategoryData newOne = new ResiImportCategoryData( ResiImportCategoryData newOne = new ResiImportCategoryData(
existingResiMap.get("AGENCY_ID"), newResiMap.get("ID"),
newResiMap.get("AGENCY_ID"),
newResiMap.get("GRID_ID"), newResiMap.get("GRID_ID"),
newResiMap.get("VILLAGE_ID"), newResiMap.get("VILLAGE_ID"),
newResiMap.get("BUILD_ID"), newResiMap.get("BUILD_ID"),
@ -1153,6 +1171,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
} }
ResiImportCategoryData oldOne = new ResiImportCategoryData( ResiImportCategoryData oldOne = new ResiImportCategoryData(
existingResiMap.get("ID"),
existingResiMap.get("AGENCY_ID"), existingResiMap.get("AGENCY_ID"),
existingResiMap.get("GRID_ID"), existingResiMap.get("GRID_ID"),
existingResiMap.get("VILLAGE_ID"), existingResiMap.get("VILLAGE_ID"),
@ -1161,7 +1180,9 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
existingResiMap.get("HOME_ID"), existingResiMap.get("HOME_ID"),
oldCategories); oldCategories);
ResiImportCategoryData newOne = new ResiImportCategoryData(existingResiMap.get("AGENCY_ID"), ResiImportCategoryData newOne = new ResiImportCategoryData(
newResiMap.get("ID"),
newResiMap.get("AGENCY_ID"),
newResiMap.get("GRID_ID"), newResiMap.get("GRID_ID"),
newResiMap.get("VILLAGE_ID"), newResiMap.get("VILLAGE_ID"),
newResiMap.get("BUILD_ID"), newResiMap.get("BUILD_ID"),
@ -1180,14 +1201,20 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
private void saveSubTableInfoToCategoryChangedResiCache(String icResiId, String columnName, Map<String, String> resiInfoMap) { private void saveSubTableInfoToCategoryChangedResiCache(String icResiId, String columnName, Map<String, String> resiInfoMap) {
ResiImportResiCategoryChangedCache cc = newlyOrChangedResi.get(); ResiImportResiCategoryChangedCache cc = newlyOrChangedResi.get();
Map<String, ResiImportCategoryData> newResis = cc.getNewResis(); // Map<String, ResiImportCategoryData> newResis = cc.getNewResis();
Map<String, ResiImportChangedData> categoryChangedResis = cc.getCategoryChangedResis(); Map<String, ResiImportChangedData> categoryChangedResis = cc.getCategoryChangedResis();
Map<String, ResiImportChangedData> transferedResis = cc.getTransferedResis(); Map<String, ResiImportChangedData> transferedResis = cc.getTransferedResis();
ResiImportCategoryData newResi = newResis.get(icResiId); // ResiImportCategoryData newResi = newResis.get(icResiId);
if (newResi != null) {
String userCateRedisKey = RedisKeys.icResiImportResiCategoryKey(newlyOrChangedResi.get().getImportTag(), "add", icResiId);
Map < String, Object > addUserMap = redisUtils.hGetAll(userCateRedisKey);
if (addUserMap != null) {
//说明是新增居民 //说明是新增居民
newResi.getCategories().put(columnName, "1"); ResiImportCategoryData newResiCateData = ConvertUtils.mapToEntity(addUserMap, ResiImportCategoryData.class);
newResiCateData.getCategories().put(columnName, "1");
redisUtils.hMSet(userCateRedisKey, BeanUtil.beanToMap(newResiCateData));
newResiCateData = null;
return; return;
} }
@ -1339,35 +1366,39 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
/** /**
* 保存新增居民类别记录 * 保存新增居民类别记录
* @param newResis
*/ */
public void saveNewResiCategoryRecord(Map<String, ResiImportCategoryData> newResis) { public void saveNewResiCategoryRecord() {
Date now = new Date(); Date now = new Date();
Set<String> newResiKeys = redisUtils.keys(RedisKeys.icResiImportTypeKey(newlyOrChangedResi.get().getImportTag(), "add").concat("*"));
CustomerStaffInfoCacheResult operator = CustomerStaffRedis.getStaffInfo(loginUserUtil.getLoginUserCustomerId(), loginUserUtil.getLoginUserId()); CustomerStaffInfoCacheResult operator = CustomerStaffRedis.getStaffInfo(loginUserUtil.getLoginUserCustomerId(), loginUserUtil.getLoginUserId());
for (Map.Entry<String, ResiImportCategoryData> resi : newResis.entrySet()) { for (String resiKey : newResiKeys) {
String resiId = resi.getKey(); Map<String, Object> newResiInfoMap = redisUtils.hGetAll(resiKey);
ResiImportCategoryData data = resi.getValue(); ResiImportCategoryData newResiInfoObj = ConvertUtils.mapToEntity(newResiInfoMap, ResiImportCategoryData.class);
IcResiUserEntity resiInfo = icResiUserDao.selectById(resiId); IcResiUserEntity resiInfo = icResiUserDao.selectById(newResiInfoObj.getResiId());
// 插入changeRecord // 插入changeRecord
IcUserChangeRecordEntity changeRecord = fillChangeRecord(loginUserUtil.getLoginUserCustomerId(), resiId, resiInfo.getName(), null, IcUserChangeRecordEntity changeRecord = fillChangeRecord(loginUserUtil.getLoginUserCustomerId(), newResiInfoObj.getResiId(), resiInfo.getName(), null,
loginUserUtil.getLoginUserId(), operator.getRealName(), "-", "-", loginUserUtil.getLoginUserId(), operator.getRealName(), "-", "-",
"add", "新增", "", now); "add", "新增", "", now);
icUserChangeRecordDao.insert(changeRecord); icUserChangeRecordDao.insert(changeRecord);
// 插入changeDetail // 插入changeDetail
for (Map.Entry<String, String> column : data.getCategories().entrySet()) { for (Map.Entry<String, String> column : newResiInfoObj.getCategories().entrySet()) {
IcUserChangeDetailedEntity changedetail = fillChangeDetail(loginUserUtil.getLoginUserCustomerId(), resiId, changeRecord.getId(), data.getAgencyId(), IcUserChangeDetailedEntity changedetail = fillChangeDetail(loginUserUtil.getLoginUserCustomerId(), newResiInfoObj.getResiId(), changeRecord.getId(), newResiInfoObj.getAgencyId(),
data.getGridId(), data.getVillageId(), data.getBuildId(), data.getUnitId(), newResiInfoObj.getGridId(), newResiInfoObj.getVillageId(), newResiInfoObj.getBuildId(), newResiInfoObj.getUnitId(),
data.getHomeId(), "add", "新增", column.getKey(), 1, resiInfo.getPids()); newResiInfoObj.getHomeId(), "add", "新增", column.getKey(), 1, resiInfo.getPids());
icUserChangeDetailedDao.insert(changedetail); icUserChangeDetailedDao.insert(changedetail);
} changedetail = null;
} }
changeRecord = null;
newResiInfoObj = null;
}
} }
/** /**

57
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/ImportTaskServiceImpl.java

@ -0,0 +1,57 @@
package com.epmet.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.epmet.constant.ImportTaskConstants;
import com.epmet.dao.ImportTaskDao;
import com.epmet.entity.ImportTaskEntity;
import com.epmet.service.ImportTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
*
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-02-15
*/
@Service
public class ImportTaskServiceImpl implements ImportTaskService {
@Autowired
private ImportTaskDao importRecordDao;
/**
* 该用户该业务类型是否有正在处理的导入任务
* @param operatorId 操作者ID
* @param bizType 业务类型resi居民
* @return
*/
@Override
public boolean existsProcessingTask(String operatorId, String bizType) {
LambdaQueryWrapper<ImportTaskEntity> query = new LambdaQueryWrapper<>();
query.eq(ImportTaskEntity::getOperatorId, operatorId);
query.eq(ImportTaskEntity::getBizType, bizType);
query.eq(ImportTaskEntity::getProcessStatus, ImportTaskConstants.PROCESS_STATUS_PROCESSING);
return importRecordDao.selectCount(query) > 0;
}
@Override
public String createProcessTask(String operatorId, String bizType) {
ImportTaskEntity importRecord = new ImportTaskEntity();
importRecord.setProcessStatus(ImportTaskConstants.PROCESS_STATUS_PROCESSING);
importRecord.setOperatorId(operatorId);
importRecord.setBizType(bizType);
importRecord.setStartTime(new Date());
importRecordDao.insert(importRecord);
return importRecord.getId();
}
@Override
public Boolean finish(String taskId, String processStatus, String operatorId, String resultDescFile, String resultDesc) {
return importRecordDao.finish(taskId, processStatus, operatorId, resultDesc, resultDescFile) > 0;
}
}

5
epmet-user/epmet-user-server/src/main/resources/bootstrap.yml

@ -79,6 +79,11 @@ spring:
namespace: @nacos.config.namespace@ namespace: @nacos.config.namespace@
group: @nacos.config.group@ group: @nacos.config.group@
file-extension: yaml file-extension: yaml
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
management: management:
endpoints: endpoints:
web: web:

33
epmet-user/epmet-user-server/src/main/resources/mapper/ImportTaskDao.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.epmet.dao.ImportTaskDao">
<resultMap type="com.epmet.entity.ImportTaskEntity" id="importRecordMap">
<result property="id" column="ID"/>
<result property="bizType" column="BIZ_TYPE"/>
<result property="processStatus" column="PROCESS_STATUS"/>
<result property="operatorId" column="OPERATOR_ID"/>
<result property="startTime" column="START_TIME"/>
<result property="resultDescFile" column="RESULT_DESC_FILE"/>
<result property="resultDesc" column="RESULT_DESC"/>
<result property="delFlag" column="DEL_FLAG"/>
<result property="revision" column="REVISION"/>
<result property="createdBy" column="CREATED_BY"/>
<result property="createdTime" column="CREATED_TIME"/>
<result property="updatedBy" column="UPDATED_BY"/>
<result property="updatedTime" column="UPDATED_TIME"/>
</resultMap>
<!--完成导入-->
<update id="finish">
update import_task
set PROCESS_STATUS = #{process_status},
RESULT_DESC = #{resultDesc},
RESULT_DESC_FILE = #{resultDescFile},
UPDATED_BY=#{operatorId},
UPDATED_TIME=NOW()
where ID=#{taskId}
and PROCESS_STATUS = 'processing'
</update>
</mapper>
Loading…
Cancel
Save