From ee37a941137efcb2a44ff45ce296f4dfe92f2398 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 19 Nov 2021 16:23:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/constant/StrConstant.java | 2 + .../commons/tools/enums/FormItemTypeEnum.java | 53 +++++ .../controller/IcNeighborHoodController.java | 4 +- .../epmet/constant/IcResiUserConstant.java | 11 + .../controller/IcResiUserController.java | 62 ++++-- .../com/epmet/enums/IcResiUserTableEnum.java | 4 +- .../excel/support/ExportResiUserItemDTO.java | 29 +++ .../com/epmet/service/IcResiUserService.java | 7 +- .../impl/IcResiUserImportServiceImpl.java | 25 ++- .../service/impl/IcResiUserServiceImpl.java | 202 +++++++++--------- .../ic_resi_info_cid_for_easy_excel.xlsx | Bin 25132 -> 25170 bytes 11 files changed, 267 insertions(+), 132 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java index 2e1d7d5bea..a18f34f72b 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java @@ -75,6 +75,8 @@ public interface StrConstant { String STAR="*"; String QUESTION_MARK="?"; + String QUESTION_MARK_TRANSFER="\\?"; + String AND_MARK="&"; /** * 空字符串 diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java new file mode 100644 index 0000000000..753852bfff --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.epmet.commons.tools.enums; + +/** + * form表单 配置item类型 枚举 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +public enum FormItemTypeEnum { + //枚举类型 + INPUT("input", "输入框"), + RADIO("radio", "单选框"), + CHECKBOX("checkbox", "复选框"), + SELECT("select", "下拉框"), + TEXTAREA("textarea", "文本域"), + CASCADER("cascader", "及联"), + DATE_PICKER("datepicker", "组织"), + UN_KNOWN("un_known", "不支持的类型"); + + private String code; + private String desc; + + FormItemTypeEnum(String value,String name) { + this.code = value; + this.desc = name; + } + + public static FormItemTypeEnum getEnum(String code) { + FormItemTypeEnum[] values = FormItemTypeEnum.values(); + for (FormItemTypeEnum value : values) { + if (value.getCode().equals(code)) { + return value; + } + } + return UN_KNOWN; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java index 14dcda318a..fcd64c4658 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -45,7 +45,7 @@ import java.util.Map; @RestController @RequestMapping("icneighborhood") public class IcNeighborHoodController { - + @Autowired private IcNeighborHoodService icNeighborHoodService; @@ -109,4 +109,4 @@ public class IcNeighborHoodController { return new Result>().ok(icNeighborHoodService.getListByIds(ids)); } -} \ No newline at end of file +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java new file mode 100644 index 0000000000..6b32f663fc --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java @@ -0,0 +1,11 @@ +package com.epmet.constant; + +/** + * @author zhaoqifeng + * @dscription + * @date 2021/6/8 15:28 + */ +public interface IcResiUserConstant { + + String IC_RESI_USER = "ic_resi_user"; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 8b571dce85..fd3a88fd79 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -44,10 +44,12 @@ import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.constant.IcResiUserConstant; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.enums.IcResiUserTableEnum; +import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.feign.OssFeignClient; import com.epmet.service.IcResiUserImportService; @@ -84,7 +86,7 @@ import java.util.stream.Collectors; @RestController @RequestMapping("icresiuser") public class IcResiUserController { - private static final String BASE_TABLE_NAME = "ic_resi_user"; + //todo 枚举吧 private static final String IC_RESI_FORM_CODE = "resi_base_info"; @@ -227,7 +229,7 @@ public class IcResiUserController { Map> otherSheetItems = buildItemMap(resiFormItems); - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), BASE_TABLE_NAME, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiMainList = null;//icResiUserService.getDataForExport(otherSheetItems.get(IcResiUserConstant.IC_RESI_USER), IcResiUserConstant.IC_RESI_USER, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; @@ -241,13 +243,13 @@ public class IcResiUserController { AtomicInteger n = new AtomicInteger(); for (FormItemResult item : resiFormItems.getItemList()) { //如果 childGroup是空 或者是主表 则跳过 继续下次循环 - if (item.getChildGroup() == null || BASE_TABLE_NAME.equals(item.getChildGroup().getTableName())) { + if (item.getChildGroup() == null || IcResiUserConstant.IC_RESI_USER.equals(item.getChildGroup().getTableName())) { continue; } String tableName = item.getChildGroup().getTableName(); Map itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = null;//icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); @@ -286,7 +288,7 @@ public class IcResiUserController { ExcelWriter excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); - IcResiUserTableEnum tableEnums = IcResiUserTableEnum.getObjectByTableName(BASE_TABLE_NAME); + IcResiUserTableEnum tableEnums = IcResiUserTableEnum.getObjectByTableName(IcResiUserConstant.IC_RESI_USER); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); @@ -296,24 +298,24 @@ public class IcResiUserController { Map childTableWriteSheetMap = new HashMap<>(); Map> resiMainTableMap = null; do { - resiMainTableMap = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), BASE_TABLE_NAME, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + resiMainTableMap = null;//icResiUserService.getDataForExport(otherSheetItems.get(IcResiUserConstant.IC_RESI_USER), IcResiUserConstant.IC_RESI_USER, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 if (resiMainTableMap.keySet().size() < pageFormDTO.getPageSize()) { - stopSearchSet.add(BASE_TABLE_NAME); + stopSearchSet.add(IcResiUserConstant.IC_RESI_USER); } //写入数据 excelWriter.fill(new FillWrapper("t1", resiMainTableMap.values()), fillConfig, fistSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + 1); //重置数据 resiMainTableMap.clear(); - } while (!stopSearchSet.contains(BASE_TABLE_NAME)); + } while (!stopSearchSet.contains(IcResiUserConstant.IC_RESI_USER)); //子表数据写入 AtomicInteger n = new AtomicInteger(); for (FormItemResult item : resiFormItems.getItemList()) { //如果 childGroup是空 或者是主表 则跳过 继续下次循环 - if (item.getChildGroup() == null || BASE_TABLE_NAME.equals(item.getChildGroup().getTableName())) { + if (item.getChildGroup() == null || IcResiUserConstant.IC_RESI_USER.equals(item.getChildGroup().getTableName())) { continue; } String tableName = item.getChildGroup().getTableName(); @@ -326,7 +328,7 @@ public class IcResiUserController { continue; } Map itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = null;//icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); @@ -365,8 +367,6 @@ public class IcResiUserController { pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); - - //获取模版文件 File file = getExportTemplateFile(customerId); ExcelWriter excelWriter = null; @@ -381,34 +381,56 @@ public class IcResiUserController { //获取表单项 List resiFormAllItems = icResiUserService.listFormItems(customerId, IC_RESI_FORM_CODE); + Map allItemMap = resiFormAllItems.stream().collect(Collectors.toMap(FormItemResult::getItemId, o -> o)); + Map map = new HashMap<>(); + allItemMap.values().forEach(item->{ + String tableName = item.getTableName(); + ExportResiUserItemDTO exportItem = map.getOrDefault(tableName, new ExportResiUserItemDTO()); + map.putIfAbsent(tableName,exportItem); + String columnName = item.getColumnName().concat(item.getColumnNum() == NumConstant.ZERO ? StrConstant.EPMETY_STR : item.getColumnNum().toString()); + exportItem.getItemMap().put(columnName,item); + if (item.getOptionSourceType().equals("remote")&&item.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ + //多个参数 + String[] paramArr = item.getOptionSourceValue().split(StrConstant.QUESTION_MARK_TRANSFER)[NumConstant.ONE].split(StrConstant.AND_MARK); + Arrays.stream(paramArr).forEach(o->{ + FormItemResult value = allItemMap.get(o); + if (value == null){ + return; + } + Set conditionSet = exportItem.getRemoteItemConditionMap().getOrDefault(item.getItemId(),new HashSet<>()); + conditionSet.add(value); + exportItem.getRemoteItemConditionMap().putIfAbsent(item.getItemId(),conditionSet); + }); + } + }); + //每个表对应的 item ;key:表名,value:<字段名:item对象> - Map> tableItemMap = resiFormAllItems.stream() - .collect(Collectors.groupingBy(FormItemResult::getTableName, - Collectors.toMap(o->o.getColumnName().concat(NumConstant.ZERO == o.getColumnNum()? StrConstant.EPMETY_STR:o.getColumnNum().toString()), o -> o))); Map childTableWriteSheetMap = new HashMap<>(); //表数据写入 //通过枚举获取相关表并按照sheetNo排序 List resiTableList = Arrays.stream(IcResiUserTableEnum.values()) .sorted(Comparator.comparing(IcResiUserTableEnum::getSheetNo)) .collect(Collectors.toList()); + List> resiResultList = null; for (IcResiUserTableEnum tableEnum : resiTableList) { String tableName = tableEnum.getTableName(); pageFormDTO.setPageNo(NumConstant.ONE); - //循环一次 写入每个sheet + //循环一次 写入一个sheet do { - Map> resiChildMap = icResiUserService.getDataForExport(tableItemMap.get(tableName), tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + resiResultList = icResiUserService.getDataForExport(map.get(tableName), tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 - if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { + if (resiResultList.size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); } //如果没有 构建新的writeSheet WriteSheet writeSheet = childTableWriteSheetMap.getOrDefault(tableName,EasyExcel.writerSheet(tableEnum.getSheetNo()).build()); childTableWriteSheetMap.putIfAbsent(tableName, writeSheet); //写入数据 - excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiChildMap.values()), writeSheet); + excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiResultList), writeSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + NumConstant.ONE); //重置数据 - resiChildMap.clear(); + resiResultList.clear(); + //如果包含则说明子表的数据 已经查询完毕 无需再继续查询了 } while (!stopSearchSet.contains(tableName)); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java index eb4ecd977e..ffd0076429 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java @@ -10,7 +10,9 @@ import lombok.AllArgsConstructor; */ @AllArgsConstructor public enum IcResiUserTableEnum { - + /** + * 注释 + */ IC_RESI_USER("ic_resi_user","社区居民基本信息录入表", 0, 3, null), IC_PARTY_MEMBER("ic_party_member","党员信息录入表", 1, 2, "IS_PARTY"), IC_ENSURE_HOUSE("ic_ensure_house","保障房人员信息录入表", 2, 2, "IS_ENSURE_HOUSE"), diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java new file mode 100644 index 0000000000..8f7cb6de14 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java @@ -0,0 +1,29 @@ +package com.epmet.excel.support; + +import com.epmet.dto.result.FormItemResult; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * desc: + * + * @author: LiuJanJun + * @date: 2021/11/18 3:31 下午 + * @version: 1.0 + */ +@Data +public class ExportResiUserItemDTO implements Serializable { + + private static final long serialVersionUID = -6581208659638591761L; + + /** + * 该表对应的 字段名:item + */ + private Map itemMap = new HashMap<>(); + /** + * 该表对应的所有远程item的相关条件 key:remote的itemID value:条件中用到的所有的item + */ + private Map> remoteItemConditionMap = new HashMap<>(); +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index d18d47d1b3..52e256105c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -23,6 +23,7 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; +import com.epmet.excel.support.ExportResiUserItemDTO; import java.util.List; import java.util.Map; @@ -105,12 +106,12 @@ public interface IcResiUserService extends BaseService { /** * desc:条件导出 * - * @param itemList + * @param exportResiUserItemDTO * @param baseTableName * @return Map> 用户Id:用户信息所有的字段名及值 */ - Map> getDataForExport(Map itemList, String baseTableName, IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, - String staffOrgPath); + List> getDataForExport(ExportResiUserItemDTO exportResiUserItemDTO, String baseTableName, IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, + String staffOrgPath); /** * @Description 家庭关系 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index e0e1bac217..b2adb20543 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -7,6 +7,7 @@ import com.alibaba.excel.EasyExcel; 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.constant.StrConstant; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -15,7 +16,6 @@ import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.*; -import com.epmet.dto.form.AgencyIdFormDTO; import com.epmet.dto.form.GridOptionFormDTO; import com.epmet.dto.form.HouseFormDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; @@ -90,7 +90,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res // 是否必填 private Integer required; - private List colIndexs; + private List colIndex; //private List colContents; // 单元格内容 private String cellContent; @@ -544,7 +544,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res || "daterange".equals(columnWrapper.getItemType()) ) { - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + String cellContent = row.get(columnWrapper.getColIndex().get(0)); columnWrapper.setCellContent(cellContent); columnWrapper.setColValue(cellContent); @@ -553,7 +553,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String optionSourceType = columnWrapper.getOptionSourceType(); // 取单元格的内容 - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + String cellContent = row.get(columnWrapper.getColIndex().get(0)); columnWrapper.setCellContent(cellContent); if ("local".equals(optionSourceType)) { @@ -677,7 +677,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel()); columnWrapper.setCombinedLabel(combinedLabel); columnWrapper.setColumnName(item.getColumnName()); - columnWrapper.setColIndexs(entry.getValue()); + columnWrapper.setColIndex(entry.getValue()); columnWrapper.setRequired(item.getRequired()); columnWrapper.setOptionSourceType(item.getOptionSourceType()); @@ -699,7 +699,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map dataRow, Map checkboxOptions) { Map options = columnWrapper.getOptions(); - List colIndexs = columnWrapper.getColIndexs(); + List colIndexs = columnWrapper.getColIndex(); List optionValues = colIndexs.stream().filter(i -> { String cellContent = dataRow.get(i); @@ -770,8 +770,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String cascadeItemId = null; ColumnWrapper cascadeItemColumnWrapper = null; - if (fullUri.indexOf("?") != -1) { - String[] uriParts = fullUri.split("\\?"); + if (fullUri.indexOf(StrConstant.QUESTION_MARK) != -1) { + String[] uriParts = fullUri.split(StrConstant.QUESTION_MARK_TRANSFER); pureUri = uriParts[0]; cascadeItemId = uriParts[1]; @@ -819,8 +819,11 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res break; case "/gov/org/icneighborhood/neighborhoodoption": IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); - nform.setAgencyId(currUserAgencyId); - nform.setGridId(cascadeItemColumnWrapper.getColValue()); + String gridId = cascadeItemColumnWrapper.getColValue(); + if (StringUtils.isBlank(gridId)){ + nform.setAgencyId(currUserAgencyId); + } + nform.setGridId(gridId); options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/education": @@ -838,6 +841,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res case "/sys/dict/data/relationship": options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; + default: + log.warn("listRemoteOptions url is not supported"); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index ddb7c9307d..277b7220a7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; +import com.epmet.commons.tools.enums.FormItemTypeEnum; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.enums.RelationshipEnum; @@ -44,6 +45,7 @@ import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.IcPlatformConstant; +import com.epmet.constant.IcResiUserConstant; import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; @@ -55,6 +57,7 @@ import com.epmet.dto.form.*; import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; +import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.feign.EpmetHeartOpenFeignClient; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; @@ -63,6 +66,8 @@ import com.epmet.service.IcResiUserService; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -639,131 +644,136 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, String baseTableName,IcResiUserPageFormDTO pageFormDTO, - String currentStaffAgencyId, - String staffOrgPath) { + public List> getDataForExport(ExportResiUserItemDTO formItemMap, String baseTableName, IcResiUserPageFormDTO pageFormDTO, + String currentStaffAgencyId, + String staffOrgPath) { Page> mapListPage = PageHelper.startPage(pageFormDTO.getPageNo(), pageFormDTO.getPageSize(), pageFormDTO.getPageFlag()).doSelectPage(() -> { this.dynamicQuery(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), baseTableName, pageFormDTO.getConditions(), currentStaffAgencyId, staffOrgPath); }); - List> mapList = mapListPage.getResult(); - Map> result = new LinkedHashMap<>(); - mapList.stream().filter(Objects::nonNull).forEach(map -> { - //遍历所有字段 格式化时间字段 - map.forEach((k,o) -> { - if (o instanceof java.sql.Date){ - o = DateUtils.format(((Date) o),DateUtils.DATE_PATTERN); - } - if (o instanceof java.sql.Timestamp){ - o = DateUtils.format(new Date(((Timestamp) o).getTime()),DateUtils.DATE_TIME_PATTERN); - } - map.put(k,o); - - //把checkbox radio select的值放入到map里 并添加对应的 - - }); - Object gridId = map.get(UserConstant.GRID_ID); + mapListPage.getResult().stream().filter(Objects::nonNull).forEach(map -> { String resiId = null; - //获取用户Id - if ("ic_resi_user".equals(baseTableName)) { + if (IcResiUserConstant.IC_RESI_USER.equals(baseTableName)) { resiId = (String) map.get("ID"); }else { resiId = (String) map.get(UserConstant.IC_RESI_USER); } - if (StringUtils.isBlank(resiId)){ log.error("getDataForExport error,resiId is net exist:{}",map); return; } - //把人放进去 - result.put(resiId, map); - - for (Map.Entry e : formItemMap.entrySet()) { - String k = e.getKey(); - FormItemResult v = e.getValue(); - Object temp = map.get(k); - String vauleStr = temp == null ? "" : temp.toString(); - - if (v.getOptionSourceType().equals("remote")) { - try { - Map columnWrappers = new HashMap<>(); - if (v.getItemId().equals("1078")) { - IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); - value.setColValue(gridId.toString()); - columnWrappers.put("1001", value); - }else if (v.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ - continue; - } - //todo 获取 options - Map stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), currentStaffAgencyId, "query"); - if ("checkbox".equals(v.getItemType())) { - stringMap.forEach((label, value) -> map.put(value, vauleStr.contains(value) ? "是" : "否")); - } else if ("select".equals(v.getItemType())) { - stringMap.forEach((label, value) -> { - if (vauleStr.equals(value)) { - map.put(k, label); - } - }); - } - } catch (Exception ex) { - log.warn("listRemoteOptions url:{}", v.getOptionSourceValue()); - } - } else { - if ("checkbox".equals(v.getItemType())) { + //遍历所有字段 格式化时间字段 + map.forEach((k,o) -> { + if (o instanceof java.sql.Date){ + o = DateUtils.format(((Date) o),DateUtils.DATE_PATTERN); + }else if (o instanceof java.sql.Timestamp){ + o = DateUtils.format(new Date(((Timestamp) o).getTime()),DateUtils.DATE_TIME_PATTERN); + } + map.put(k,o); + FormItemResult itemResult = formItemMap.getItemMap().get(k); + if (itemResult == null){ + return; + } + }); - v.getOptions().forEach(optionDTO -> { - map.put(optionDTO.getValue(), vauleStr.contains(optionDTO.getValue()) ? "是" : "否"); - }); - } else if ("select".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - if (optionDTO.getValue().equals(vauleStr)) { - map.put(k, optionDTO.getLabel()); - } - }); - } else if ("radio".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - if (optionDTO.getValue().equals(vauleStr)) { - map.put(k, optionDTO.getLabel()); - } - }); - } + //当前条数据原始的id值 map + Map originalConditionMap = new HashMap<>(); + for (FormItemResult e : formItemMap.getItemMap().values()) { + String columnName = getColumnName(e); + Object temp = map.get(columnName); + String vauleStr = temp == null ? StrConstant.EPMETY_STR : temp.toString(); + originalConditionMap.putIfAbsent(columnName,vauleStr); + if ("remote".equals(e.getOptionSourceType()) && StringUtils.isNotBlank(vauleStr)) { + putRemoteValue(formItemMap.getRemoteItemConditionMap().get(e.getItemId()), currentStaffAgencyId, map,originalConditionMap, e, columnName, vauleStr); + } else { + putOptionValue(map, e, columnName, vauleStr); } } - if (!"ic_resi_user".equals(baseTableName)) { + if (!IcResiUserConstant.IC_RESI_USER.equals(baseTableName)) { Map o = redisUtils.hGetAll(RedisKeys.getExportResiBaseInfoKey(resiId)); if (o != null){ map.putAll(o); } return; } + //把人放入redis缓存 便于后面的sheet使用基础信息 + redisUtils.hMSet(RedisKeys.getExportResiBaseInfoKey(resiId),map,RedisUtils.MINUTE_THIRTY_EXPIRE); + }); + remoteOptionCacheMap.clear(); + return mapListPage.getResult(); + } - /*if (gridId != null) { - CustomerGridFormDTO formDTO = new CustomerGridFormDTO(); - formDTO.setGridId(gridId.toString()); - Result gridInfoRes = govOrgOpenFeignClient.getGridBaseInfoByGridId(formDTO); - if (gridInfoRes != null && gridInfoRes.success() && gridInfoRes.getData() != null) { - map.put(UserConstant.GRID_NAME, gridInfoRes.getData().getGridName()); + /** + * key:itemId,value: key:columnName,中文 + */ + private static Map> remoteOptionCacheMap = new HashMap<>(); + private void putRemoteValue(Set conditionItemSet, String currentStaffAgencyId, Map map, Map originalConditionMap, FormItemResult e, String columnName, String vauleStr) { + try { + Map columnWrappers = new HashMap<>(); + if (e.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ + for (FormItemResult o : conditionItemSet) { + String column = getColumnName(o); + Object conditionValue = originalConditionMap.getOrDefault(column, map.get(column)); + originalConditionMap.putIfAbsent(column,conditionValue.toString()); + IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); + value.setColValue(conditionValue.toString()); + columnWrappers.put(o.getItemId(), value); } + } + /*if (e.getItemId().equals("1078")) { + IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); + value.setColValue(gridId.toString()); + columnWrappers.put("1001", value); + }else if (e.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ + continue; }*/ - Object homeId = map.get(UserConstant.HOME_ID); - if (homeId != null) { - HashSet houseIds = new HashSet<>(); - houseIds.add(homeId.toString()); - Result> houseInfoRes = govOrgOpenFeignClient.queryListHouseInfo(houseIds); - if (houseInfoRes != null && houseInfoRes.success() && CollectionUtils.isNotEmpty(houseInfoRes.getData())) { - HouseInfoDTO houseInfoDTO = houseInfoRes.getData().get(NumConstant.ZERO); - map.put("VILLAGE_NAME", houseInfoDTO.getNeighborHoodName()); - map.put("BUILD_NAME", houseInfoDTO.getBuildingName()); - map.put("HOME_ID", houseInfoDTO.getHouseName()); - map.put("UNIT_ID", houseInfoDTO.getUnitName()); + Cache cache = remoteOptionCacheMap.getOrDefault(e.getItemId(), CacheBuilder.newBuilder().maximumSize(NumConstant.FIVE_HUNDRED).build()); + remoteOptionCacheMap.put(e.getItemId(),cache); + String cacheValue = cache.getIfPresent(vauleStr); + if (StringUtils.isNotBlank(cacheValue)){ + map.put(columnName,cacheValue); + } else { + Map remoteOptions = icResiUserImportService.listRemoteOptions(columnWrappers, e.getOptionSourceValue(), currentStaffAgencyId, "query"); + if (FormItemTypeEnum.CHECKBOX.getCode().equals(e.getItemType())) { + remoteOptions.forEach((label, value) -> map.put(value, vauleStr.contains(value) ? "是" : "否")); + } else if (FormItemTypeEnum.SELECT.getCode().equals(e.getItemType())) { + remoteOptions.forEach((label, value) -> { + if (vauleStr.equals(value)) { + map.put(columnName, label); + } + cache.put(value,label); + }); } } - //把人放入缓存 - redisUtils.hMSet(RedisKeys.getExportResiBaseInfoKey(resiId),map,RedisUtils.MINUTE_THIRTY_EXPIRE); - }); - return result; + } catch (Exception ex) { + log.warn("listRemoteOptions url:{}", e.getOptionSourceValue()); + } + } + + private void putOptionValue(Map map, FormItemResult e, String columnName, String vauleStr) { + FormItemTypeEnum itemTypeEnum = FormItemTypeEnum.getEnum(e.getItemType()); + switch (itemTypeEnum) { + case CHECKBOX: + e.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(), vauleStr.contains(optionDTO.getValue()) ? "是" : "否"); + }); + break; + case SELECT: + case RADIO: + e.getOptions().forEach(optionDTO -> { + if (optionDTO.getValue().equals(vauleStr)) { + map.put(columnName, optionDTO.getLabel()); + } + }); + break; + default: + } + } + + private String getColumnName(FormItemResult e) { + return e.getColumnNum() == NumConstant.ZERO? e.getColumnName():e.getColumnName().concat(e.getColumnNum().toString()); } /** diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx index c427b87ad521578abe21e75d3462592d4dc793b6..bb88725ee669eec8e404a2dbdfaf20943df9e261 100644 GIT binary patch delta 16419 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 Cz#$v}