Browse Source

修改:

调整ic居民导入,将导入逻辑移到单独的service中IcResiUserImportService
master
wangxianzhang 4 years ago
parent
commit
6e8138ecd0
  1. 6
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java
  2. 12
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java
  3. 2
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java
  4. 718
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java
  5. 654
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

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

@ -33,6 +33,7 @@ import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.OperCustomizeOpenFeignClient;
import com.epmet.service.IcResiUserImportService;
import com.epmet.service.IcResiUserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -67,7 +68,7 @@ public class IcResiUserController {
@Autowired
private IcResiUserService icResiUserService;
@Autowired
private EpmetUserOpenFeignClient epmetUserOpenFeignClient;
private IcResiUserImportService icResiUserImportService;
/**
* @Author sun
@ -216,12 +217,11 @@ public class IcResiUserController {
/**
* excel导入居民基本信息
*
* @param loginUser
* @return
*/
@PostMapping("import/excel")
public Result importExcelByEasyExcel() {
Object result = icResiUserService.importIcResiInfoFromExcel();
Object result = icResiUserImportService.importIcResiInfoFromExcel();
return new Result().ok(result);
}

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

@ -0,0 +1,12 @@
package com.epmet.service;
/**
*@Description 居民信息导入service
*@Author wangxianzhang
*@Date 2021/11/4
*/
public interface IcResiUserImportService {
Object importIcResiInfoFromExcel();
}

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

@ -70,7 +70,7 @@ public interface IcResiUserService extends BaseService<IcResiUserEntity> {
*/
Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO);
Object importIcResiInfoFromExcel();
List<Map<String,Object>> dynamicQuery(String customerId,
String formCode,

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

@ -0,0 +1,718 @@
package com.epmet.service.impl;
import com.alibaba.excel.EasyExcelFactory;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.dto.result.OptionResultDTO;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.feign.ResultDataResolver;
import com.epmet.commons.tools.security.user.LoginUserUtil;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dao.IcResiUserDao;
import com.epmet.dto.*;
import com.epmet.dto.form.AgencyIdFormDTO;
import com.epmet.dto.form.CustomerFormQueryDTO;
import com.epmet.dto.form.HouseFormDTO;
import com.epmet.dto.form.LoginUserDetailsFormDTO;
import com.epmet.dto.result.FormItem;
import com.epmet.dto.result.LoginUserDetailsResultDTO;
import com.epmet.dto.result.OptionDTO;
import com.epmet.entity.IcResiUserEntity;
import com.epmet.excel.handler.DynamicEasyExcelListener;
import com.epmet.feign.EpmetAdminOpenFeignClient;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.GovOrgOpenFeignClient;
import com.epmet.feign.OperCustomizeOpenFeignClient;
import com.epmet.service.IcResiUserImportService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName IcResiUserImportServiceImpl
* @Description TODO
* @Author wangxianzhang
* @Date 2021/11/4 8:53 下午
* @Version 1.0
*/
@Slf4j
@Service
public class IcResiUserImportServiceImpl implements IcResiUserImportService, ResultDataResolver {
public static final ThreadLocal errorRow = new ThreadLocal<ErrorRow>();
@Autowired
private LoginUserUtil loginUserUtil;
@Autowired
private EpmetUserOpenFeignClient epmetUserOpenFeignClient;
@Autowired
private EpmetAdminOpenFeignClient adminOpenFeignClient;
@Autowired
private GovOrgOpenFeignClient govOrgOpenFeignClient;
@Autowired
private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient;
@Autowired
private IcResiUserDao icResiUserDao;
/**
* @description 列信息封装
*
* @return
* @author wxz
* @date 2021.10.28 22:18:05
*/
@Data
public static class ColumnWrapper {
private String combinedLabel;
private String columnName;
private String itemType;
private String itemId;
private List<Integer> colIndexs;
//private List<String> colContents;
// 单元格内容
private String cellContent;
// 数据库中列的值
private String colValue;
// key:label,value:value
private Map<String, String> options;
/**
* 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用URL:接口获取(LABEL,VALUE)JSON:直接从JSON中取
*/
private String optionSourceType;
/**
* 来源地址,REMOTE才有固定格式;如果OPTIONS_SOURCE是URL则此处填写要调用的接口的URL相对路径例如/API/GOV/ORG/XXXX此处不应设置参数若需要参数应当完全由后端通过TOKEN信息来获取
*/
private String optionSourceValue;
}
/**
* 错误行信息
*/
public static class ErrorRow {
private String sheetName;
private String idCard;
private String name;
private String errorInfo;
}
/**
* 导入居民信息
* 导入主表和所有子表信息
* @return
*/
@Override
public Object importIcResiInfoFromExcel() {
String loginUserId = loginUserUtil.getLoginUserId();
String loginUserApp = loginUserUtil.getLoginUserApp();
String loginUserClient = loginUserUtil.getLoginUserClient();
LoginUserDetailsFormDTO userForm = new LoginUserDetailsFormDTO();
userForm.setApp(loginUserApp);
userForm.setClient(loginUserClient);
userForm.setUserId(loginUserId);
LoginUserDetailsResultDTO loginUserDetails = getResultDataOrThrowsException(epmetUserOpenFeignClient.getLoginUserDetails(userForm), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
String currUserAgencyId = loginUserDetails.getAgencyId();
String excelPathName = "/opt/test/基础信息表/resi_info.xls";
CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
String customerId = agencyInfo.getCustomerId();
importIcResiBaseInfoFromExcel(excelPathName, 0, 3, currUserAgencyId, agencyInfo.getPids(), loginUserId);
importIcResiExtraInfoFromExcel(excelPathName, 1, 2, currUserAgencyId, loginUserId, "ic_party_member", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 2, 2, currUserAgencyId, loginUserId, "ic_ensure_house", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 3, 2, currUserAgencyId, loginUserId, "ic_unemployed", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 4, 2, currUserAgencyId, loginUserId, "ic_veterans", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 5, 2, currUserAgencyId, loginUserId, "ic_united_front", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 6, 3, currUserAgencyId, loginUserId, "ic_volunteer", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 7, 2, currUserAgencyId, loginUserId, "ic_old_people", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 8, 3, currUserAgencyId, loginUserId, "ic_special", customerId);
return null;
}
/**
* excel导入居民基本信息
* @param sheetNo
* @param headRowNumber
* @param currUserAgencyId
* @param currUserAgencyPids
* @param currentUserId
* @return
*/
private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
EasyExcelFactory.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();
Map<Integer, List<String>> headers = mergeHead(headList);
// 查询form相关信息
List<FormItem> customerItems = listFormItems("resi_base_info");
// 清洗表头数据
Map<Integer, String> abandonedHeaders = washHeaders(headers, customerItems);
//合并多级表头
HashMap<String, List<Integer>> combinedHeaders = combineHeaders(headers);
// 得到客户配置item数据
Map<String, FormItem> formItemMap = customerItems.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, dataList, abandonedHeaders);
// 持久化
persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId);
return headers;
}
/**
* excel导入居民附加信息
* @param excelPathName
* @param sheetNo
* @param headRowNumber
* @param currUserAgencyId
* @param currentUserId
* @param targetTableName 要插入哪一个表
* @return
*/
private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId,
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();
List<Map<Integer, String>> dataList = readListener.getDataList();
Map<Integer, List<String>> headers = mergeHead(headList);
// 查询form相关信息
List<FormItem> customerItems = listFormItems("resi_base_info");
// 清洗表头数据
Map<Integer, String> abandonedHeaders = washHeaders(headers, customerItems);
//合并多级表头
HashMap<String, List<Integer>> combinedHeaders = combineHeaders(headers);
// 得到客户配置item数据
Map<String, FormItem> formItemMap = customerItems.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, dataList, abandonedHeaders);
persistIcResiExtraInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, targetTableName, customerId);
return headerColumnWrapper;
}
/**
* 持久化IC居民基础信息
* @param headerColumnWrapper 数据库列包装信息
* @param dataRows 数据行集合
* @param currUserAgencyId 当前用户的组织id
* @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文
*/
private void persistIcResiBaseInfo(Map<String, ColumnWrapper> headerColumnWrapper, List<Map<Integer, String>> dataRows,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
String currUserAgencyPids, String currentUserId) {
// 遍历每一行,将行内容转化为
for (Map<Integer, String> row : dataRows) {
LinkedHashMap<String, String> columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel);
columnAndValues.put("IS_ENSURE_HOUSE", "0");
columnAndValues.put("IS_OLD_PEOPLE", "0");
columnAndValues.put("IS_PARTY", "0");
columnAndValues.put("IS_SPECIAL", "0");
columnAndValues.put("IS_UNEMPLOYED", "0");
columnAndValues.put("IS_UNITED_FRONT", "0");
columnAndValues.put("IS_VETERANS", "0");
columnAndValues.put("IS_VOLUNTEER", "0");
columnAndValues.put("AGENCY_ID", currUserAgencyId);
columnAndValues.put("PIDS", currUserAgencyPids);
columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId());
columnAndValues.put("CREATED_BY", currentUserId);
columnAndValues.put("UPDATED_BY", currentUserId);
columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", ""));
// 验证居民信息是否存在
String idCard = columnAndValues.get("ID_CARD");
LambdaQueryWrapper<IcResiUserEntity> idCardQuery = new LambdaQueryWrapper<>();
idCardQuery.eq(IcResiUserEntity::getIdCard, idCard);
if (icResiUserDao.selectCount(idCardQuery) > 0) {
log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard);
}
icResiUserDao.add("ic_resi_user", columnAndValues);
}
}
/**
* 持久化IC居民附加信息
* @param headerColumnWrapper 数据库列包装信息
* @param dataRows 数据行集合
* @param currUserAgencyId 当前用户的组织id
* @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文
* @param targetTableName 要插入到哪一个表
*/
private void persistIcResiExtraInfo(Map<String, ColumnWrapper> headerColumnWrapper, List<Map<Integer, String>> dataRows,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
String currentUserId, String targetTableName, String customerId) {
// 遍历每一行,将行内容转化为
for (Map<Integer, String> row : dataRows) {
LinkedHashMap<String, String> columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel);
// 检验身份证号
String idCard = columnAndValues.get("ID_CARD");
if (StringUtils.isBlank(idCard)) {
throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME")));
}
// 检查用户是否存在
LambdaQueryWrapper<IcResiUserEntity> idCardQuery = new LambdaQueryWrapper<>();
idCardQuery.eq(IcResiUserEntity::getIdCard, idCard);
IcResiUserEntity icResiUserBaseInfo = icResiUserDao.selectOne(idCardQuery);
if (icResiUserBaseInfo == null) {
throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard));
}
String icResiId = icResiUserBaseInfo.getId();
// 验证党员信息是否存在
if (CollectionUtils.isNotEmpty(icResiUserDao.selectSubTableRecords(customerId, icResiId, targetTableName))) {
log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName);
continue;
}
columnAndValues.put("IC_RESI_USER", icResiId);
columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId());
columnAndValues.put("CREATED_BY", currentUserId);
columnAndValues.put("UPDATED_BY", currentUserId);
columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", ""));
columnAndValues = removeNeedlessColumns(columnAndValues);
icResiUserDao.add(targetTableName, columnAndValues);
}
}
/**
* 去掉多余的列
* @param originColumnAndValues
* @return
*/
private LinkedHashMap<String, String> removeNeedlessColumns(LinkedHashMap<String, String> originColumnAndValues) {
List<String> needlessColumns = Arrays.asList("GRID_ID", "VILLAGE_ID", "BUILD_ID", "UNIT_ID", "HOME_ID",
"IS_BDHJ", "NAME", "MOBILE", "GENDER", "ID_CARD",
"BIRTHDAY", "CONTACTS", "CONTACTS_MOBILE");
LinkedHashMap<String, String> newMap = new LinkedHashMap();
originColumnAndValues.entrySet().forEach(b -> {
if (!needlessColumns.contains(b.getKey())) {
newMap.put(b.getKey(), b.getValue());
}
});
return newMap;
}
/**
* 将当前行数据转化成LinkedHashMap供后续插入
* @param headerColumnWrapper 当前行的ColumnWrapper每一个ColumnWrapper元素都是当前行中的一个列
* @param row 当前行数据
* @param currUserAgencyId 当前用户所属机构ID
* @param checkBoxOptionColumnIdxAndLabel 复选框options列表key:列号value复选框中文
* @return
*/
private LinkedHashMap<String, String> convertColumnWrappers2Map4Persist(Map<String, ColumnWrapper> headerColumnWrapper, Map<Integer, String> row,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel) {
LinkedHashMap<String, String> columnAndValues = new LinkedHashMap<>();
for (Map.Entry<String, ColumnWrapper> columnWrapperEntry : headerColumnWrapper.entrySet()) {
ColumnWrapper columnWrapper = columnWrapperEntry.getValue();
if ("input".equals(columnWrapper.getItemType())
|| "textarea".equals(columnWrapper.getItemType())
|| "datepicker".equals(columnWrapper.getItemType())
|| "daterange".equals(columnWrapper.getItemType())
) {
String cellContent = row.get(columnWrapper.getColIndexs().get(0));
columnWrapper.setCellContent(cellContent);
columnWrapper.setColValue(cellContent);
} else if ("select".equals(columnWrapper.getItemType())
|| "radio".equals(columnWrapper.getItemType())){
String optionSourceType = columnWrapper.getOptionSourceType();
// 取单元格的内容
String cellContent = row.get(columnWrapper.getColIndexs().get(0));
columnWrapper.setCellContent(cellContent);
if ("local".equals(optionSourceType)) {
// 根据单元格内容,取到指定的option
Map<String, String> options = columnWrapper.getOptions();
String colValue = options.get(cellContent);
columnWrapper.setColValue(colValue);
} else {
// remote类型
Map<String, String> options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId);
String colValue = options.get(cellContent);
columnWrapper.setColValue(colValue);
}
} else if ("checkbox".equals(columnWrapper.getItemType())) {
String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel);
columnWrapper.setColValue(checkBoxColValue);
}
columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue);
}
return columnAndValues;
}
/**
* 根据formCode查询该form的item列表
* @param formCode
* @return
*/
private List<FormItem> listFormItems(String formCode) {
CustomerFormQueryDTO form = new CustomerFormQueryDTO();
form.setFormCode(formCode);
Result<List<FormItem>> result = operCustomizeOpenFeignClient.listItems(form);
return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败");
}
/**
* @description 合并头
*
* @param headers
* @return
* @author wxz
* @date 2021.10.28 21:27:18
*/
private HashMap<String, List<Integer>> combineHeaders(Map<Integer, List<String>> headers) {
HashMap<String, List<Integer>> itemAndColIndexs = new LinkedHashMap<>();
headers.forEach((k, v) -> {
String tempKey = String.join(":", v);
List<Integer> colIndexs = itemAndColIndexs.get(tempKey);
if (colIndexs == null) {
colIndexs = new ArrayList<>();
itemAndColIndexs.put(tempKey, colIndexs);
}
colIndexs.add(k);
});
return itemAndColIndexs;
}
/**
* @description 洗头
*
* @param headers
* @param items
* @return
* @author wxz
* @date 2021.10.28 21:07:12
*/
private Map<Integer, String> washHeaders(Map<Integer, List<String>> headers, List<FormItem> items) {
List<String> itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList());
Map<Integer, String> abandonedHeaders = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry:headers.entrySet()) {
Integer colIdx = entry.getKey();
List<String> v = entry.getValue();
int lastPartIndex = v.size() - 1;
String lastValuePart = v.get(lastPartIndex);
if (!itemLabels.contains(lastValuePart)) {
// 该部分为options,它的上一级是item,那么去掉options这一级
v.remove(lastPartIndex);
abandonedHeaders.put(colIdx, lastValuePart);
}
}
return abandonedHeaders;
}
/**
* @description 数据整合将excel表头汉字信息转化成ColumnWrapper列封装数据
* * key:itemId
* * value:ColumnWrapper列包装信息
* @param formItemMap item map
* key:itemId;
* value: 合并之后的head字符串例如健康信息:监护人
* @param combinedHeaders 合并之后的head信息
* key合并之后head字符串(例如党员信息:入党时间)
* value列号组成的列表(例如[1,2,3])
* @param datas
* @param abandonedHeaders
* @return
*/
private Map<String, ColumnWrapper> convertExcelHeaders2DBColumnWrappers(Map<String, FormItem> formItemMap, Map<String, List<Integer>> combinedHeaders,
List<Map<Integer, String>> datas, Map<Integer, String> abandonedHeaders) {
// HashMap<String, List<ColumnWrapper>> tables = new HashMap<>();
Map<String, ColumnWrapper> columns = new LinkedHashMap<>(combinedHeaders.size());
for (Map.Entry<String, List<Integer>> entry : combinedHeaders.entrySet()) {
String combinedHeader = entry.getKey();
FormItem item = formItemMap.get(combinedHeader);
if (item == null) {
// 如果数据库中没有该项,可能是用户自己定义的项,忽略
continue;
}
ColumnWrapper columnWrapper = new ColumnWrapper();
// 填充options
columnWrapper.setItemType(item.getItemType());
columnWrapper.setItemId(item.getItemId());
String groupLabel = item.getGroupLabel();
String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel());
columnWrapper.setCombinedLabel(combinedLabel);
columnWrapper.setColumnName(item.getColumnName());
columnWrapper.setColIndexs(entry.getValue());
columnWrapper.setOptionSourceType(item.getOptionSourceType());
columnWrapper.setOptionSourceValue(item.getOptionSourceValue());
columnWrapper.setOptions(item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue)));
columns.put(item.getItemId(), columnWrapper);
}
return columns;
}
/**
* 获取checkbox列值
* @param columnWrapper 数据库列包装信息每一列跳数据对应数据库的一个列
* @param dataRow 数据行每一条都是一行中的一个单元格
* @param checkboxOptions 复选框的选项k: 列号, value: checkboxlabel中文
* @return
*/
private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map<Integer, String> dataRow, Map<Integer, String> checkboxOptions) {
Map<String, String> options = columnWrapper.getOptions();
List<Integer> colIndexs = columnWrapper.getColIndexs();
List<String> optionValues = colIndexs.stream().filter(i -> {
String cellContent = dataRow.get(i);
return StringUtils.isNotBlank(cellContent) && cellContent.equals("是");
}).map(i -> {
String checkboxOptionLabel = checkboxOptions.get(i);
return options.get(checkboxOptionLabel);
}).collect(Collectors.toList());
return String.join(",", optionValues);
}
/**
* @description 合并表头
* Map<Integer, List<String>>
*
* @param headList
* @return
* @author wxz
* @date 2021.10.27 16:17:34
*/
private Map<Integer, List<String>> mergeHead(List<Map<Integer, String>> headList) {
Map<Integer, String> lastNotNullHeads = new LinkedHashMap<>();
Map<Integer, List<String>> mergedHead = new LinkedHashMap<>();
int levelCount = headList.size();
Map<Integer, String> firstLevel = headList.get(0);
// 遍历所有列
for (Map.Entry<Integer, String> column : firstLevel.entrySet()) {
Integer columIndex = column.getKey();
List<String> labels = new ArrayList<>();
// 竖着遍历该列的所有行
for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) {
String label = headList.get(currentLevel).get(columIndex);
if (StringUtils.isNotBlank(label)) {
lastNotNullHeads.put(currentLevel, label);
} else {
if (currentLevel == 0 || StringUtils.isBlank(headList.get(currentLevel - 1).get(columIndex))) {
label = lastNotNullHeads.get(currentLevel);
}
}
if (StringUtils.isNotBlank(label)) {
labels.add(label);
}
}
mergedHead.put(columIndex, labels);
}
return mergedHead;
}
/**
* 远程获取options
* @param fullUri
* @return
*/
public Map<String, String> listRemoteOptions(Map<String, ColumnWrapper> columnWrappers, String fullUri, String currUserAgencyId) {
String pureUri = null;
String cascadeItemId = null;
ColumnWrapper cascadeItemColumnWrapper = null;
if (fullUri.indexOf("?") != -1) {
String[] uriParts = fullUri.split("\\?");
pureUri = uriParts[0];
cascadeItemId = uriParts[1];
// 根据uri上的id,找到关联的itemid,从而找到关联的item的值
if (columnWrappers != null){
cascadeItemColumnWrapper = columnWrappers.get(cascadeItemId);
}
} else {
pureUri = fullUri;
}
List<OptionResultDTO> options = null;
switch (pureUri) {
case "/epmetuser/icresidemanddict/demandoption":
options = getResultDataOrThrowsException(epmetUserOpenFeignClient.getDemandOptions(), ServiceConstant.EPMET_USER_SERVER,
EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/customergrid/gridoption":
AgencyIdFormDTO form = new AgencyIdFormDTO();
form.setAgencyId(currUserAgencyId);
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/customerpartybranch/branchoption":
CustomerPartyBranchDTO bform = new CustomerPartyBranchDTO();
bform.setGridId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/icbuilding/buildingoption":
IcBuildingDTO buildingform = new IcBuildingDTO();
buildingform.setNeighborHoodId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/icbuildingunit/unitoption":
IcBuildingUnitDTO buForm = new IcBuildingUnitDTO();
buForm.setBuildingId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/ichouse/houseoption":
HouseFormDTO hform = new HouseFormDTO();
hform.setUnitId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/icneighborhood/neighborhoodoption":
IcNeighborHoodDTO nform = new IcNeighborHoodDTO();
nform.setAgencyId(currUserAgencyId);
nform.setGridId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/education":
options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/house":
options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/nation":
options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/ninesmallplaces":
options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/relationship":
options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
}
if (options == null) {
return null;
}
return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue));
// 通用api调用,无法实现
/*if (!uri.startsWith("/api")) uri = "/api".concat(uri);
NamingService namingService = discoveryProperties.namingServiceInstance();
ResponseEntity<Result<List<OptionResultDTO>>> response = null;
try {
// 调用gateway服务,查询相关接口
Instance gatewayInstance = namingService.getAllInstances(ServiceConstant.EPMET_GATEWAY).get(0);
String ip = gatewayInstance.getIp();
int port = gatewayInstance.getPort();
String url = String.format("http://%s:%s%s", ip, port, uri);
ParameterizedTypeReference<Result<List<OptionResultDTO>>> tr = new ParameterizedTypeReference<Result<List<OptionResultDTO>>>() {};
response = new RestTemplate().exchange(url, HttpMethod.POST, null, tr);
} catch (NacosException e) {
e.printStackTrace();
}
if (response != null && (response.getStatusCode() == HttpStatus.OK)) {
List<OptionResultDTO> options = response.getBody().getData();
if (options == null) {
System.out.println(6);
}
return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue));
} else {
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode());
}*/
}
}

