Browse Source

居民信息导入:修改对必填项的校验判断逻辑和提示逻辑

master
wangxianzhang 3 years ago
parent
commit
7723cc8c08
  1. 180
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

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

@ -75,10 +75,17 @@ import java.util.stream.Collectors;
@Service
public class IcResiUserImportServiceImpl implements IcResiUserImportService, ResultDataResolver {
public static final List<String> controlGroup1 = Arrays.asList("input", "textarea", "datepicker", "daterange");
public static final List<String> controlGroup2 = Arrays.asList("select", "radio");
/**
* 身份证号列序号
*/
public static final Integer ID_CARD_COLUMN_NO = 9;
/**
* 姓名列序号
*/
public static final Integer ID_NAME_COLUMN_NO = 6;
// 错误和跳过excel行暂存
public static final ThreadLocal<Map<String, List<ErrorRow>>> errorRows = new ThreadLocal<>();
@ -163,9 +170,9 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
private Integer required;
private List<Integer> colIndex;
//private List<String> colContents;
// 单元格内容
// 单元格内容。多选框没有该列,因为多选框对应着excel的多列
private String cellContent;
// 数据库中列的
// 单元格内容对应的数据库中值
private String colValue;
// key:label,value:value
@ -425,11 +432,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
try {
convertColumnWrappers2Map4Persist(itemIdAndColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel, columnAndValues, true);
String idCard = columnAndValues.get("ID_CARD");
// 执行指定的检查
specifiedCheck(columnAndValues);
String idCard = columnAndValues.get("ID_CARD");
Map<String, String> existingResiMap = icResiUserDao.selectResiInfoMap(idCard, null);
if (existingResiMap == null) {
@ -719,111 +725,179 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
/**
* 将当前行数据转化成LinkedHashMap供后续插入
* @param itemIdAndColumnWrappers 当前行的ColumnWrapper每一个ColumnWrapper元素都是当前行中的一个列,key:itemId
* @param dbMetadataItemIdAndColumnWrappers 当前行的ColumnWrapper每一条都是数据库中的一个列的源数据对应到excel中可能是多个列多选每一个ColumnWrapper元素都是当前行中的一个列,key:itemId
* @param row 当前行数据
* @param currUserAgencyId 当前用户所属机构ID
* @param checkBoxOptionColumnIdxAndLabel 复选框options列表key:列号value复选框中文
* @param target 要将数据放到哪个对象中
* @param target2Insert 要用来insert到db的数据
* @param isPrimaryTable 是否是主表
*/
private void convertColumnWrappers2Map4Persist(Map<String, ColumnWrapper> itemIdAndColumnWrappers, Map<Integer, String> row,
private void convertColumnWrappers2Map4Persist(Map<String, ColumnWrapper> dbMetadataItemIdAndColumnWrappers, Map<Integer, String> row,
String currUserAgencyId, Map<Integer, String> checkBoxOptionColumnIdxAndLabel,
LinkedHashMap<String, String> target, boolean isPrimaryTable) {
LinkedHashMap<String, String> target2Insert, boolean isPrimaryTable) {
boolean hasError = false;
boolean interupt = false;
String notFoundColumnNames = null;
String emptyColumnNames = null;
List<String> errorColumnNames = new LinkedList<>();
// 这两列要提前放进去,因为有的列未填写的话,会抛异常出去,需要用这两列来做描述
target2Insert.put("ID_CARD", row.get(ID_CARD_COLUMN_NO));
target2Insert.put("NAME", row.get(ID_NAME_COLUMN_NO));
for (Map.Entry<String, ColumnWrapper> itemIdAndColumnWrapper : itemIdAndColumnWrappers.entrySet()) {
for (Map.Entry<String, ColumnWrapper> dbColumnMetadata : dbMetadataItemIdAndColumnWrappers.entrySet()) {
String itemId = itemIdAndColumnWrapper.getKey();
ColumnWrapper columnWrapper = itemIdAndColumnWrapper.getValue();
String currentItemId = dbColumnMetadata.getKey();
ColumnWrapper columnWrapper = dbColumnMetadata.getValue();
if ("input".equals(columnWrapper.getItemType())
|| "textarea".equals(columnWrapper.getItemType())
|| "datepicker".equals(columnWrapper.getItemType())
|| "daterange".equals(columnWrapper.getItemType())
) {
// "input", "textarea", "datepicker", "daterange"
if (controlGroup1.contains(columnWrapper.getItemType())) {
// 输入的控件,不会横跨多个单元格,所以只取一列就可以了
String cellContent = row.get(columnWrapper.getColIndex().get(0));
columnWrapper.setCellContent(cellContent);
columnWrapper.setColValue(cellContent);
} else if ("select".equals(columnWrapper.getItemType())
|| "radio".equals(columnWrapper.getItemType())){
// 必填检查
if (hasError = requiredButEmptyCheck(isPrimaryTable, columnWrapper)) {
emptyColumnNames = columnWrapper.combinedLabel;
break;
}
// "select", "radio"
} else if (controlGroup2.contains(columnWrapper.getItemType())){
String optionSourceType = columnWrapper.getOptionSourceType();
// 取单元格的内容
String cellContent = row.get(columnWrapper.getColIndex().get(0));
columnWrapper.setCellContent(cellContent);
if ("local".equals(optionSourceType)) {
// 必填检查
if (hasError = requiredButEmptyCheck(isPrimaryTable, columnWrapper)) {
emptyColumnNames = columnWrapper.combinedLabel;
break;
}
if ("local".equals(columnWrapper.getOptionSourceType())) {
// 根据单元格内容,取到指定的option
Map<String, String> options = columnWrapper.getOptions();
String colValue = options.get(cellContent);
Map<String, String> itemOptions = columnWrapper.getOptions();
String colValue = itemOptions.get(cellContent);
columnWrapper.setColValue(colValue);
} else {
// remote类型。优先从缓存取
String fullUri = columnWrapper.getOptionSourceValue();
String[] uriParts = splitOptionSourceUrl(fullUri);
String pureUri = uriParts[0];
String superItemId = uriParts[1];
String superColumValue;
String superColumnValue;
// 获取父item的值
if (StringUtils.isNotBlank(superItemId)) {
superColumValue = itemIdAndColumnWrappers.get(superItemId).getColValue();
superColumnValue = dbMetadataItemIdAndColumnWrappers.get(superItemId).getColValue();
} else {
superColumValue = "-";
superColumnValue = "-";
}
Map<String, Map<String, String>> superOptions = itemIdAndOptionsCache.getIfPresent(itemId);
// 通过接口调用,计算出colValue,放到columnWrapper中
Map<String, Map<String, String>> superOptions = itemIdAndOptionsCache.getIfPresent(currentItemId);
if (superOptions != null && superOptions.size() > 0) {
Map<String, String> options = superOptions.get(superColumValue);
Map<String, String> options = superOptions.get(superColumnValue);
if (options == null || options.size() == 0) {
options = listRemoteOptions(pureUri, superItemId, itemIdAndColumnWrappers, currUserAgencyId, "saveorupdate");
superOptions.put(superColumValue, options);
options = listRemoteOptions(pureUri, superItemId, dbMetadataItemIdAndColumnWrappers, currUserAgencyId, "saveorupdate");
superOptions.put(superColumnValue, options);
}
String colValue = options.get(cellContent);
columnWrapper.setColValue(colValue);
} else {
Map<String, String> options = listRemoteOptions(pureUri, superItemId, itemIdAndColumnWrappers, currUserAgencyId, "saveorupdate");
// 父item的options。例如当前遍历的是小区列,那查出来的就是网格下的小区
// 然后把 <currentItemId:<superItem:usperOptions>> 放到缓存里
Map<String, String> options = listRemoteOptions(pureUri, superItemId, dbMetadataItemIdAndColumnWrappers, currUserAgencyId, "saveorupdate");
superOptions = new HashMap<>();
superOptions.put(superColumValue, options);
itemIdAndOptionsCache.put(itemId, superOptions);
superOptions.put(superColumnValue, options);
itemIdAndOptionsCache.put(currentItemId, superOptions);
String colValue = options.get(cellContent);
columnWrapper.setColValue(colValue);
}
}
} else if ("checkbox".equals(columnWrapper.getItemType())) {
//多选框没有具体的cellContent,因为多选框对应着excel的多列
String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel);
columnWrapper.setColValue(checkBoxColValue);
}
// requiredColumns中的值不在排除字段中 && 是必填 && 未填写
if (isPrimaryTable) {
// 主表没有需要排除的列
if (columnWrapper.getRequired() == 1 && StringUtils.isBlank(columnWrapper.colValue)) {
interupt = true;
errorColumnNames.add(columnWrapper.combinedLabel);
}
} else {
// 从表需要排除掉一些不必要校验的列
if (!subTableNeedlessColumns.contains(columnWrapper.columnName)
&& columnWrapper.getRequired() == 1
&& StringUtils.isBlank(columnWrapper.colValue)) {
interupt = true;
errorColumnNames.add(columnWrapper.combinedLabel);
}
// 填了,但找不到对应数据的检查
if (hasError = notFoundCheck(isPrimaryTable, columnWrapper)) {
notFoundColumnNames = columnWrapper.combinedLabel;
break;
}
target.put(columnWrapper.columnName, columnWrapper.colValue);
target2Insert.put(columnWrapper.columnName, columnWrapper.colValue);
}
if (!hasError) {
return;
}
StringBuilder sb = new StringBuilder();
// 组织报错信息
if (StringUtils.isNotBlank(emptyColumnNames)) {
sb.append(emptyColumnNames).append("的值未填写");
}
if (StringUtils.isNotBlank(notFoundColumnNames)) {
sb.append(notFoundColumnNames).append("填写的值在系统中未找到");
}
throw new EpmetException(sb.toString());
}
/**
* 必填但是用户没填的放到list中
* @param isPrimaryTable 是否是主表true是主表false从表
* @param columnWrapper 数据库列包装对象
*/
public boolean requiredButEmptyCheck(Boolean isPrimaryTable, ColumnWrapper columnWrapper) {
// requiredColumns中的值不在排除字段中 && 是必填 && 未填写
if (isPrimaryTable) {
// 主表没有需要排除的列
if (columnWrapper.getRequired() == 1 && StringUtils.isBlank(columnWrapper.cellContent)) {
return true;
}
} else {
// 从表需要排除掉一些不必要校验的列
if (!subTableNeedlessColumns.contains(columnWrapper.columnName)
&& columnWrapper.getRequired() == 1
&& StringUtils.isBlank(columnWrapper.cellContent)) {
return true;
}
}
if (interupt) {
throw new RenException(String.join(",", errorColumnNames) + "的值未填写,或者所填写信息在系统中未找到");
return false;
}
/**
* 必填并且在系统中没找到值的放到list中
* @param isPrimaryTable 是否是主表true是主表false从表
* @param columnWrapper 数据库列包装对象
*/
public boolean notFoundCheck(Boolean isPrimaryTable, ColumnWrapper columnWrapper) {
// requiredColumns中的值不在排除字段中 && 是必填 && 未填写
if (isPrimaryTable) {
// 主表没有需要排除的列
if (columnWrapper.getRequired() == 1 && StringUtils.isBlank(columnWrapper.colValue)) {
return true;
}
} else {
// 从表需要排除掉一些不必要校验的列
if (!subTableNeedlessColumns.contains(columnWrapper.columnName)
&& columnWrapper.getRequired() == 1
&& StringUtils.isBlank(columnWrapper.colValue)) {
return true;
}
}
return false;
}
/**

Loading…
Cancel
Save