654
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

@ -50,6 +50,7 @@ import com.epmet.entity.IcPartyMemberEntity;
import com.epmet.entity.IcResiUserEntity;
import com.epmet.excel.handler.DynamicEasyExcelListener;
import com.epmet.feign.*;
import com.epmet.service.IcResiUserImportService;
import com.epmet.service.IcResiUserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@ -75,24 +76,17 @@ import java.util.stream.Stream;
*/
@Slf4j
@Service
public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResiUserEntity> implements IcResiUserService, ResultDataResolver {
public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResiUserEntity> implements IcResiUserService {
@Autowired
private GovOrgOpenFeignClient govOrgOpenFeignClient;
@Autowired
private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient;
@Autowired
private EpmetUserOpenFeignClient epmetUserOpenFeignClient;
@Autowired
private EpmetAdminOpenFeignClient adminOpenFeignClient;
@Autowired
private LoginUserUtil loginUserUtil;
@Autowired
private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient;
@Autowired
private IcResiUserImportServiceImpl icResiUserImportService;
private QueryWrapper<IcResiUserEntity> getWrapper(Map<String, Object> params){
String id = (String)params.get(FieldConstant.ID_HUMP);
@ -451,644 +445,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
return resultMap;
}
/**
* 导入居民信息
* 导入主表和所有子表信息
* @return
*/
@Override
public Object importIcResiInfoFromExcel() {
String loginUserId = loginUserUtil.getLoginUserId();
String loginUserApp = loginUserUtil.getLoginUserApp();
String loginUserClient = loginUserUtil.getLoginUserClient();
LoginUserDetailsFormDTO userForm = new LoginUserDetailsFormDTO();
userForm.setApp(loginUserApp);
userForm.setClient(loginUserClient);
userForm.setUserId(loginUserId);
LoginUserDetailsResultDTO loginUserDetails = getResultDataOrThrowsException(epmetUserOpenFeignClient.getLoginUserDetails(userForm), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
String currUserAgencyId = loginUserDetails.getAgencyId();
String excelPathName = "/opt/test/基础信息表/resi_info.xls";
CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
String customerId = agencyInfo.getCustomerId();
importIcResiBaseInfoFromExcel(excelPathName, 0, 3, currUserAgencyId, agencyInfo.getPids(), loginUserId);
importIcResiExtraInfoFromExcel(excelPathName, 1, 2, currUserAgencyId, loginUserId, "ic_party_member", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 2, 2, currUserAgencyId, loginUserId, "ic_ensure_house", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 3, 2, currUserAgencyId, loginUserId, "ic_unemployed", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 4, 2, currUserAgencyId, loginUserId, "ic_veterans", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 5, 2, currUserAgencyId, loginUserId, "ic_united_front", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 6, 3, currUserAgencyId, loginUserId, "ic_volunteer", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 7, 2, currUserAgencyId, loginUserId, "ic_old_people", customerId);
importIcResiExtraInfoFromExcel(excelPathName, 8, 3, currUserAgencyId, loginUserId, "ic_special", customerId);
return new Object();
}
/**
* excel导入居民基本信息
* @param sheetNo
* @param headRowNumber
* @param currUserAgencyId
* @param currUserAgencyPids
* @param currentUserId
* @return
*/
private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
EasyExcelFactory.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();
Map<Integer, List<String>> headers = mergeHead(headList);
// 查询form相关信息
List<FormItem> customerItems = listFormItems("resi_base_info");
// 清洗表头数据
Map<Integer, String> abandonedHeaders = washHeaders(headers, customerItems);
//合并多级表头
HashMap<String, List<Integer>> combinedHeaders = combineHeaders(headers);
// 得到客户配置item数据
Map<String, FormItem> formItemMap = customerItems.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, dataList, abandonedHeaders);
// 持久化
persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId);
return headers;
}
/**
* excel导入居民附加信息
* @param excelPathName
* @param sheetNo
* @param headRowNumber
* @param currUserAgencyId
* @param currentUserId
* @param targetTableName 要插入哪一个表
* @return
*/
private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId,
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();
List<Map<Integer, String>> dataList = readListener.getDataList();
Map<Integer, List<String>> headers = mergeHead(headList);
// 查询form相关信息
List<FormItem> customerItems = listFormItems("resi_base_info");
// 清洗表头数据
Map<Integer, String> abandonedHeaders = washHeaders(headers, customerItems);
//合并多级表头
HashMap<String, List<Integer>> combinedHeaders = combineHeaders(headers);
// 得到客户配置item数据
Map<String, FormItem> formItemMap = customerItems.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, dataList, abandonedHeaders);
persistIcResiExtraInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, targetTableName, customerId);
return headerColumnWrapper;
}
/**
* 持久化IC居民基础信息
* @param headerColumnWrapper 数据库列包装信息
* @param dataRows 数据行集合
* @param currUserAgencyId 当前用户的组织id
* @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文
*/
private void persistIcResiBaseInfo(Map<String, ColumnWrapper> headerColumnWrapper, List<Map<Integer, String>> dataRows,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
String currUserAgencyPids, String currentUserId) {
// 遍历每一行,将行内容转化为
for (Map<Integer, String> row : dataRows) {
LinkedHashMap<String, String> columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel);
columnAndValues.put("IS_ENSURE_HOUSE", "0");
columnAndValues.put("IS_OLD_PEOPLE", "0");
columnAndValues.put("IS_PARTY", "0");
columnAndValues.put("IS_SPECIAL", "0");
columnAndValues.put("IS_UNEMPLOYED", "0");
columnAndValues.put("IS_UNITED_FRONT", "0");
columnAndValues.put("IS_VETERANS", "0");
columnAndValues.put("IS_VOLUNTEER", "0");
columnAndValues.put("AGENCY_ID", currUserAgencyId);
columnAndValues.put("PIDS", currUserAgencyPids);
columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId());
columnAndValues.put("CREATED_BY", currentUserId);
columnAndValues.put("UPDATED_BY", currentUserId);
columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", ""));
// 验证居民信息是否存在
String idCard = columnAndValues.get("ID_CARD");
LambdaQueryWrapper<IcResiUserEntity> idCardQuery = new LambdaQueryWrapper<>();
idCardQuery.eq(IcResiUserEntity::getIdCard, idCard);
if (baseDao.selectCount(idCardQuery) > 0) {
log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard);
}
baseDao.add("ic_resi_user", columnAndValues);
}
}
/**
* 持久化IC居民附加信息
* @param headerColumnWrapper 数据库列包装信息
* @param dataRows 数据行集合
* @param currUserAgencyId 当前用户的组织id
* @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文
* @param targetTableName 要插入到哪一个表
*/
private void persistIcResiExtraInfo(Map<String, ColumnWrapper> headerColumnWrapper, List<Map<Integer, String>> dataRows,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
String currentUserId, String targetTableName, String customerId) {
// 遍历每一行,将行内容转化为
for (Map<Integer, String> row : dataRows) {
LinkedHashMap<String, String> columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel);
// 检验身份证号
String idCard = columnAndValues.get("ID_CARD");
if (StringUtils.isBlank(idCard)) {
throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME")));
}
// 检查用户是否存在
LambdaQueryWrapper<IcResiUserEntity> idCardQuery = new LambdaQueryWrapper<>();
idCardQuery.eq(IcResiUserEntity::getIdCard, idCard);
IcResiUserEntity icResiUserBaseInfo = baseDao.selectOne(idCardQuery);
if (icResiUserBaseInfo == null) {
throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard));
}
String icResiId = icResiUserBaseInfo.getId();
// 验证党员信息是否存在
if (CollectionUtils.isNotEmpty(baseDao.selectSubTableRecords(customerId, icResiId, targetTableName))) {
log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName);
continue;
}
columnAndValues.put("IC_RESI_USER", icResiId);
columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId());
columnAndValues.put("CREATED_BY", currentUserId);
columnAndValues.put("UPDATED_BY", currentUserId);
columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", ""));
columnAndValues = removeNeedlessColumns(columnAndValues);
baseDao.add(targetTableName, columnAndValues);
}
}
/**
* 去掉多余的列
* @param originColumnAndValues
* @return
*/
private LinkedHashMap<String, String> removeNeedlessColumns(LinkedHashMap<String, String> originColumnAndValues) {
List<String> needlessColumns = Arrays.asList("GRID_ID", "VILLAGE_ID", "BUILD_ID", "UNIT_ID", "HOME_ID",
"IS_BDHJ", "NAME", "MOBILE", "GENDER", "ID_CARD",
"BIRTHDAY", "CONTACTS", "CONTACTS_MOBILE");
LinkedHashMap<String, String> newMap = new LinkedHashMap();
originColumnAndValues.entrySet().forEach(b -> {
if (!needlessColumns.contains(b.getKey())) {
newMap.put(b.getKey(), b.getValue());
}
});
return newMap;
}
/**
* 将当前行数据转化成LinkedHashMap供后续插入
* @param headerColumnWrapper 当前行的ColumnWrapper每一个ColumnWrapper元素都是当前行中的一个列
* @param row 当前行数据
* @param currUserAgencyId 当前用户所属机构ID
* @param checkBoxOptionColumnIdxAndLabel 复选框options列表key:列号value复选框中文
* @return
*/
private LinkedHashMap<String, String> convertColumnWrappers2Map4Persist(Map<String, ColumnWrapper> headerColumnWrapper, Map<Integer, String> row,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel) {
LinkedHashMap<String, String> columnAndValues = new LinkedHashMap<>();
for (Map.Entry<String, ColumnWrapper> columnWrapperEntry : headerColumnWrapper.entrySet()) {
ColumnWrapper columnWrapper = columnWrapperEntry.getValue();
if ("input".equals(columnWrapper.getItemType())
|| "textarea".equals(columnWrapper.getItemType())
|| "datepicker".equals(columnWrapper.getItemType())
|| "daterange".equals(columnWrapper.getItemType())
) {
String cellContent = row.get(columnWrapper.getColIndexs().get(0));
columnWrapper.setCellContent(cellContent);
columnWrapper.setColValue(cellContent);
} else if ("select".equals(columnWrapper.getItemType())
|| "radio".equals(columnWrapper.getItemType())){
String optionSourceType = columnWrapper.getOptionSourceType();
// 取单元格的内容
String cellContent = row.get(columnWrapper.getColIndexs().get(0));
columnWrapper.setCellContent(cellContent);
if ("local".equals(optionSourceType)) {
// 根据单元格内容,取到指定的option
Map<String, String> options = columnWrapper.getOptions();
String colValue = options.get(cellContent);
columnWrapper.setColValue(colValue);
} else {
// remote类型
Map<String, String> options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId);
String colValue = options.get(cellContent);
columnWrapper.setColValue(colValue);
}
} else if ("checkbox".equals(columnWrapper.getItemType())) {
String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel);
columnWrapper.setColValue(checkBoxColValue);
}
columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue);
}
return columnAndValues;
}
/**
* 根据formCode查询该form的item列表
* @param formCode
* @return
*/
private List<FormItem> listFormItems(String formCode) {
CustomerFormQueryDTO form = new CustomerFormQueryDTO();
form.setFormCode(formCode);
Result<List<FormItem>> result = operCustomizeOpenFeignClient.listItems(form);
return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败");
}
/**
* @description 合并头
*
* @param headers
* @return
* @author wxz
* @date 2021.10.28 21:27:18
*/
private HashMap<String, List<Integer>> combineHeaders(Map<Integer, List<String>> headers) {
HashMap<String, List<Integer>> itemAndColIndexs = new LinkedHashMap<>();
headers.forEach((k, v) -> {
String tempKey = String.join(":", v);
List<Integer> colIndexs = itemAndColIndexs.get(tempKey);
if (colIndexs == null) {
colIndexs = new ArrayList<>();
itemAndColIndexs.put(tempKey, colIndexs);
}
colIndexs.add(k);
});
return itemAndColIndexs;
}
/**
* @description 洗头
*
* @param headers
* @param items
* @return
* @author wxz
* @date 2021.10.28 21:07:12
*/
private Map<Integer, String> washHeaders(Map<Integer, List<String>> headers, List<FormItem> items) {
List<String> itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList());
Map<Integer, String> abandonedHeaders = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry:headers.entrySet()) {
Integer colIdx = entry.getKey();
List<String> v = entry.getValue();
int lastPartIndex = v.size() - 1;
String lastValuePart = v.get(lastPartIndex);
if (!itemLabels.contains(lastValuePart)) {
// 该部分为options,它的上一级是item,那么去掉options这一级
v.remove(lastPartIndex);
abandonedHeaders.put(colIdx, lastValuePart);
}
}
return abandonedHeaders;
}
/**
* @description 数据整合将excel表头汉字信息转化成ColumnWrapper列封装数据
* * key:itemId
* * value:ColumnWrapper列包装信息
* @param formItemMap item map
* key:itemId;
* value: 合并之后的head字符串例如健康信息:监护人
* @param combinedHeaders 合并之后的head信息
* key合并之后head字符串(例如党员信息:入党时间)
* value列号组成的列表(例如[1,2,3])
* @param datas
* @param abandonedHeaders
* @return
*/
private Map<String, ColumnWrapper> convertExcelHeaders2DBColumnWrappers(Map<String, FormItem> formItemMap, Map<String, List<Integer>> combinedHeaders,
List<Map<Integer, String>> datas, Map<Integer, String> abandonedHeaders) {
// HashMap<String, List<ColumnWrapper>> tables = new HashMap<>();
Map<String, ColumnWrapper> columns = new LinkedHashMap<>(combinedHeaders.size());
for (Map.Entry<String, List<Integer>> entry : combinedHeaders.entrySet()) {
String combinedHeader = entry.getKey();
FormItem item = formItemMap.get(combinedHeader);
if (item == null) {
// 如果数据库中没有该项,可能是用户自己定义的项,忽略
continue;
}
ColumnWrapper columnWrapper = new ColumnWrapper();
// 填充options
columnWrapper.setItemType(item.getItemType());
columnWrapper.setItemId(item.getItemId());
String groupLabel = item.getGroupLabel();
String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel());
columnWrapper.setCombinedLabel(combinedLabel);
columnWrapper.setColumnName(item.getColumnName());
columnWrapper.setColIndexs(entry.getValue());
columnWrapper.setOptionSourceType(item.getOptionSourceType());
columnWrapper.setOptionSourceValue(item.getOptionSourceValue());
columnWrapper.setOptions(item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue)));
columns.put(item.getItemId(), columnWrapper);
}
return columns;
}
/**
* 获取checkbox列值
* @param columnWrapper 数据库列包装信息每一列跳数据对应数据库的一个列
* @param dataRow 数据行每一条都是一行中的一个单元格
* @param checkboxOptions 复选框的选项k: 列号, value: checkboxlabel中文
* @return
*/
private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map<Integer, String> dataRow, Map<Integer, String> checkboxOptions) {
Map<String, String> options = columnWrapper.getOptions();
List<Integer> colIndexs = columnWrapper.getColIndexs();
List<String> optionValues = colIndexs.stream().filter(i -> {
String cellContent = dataRow.get(i);
return StringUtils.isNotBlank(cellContent) && cellContent.equals("是");
}).map(i -> {
String checkboxOptionLabel = checkboxOptions.get(i);
return options.get(checkboxOptionLabel);
}).collect(Collectors.toList());
return String.join(",", optionValues);
}
/**
* 远程获取options
* @param fullUri
* @return
*/
private Map<String, String> listRemoteOptions(Map<String, ColumnWrapper> columnWrappers, String fullUri, String currUserAgencyId) {
String pureUri = null;
String cascadeItemId = null;
ColumnWrapper cascadeItemColumnWrapper = null;
if (fullUri.indexOf("?") != -1) {
String[] uriParts = fullUri.split("\\?");
pureUri = uriParts[0];
cascadeItemId = uriParts[1];
// 根据uri上的id,找到关联的itemid,从而找到关联的item的值
if (columnWrappers != null){
cascadeItemColumnWrapper = columnWrappers.get(cascadeItemId);
}
} else {
pureUri = fullUri;
}
List<OptionResultDTO> options = null;
switch (pureUri) {
case "/epmetuser/icresidemanddict/demandoption":
options = getResultDataOrThrowsException(epmetUserOpenFeignClient.getDemandOptions(), ServiceConstant.EPMET_USER_SERVER,
EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/customergrid/gridoption":
AgencyIdFormDTO form = new AgencyIdFormDTO();
form.setAgencyId(currUserAgencyId);
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/customerpartybranch/branchoption":
CustomerPartyBranchDTO bform = new CustomerPartyBranchDTO();
bform.setGridId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/icbuilding/buildingoption":
IcBuildingDTO buildingform = new IcBuildingDTO();
buildingform.setNeighborHoodId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/icbuildingunit/unitoption":
IcBuildingUnitDTO buForm = new IcBuildingUnitDTO();
buForm.setBuildingId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/ichouse/houseoption":
HouseFormDTO hform = new HouseFormDTO();
hform.setUnitId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/gov/org/icneighborhood/neighborhoodoption":
IcNeighborHoodDTO nform = new IcNeighborHoodDTO();
nform.setAgencyId(currUserAgencyId);
nform.setGridId(cascadeItemColumnWrapper.getColValue());
options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/education":
options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/house":
options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/nation":
options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/ninesmallplaces":
options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
case "/sys/dict/data/relationship":
options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
break;
}
if (options == null) {
return null;
}
return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue));
// 通用api调用,无法实现
/*if (!uri.startsWith("/api")) uri = "/api".concat(uri);
NamingService namingService = discoveryProperties.namingServiceInstance();
ResponseEntity<Result<List<OptionResultDTO>>> response = null;
try {
// 调用gateway服务,查询相关接口
Instance gatewayInstance = namingService.getAllInstances(ServiceConstant.EPMET_GATEWAY).get(0);
String ip = gatewayInstance.getIp();
int port = gatewayInstance.getPort();
String url = String.format("http://%s:%s%s", ip, port, uri);
ParameterizedTypeReference<Result<List<OptionResultDTO>>> tr = new ParameterizedTypeReference<Result<List<OptionResultDTO>>>() {};
response = new RestTemplate().exchange(url, HttpMethod.POST, null, tr);
} catch (NacosException e) {
e.printStackTrace();
}
if (response != null && (response.getStatusCode() == HttpStatus.OK)) {
List<OptionResultDTO> options = response.getBody().getData();
if (options == null) {
System.out.println(6);
}
return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue));
} else {
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode());
}*/
}
/**
* @description 合并表头
* Map<Integer, List<String>>
*
* @param headList
* @return
* @author wxz
* @date 2021.10.27 16:17:34
*/
private Map<Integer, List<String>> mergeHead(List<Map<Integer, String>> headList) {
Map<Integer, String> lastNotNullHeads = new LinkedHashMap<>();
Map<Integer, List<String>> mergedHead = new LinkedHashMap<>();
int levelCount = headList.size();
Map<Integer, String> firstLevel = headList.get(0);
// 遍历所有列
for (Map.Entry<Integer, String> column : firstLevel.entrySet()) {
Integer columIndex = column.getKey();
List<String> labels = new ArrayList<>();
// 竖着遍历该列的所有行
for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) {
String label = headList.get(currentLevel).get(columIndex);
if (StringUtils.isNotBlank(label)) {
lastNotNullHeads.put(currentLevel, label);
} else {
if (currentLevel == 0 || StringUtils.isBlank(headList.get(currentLevel - 1).get(columIndex))) {
label = lastNotNullHeads.get(currentLevel);
}
}
if (StringUtils.isNotBlank(label)) {
labels.add(label);
}
}
mergedHead.put(columIndex, labels);
}
return mergedHead;
}
/**
* @description 列信息封装
*
* @return
* @author wxz
* @date 2021.10.28 22:18:05
*/
@Data
public static class ColumnWrapper {
private String combinedLabel;
private String columnName;
private String itemType;
private String itemId;
private List<Integer> colIndexs;
//private List<String> colContents;
// 单元格内容
private String cellContent;
// 数据库中列的值
private String colValue;
// key:label,value:value
private Map<String, String> options;
/**
* 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用URL:接口获取(LABEL,VALUE)JSON:直接从JSON中取
*/
private String optionSourceType;
/**
* 来源地址,REMOTE才有固定格式;如果OPTIONS_SOURCE是URL则此处填写要调用的接口的URL相对路径例如/API/GOV/ORG/XXXX此处不应设置参数若需要参数应当完全由后端通过TOKEN信息来获取
*/
private String optionSourceValue;
}
/**
* desc:动态查询 某表的所有字段值
* @param customerId
@ -1185,7 +541,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
if (v.getOptionSourceType().equals("remote")) {
try {
//todo 获取 options
Map<String, String> stringMap = listRemoteOptions(new HashMap<>(), v.getOptionSourceValue(), null);
Map<String, String> stringMap = icResiUserImportService.listRemoteOptions(new HashMap<>(), v.getOptionSourceValue(), null);
if ("checkbox".equals(v.getItemType())) {
stringMap.forEach((label, value) -> map.put(value, temp.toString().contains(value) ? "是" : "否"));
} else if ("select".equals(v.getItemType())) {

Loading…
Cancel
Save