From 6aa5305c59fbdfb70339cd276dc207c89f3bcf9f Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 23 May 2022 16:43:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=9A=E5=91=98=E5=AF=BC=E5=85=A5=EF=BC=8Csq?= =?UTF-8?q?l=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/constants/ImportTaskConstants.java | 1 + .../controller/IcPartyMemberController.java | 73 +++++- .../excel/IcPartyMemberImportExcel.java | 82 +++++++ .../handler/IcPartyMemberImportListener.java | 130 ++++++++++ .../service/IcPartyMemberService.java | 8 + .../impl/IcPartyMemberServiceImpl.java | 230 +++++++++++++++++- .../migration/V0.0.4__party_member_manage.sql | 132 ++++++++++ .../db/migration/V0.0.50_ic_volunteer.sql | 41 ++++ 8 files changed, 688 insertions(+), 9 deletions(-) create mode 100644 epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/IcPartyMemberImportExcel.java create mode 100644 epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/handler/IcPartyMemberImportListener.java create mode 100644 epmet-module/resi-partymember/resi-partymember-server/src/main/resources/db/migration/V0.0.4__party_member_manage.sql create mode 100644 epmet-user/epmet-user-server/src/main/resources/db/migration/V0.0.50_ic_volunteer.sql diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java index e6e567c43b..8c439aa218 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java @@ -18,6 +18,7 @@ public interface ImportTaskConstants { String BIZ_TYPE_ATTENTION_NAT = "attention_nat"; String BIZ_TYPE_ATTENTION_VACCINATION = "attention_vaccination"; String BIZ_TYPE_ATTENTION_TRIP_REPORT = "attention_vaccination"; + String BIZ_TYPE_IC_PARTY_MEMBER = "ic_party_member"; /** * 核酸检测 */ diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/controller/IcPartyMemberController.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/controller/IcPartyMemberController.java index 3ef1dc2439..b53d989d56 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/controller/IcPartyMemberController.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/controller/IcPartyMemberController.java @@ -7,23 +7,27 @@ import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.annotation.MaskResponse; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.dto.result.OptionDataResultDTO; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.ExcelUtils; -import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.*; import com.epmet.commons.tools.utils.poi.excel.handler.FreezeAndFilter; import com.epmet.commons.tools.validator.AssertUtils; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.constants.ImportTaskConstants; +import com.epmet.dto.result.ImportTaskCommonResultDTO; import com.epmet.dto.form.IcPartyMemberFormDTO; import com.epmet.dto.form.IcPartyMemberListFormDTO; import com.epmet.dto.result.PartyMemberAgeResultDTO; @@ -33,15 +37,23 @@ import com.epmet.modules.partymember.service.IcPartyMemberService; import com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO; import com.epmet.resi.partymember.dto.partymember.form.IcPartyMemberFromDTO; import com.epmet.resi.partymember.dto.partymember.result.IcPartyMemberResultDTO; +import com.epmet.utils.ImportTaskUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.io.PrintWriter; +import java.nio.file.Path; import java.util.List; +import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -54,7 +66,7 @@ import java.util.concurrent.atomic.AtomicInteger; @Slf4j @RestController @RequestMapping("icPartyMember") -public class IcPartyMemberController { +public class IcPartyMemberController implements ResultDataResolver { @Autowired private IcPartyMemberService icPartyMemberService; @@ -142,6 +154,59 @@ public class IcPartyMemberController { return new Result(); } + /** + * excel导入 + * @Param file + * @Return {@link Result} + * @Author zhaoqifeng + * @Date 2022/5/23 16:05 + */ + @PostMapping("import") + public Result importExcel(MultipartFile file) { + String userId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID); + + // 1.暂存文件 + String originalFilename = file.getOriginalFilename(); + String extName = originalFilename.substring(originalFilename.lastIndexOf(".")); + + Path fileSavePath; + try { + Path importPath = FileUtils.getAndCreateDirUnderEpmetFilesDir("ic_party_member", "import"); + fileSavePath = importPath.resolve(UUID.randomUUID().toString().concat(extName)); + } catch (IOException e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + log.error("【党员管理导入】创建临时存储文件失败:{}", errorMsg); + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "文件上传失败", "文件上传失败"); + } + + InputStream is = null; + FileOutputStream os = null; + + try { + is = file.getInputStream(); + os = new FileOutputStream(fileSavePath.toString()); + IOUtils.copy(is, os); + } catch (Exception e) { + log.error("method exception", e); + } finally { + org.apache.poi.util.IOUtils.closeQuietly(is); + org.apache.poi.util.IOUtils.closeQuietly(os); + } + + // 2.生成导入任务记录 + ImportTaskCommonResultDTO rstData = getResultDataOrThrowsException( + ImportTaskUtils.createImportTask(originalFilename, ImportTaskConstants.BIZ_TYPE_IC_PARTY_MEMBER), + ServiceConstant.EPMET_COMMON_SERVICE, + EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), + "excel导入党员信息错误", + "导入党员信息失败"); + + // 3.执行导入 + icPartyMemberService.execAsyncExcelImport(fileSavePath, rstData.getTaskId()); + + return new Result(); + } + /** * @describe: 统计分析-党员学历统计 * @author wangtong diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/IcPartyMemberImportExcel.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/IcPartyMemberImportExcel.java new file mode 100644 index 0000000000..245e97a52d --- /dev/null +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/IcPartyMemberImportExcel.java @@ -0,0 +1,82 @@ +package com.epmet.modules.partymember.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + +/** + * 核酸检测信息导入excel数据 + * @author Administrator + */ +@Data +public class IcPartyMemberImportExcel { + + @NotBlank(message = "所属党组织为必填项") + @ExcelProperty("所属党组织") + private String sszb; + + @NotBlank(message = "姓名为必填项") + @ExcelProperty("姓名") + private String name; + + @NotBlank(message = "手机号为必填项") + @ExcelProperty("手机号") + @Length(max = 15, message = "手机号长度不正确,应小于15位") + private String mobile; + + @NotBlank(message = "身份证号为必填项") + @ExcelProperty("身份证号") + @Length(max = 18, message = "身份证号长度不正确,应小于18位") + private String idCard; + + @ExcelProperty("地址") + private Date address; + + @ExcelProperty("入党时间") + private String rdsj; + + @ExcelProperty("流动党员") + private String isLd; + + @ExcelProperty("流动党员证号") + private String ldzh; + + @ExcelProperty("党员中心户") + private String isDyzxh; + + @ExcelProperty("免学习") + private String isMxx; + + @ExcelProperty("职务") + private String partyZw; + + @ExcelProperty("文化程度") + private String culture; + + @ExcelProperty("备注") + private String remark; + + @Data + public static class RowRemarkMessage { + + @ExcelProperty("姓名") + @ColumnWidth(20) + private String name; + + @ExcelProperty("手机号") + @ColumnWidth(20) + private String mobile; + + @ColumnWidth(20) + @ExcelProperty("身份证号") + private String idCard; + + @ColumnWidth(60) + @ExcelProperty("错误信息") + private String errorInfo; + } +} diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/handler/IcPartyMemberImportListener.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/handler/IcPartyMemberImportListener.java new file mode 100644 index 0000000000..74161c69f9 --- /dev/null +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/excel/handler/IcPartyMemberImportListener.java @@ -0,0 +1,130 @@ +package com.epmet.modules.partymember.excel.handler; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.ValidateException; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.modules.partymember.entity.IcPartyMemberEntity; +import com.epmet.modules.partymember.excel.IcPartyMemberImportExcel; +import com.epmet.modules.partymember.service.impl.IcPartyMemberServiceImpl; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 核酸检测excel导入监听器 + * @author Administrator + */ +@Data +@Slf4j +public class IcPartyMemberImportListener implements ReadListener { + + /** + * 最大条数阈值 + */ + public static final int MAX_THRESHOLD = 200; + + private String currentUserId; + /** + * 当前组织ID + */ + private String currentAgencyId; + + private String currentAgencyPids; + + /** + * 数据 + */ + private List datas = new ArrayList<>(); + + /** + * 错误项列表 + */ + private List errorRows = new ArrayList<>(); + /** + * 其他被标记出来的列表列表 + */ + private List otherRows = new ArrayList<>(); + + private IcPartyMemberServiceImpl icPartyMemberService; + + public IcPartyMemberImportListener(String currentUserId, IcPartyMemberServiceImpl icPartyMemberService) { + this.currentUserId = currentUserId; + this.icPartyMemberService = icPartyMemberService; + } + + @Override + public void invoke(IcPartyMemberImportExcel data, AnalysisContext context) { + + try { + // 先校验数据 + ValidatorUtils.validateEntity(data); + if (StringUtils.isNotBlank(data.getSszb())) { + data.setSszb(data.getSszb().trim()); + } + if (StringUtils.isNotBlank(data.getName())) { + data.setName(data.getName().trim()); + } + if (StringUtils.isNotBlank(data.getMobile())) { + data.setMobile(data.getMobile().trim()); + } + if (StringUtils.isNotBlank(data.getIdCard())) { + data.setIdCard(data.getIdCard().trim()); + } + + IcPartyMemberEntity icPartyMemberEntity = ConvertUtils.sourceToTarget(data, IcPartyMemberEntity.class); + datas.add(icPartyMemberEntity); + + if (datas.size() == MAX_THRESHOLD) { + execPersist(); + } + } catch (Exception e) { + String errorMsg = null; + if (e instanceof ValidateException) { + errorMsg = ((ValidateException) e).getMsg(); + } else { + errorMsg = "未知错误"; + log.error("【核酸检测信息导入】出错:{}", ExceptionUtils.getErrorStackTrace(e)); + } + + IcPartyMemberImportExcel.RowRemarkMessage errorRow = new IcPartyMemberImportExcel.RowRemarkMessage(); + errorRow.setName(data.getName()); + errorRow.setMobile(data.getMobile()); + errorRow.setIdCard(data.getIdCard()); + errorRow.setErrorInfo(errorMsg); + errorRows.add(errorRow); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 最后几条达不到阈值,这里必须再调用一次 + execPersist(); + } + + /** + * 执行持久化 + */ + private void execPersist() { + try { + if (datas != null && datas.size() > 0) { + icPartyMemberService.batchPersist(datas, this); + } + } finally { + datas.clear(); + } + } + + /** + * 获取错误行 + * @return + */ + public List getErrorRows() { + return errorRows; + } +} diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/IcPartyMemberService.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/IcPartyMemberService.java index ec976d2596..c0ea774846 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/IcPartyMemberService.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/IcPartyMemberService.java @@ -13,6 +13,7 @@ import com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO; import com.epmet.resi.partymember.dto.partymember.form.IcPartyMemberFromDTO; import com.epmet.resi.partymember.dto.partymember.result.IcPartyMemberResultDTO; +import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -129,4 +130,11 @@ public interface IcPartyMemberService extends BaseService { * @return com.epmet.commons.tools.utils.Result> */ List partyMemberAgeStatistics(IcPartyMemberFormDTO formDTO); + + + /** + * 执行Excel导入 + * @param filePath + */ + void execAsyncExcelImport(Path filePath, String importTaskId); } diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/IcPartyMemberServiceImpl.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/IcPartyMemberServiceImpl.java index 2dc1591f1f..ffde23e85d 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/IcPartyMemberServiceImpl.java +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/IcPartyMemberServiceImpl.java @@ -1,9 +1,11 @@ package com.epmet.modules.partymember.service.impl; +import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; @@ -16,20 +18,23 @@ import com.epmet.commons.tools.enums.IcFormCodeEnum; import com.epmet.commons.tools.enums.PartyPostEnum; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.DateUtils; -import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.*; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dto.form.IcFormOptionsQueryFormDTO; import com.epmet.dto.form.IcPartyMemberFormDTO; import com.epmet.dto.form.IcPartyMemberListFormDTO; import com.epmet.dto.result.PartyMemberAgeResultDTO; import com.epmet.dto.result.PartyMemberEducationResultDTO; +import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.feign.EpmetAdminOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.feign.OssFeignClient; import com.epmet.modules.partyOrg.dao.IcPartyOrgDao; import com.epmet.modules.partyOrg.entity.IcPartyOrgEntity; import com.epmet.modules.partyOrg.service.IcPartyOrgService; @@ -39,20 +44,34 @@ import com.epmet.modules.partymember.dao.IcPartyMemberPointDao; import com.epmet.modules.partymember.entity.IcPartyMemberEntity; import com.epmet.modules.partymember.entity.IcPartyMemberPayRecordEntity; import com.epmet.modules.partymember.entity.IcPartyMemberPointEntity; +import com.epmet.modules.partymember.excel.IcPartyMemberImportExcel; +import com.epmet.modules.partymember.excel.handler.IcPartyMemberImportListener; import com.epmet.modules.partymember.service.IcPartyMemberService; import com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO; import com.epmet.resi.partymember.dto.partymember.form.IcPartyMemberFromDTO; import com.epmet.resi.partymember.dto.partymember.result.IcPartyMemberResultDTO; +import com.epmet.utils.ImportTaskUtils; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; +import org.apache.poi.util.IOUtils; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.annotation.Resource; +import java.io.IOException; +import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; @@ -62,8 +81,9 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2022-05-17 */ +@Slf4j @Service -public class IcPartyMemberServiceImpl extends BaseServiceImpl implements IcPartyMemberService { +public class IcPartyMemberServiceImpl extends BaseServiceImpl implements IcPartyMemberService, ResultDataResolver { @Resource private IcPartyOrgService icPartyOrgService; @@ -79,6 +99,8 @@ public class IcPartyMemberServiceImpl extends BaseServiceImpl page(TokenDto tokenDto, IcPartyMemberFromDTO formDTO) { @@ -419,4 +441,202 @@ public class IcPartyMemberServiceImpl extends BaseServiceImpl errorRows = listener.getErrorRows(); + List otherRows = listener.getOtherRows(); + + boolean failed = errorRows.size() > 0; + + // 合并到一起写入 + errorRows.addAll(otherRows); + + // 生成并上传描述文件 + OutputStream os = null; + FileItem fileItem = null; + if (errorRows.size() > 0) { + try { + // 文件生成 + Path errorDescDir = FileUtils.getAndCreateDirUnderEpmetFilesDir("ic_nat", "import", "error_des"); + String timeMillis = String.valueOf(System.currentTimeMillis()); + String fileName = "icnat_import_error_".concat(timeMillis).concat(".xlsx"); + + fileItem = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, errorDescDir.toFile()) + .createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName); + + os = fileItem.getOutputStream(); + + EasyExcel.write(os, IcPartyMemberImportExcel.RowRemarkMessage.class).sheet("信息列表").doWrite(errorRows); + // 文件上传oss + Result errorDesFileUploadResult = ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem)); + if (errorDesFileUploadResult.success()) { + errorDesFileUrl = errorDesFileUploadResult.getData().getUrl(); + } + } finally { + IOUtils.closeQuietly(os); + try { + fileItem.delete(); + } catch (Exception e){ + log.error("【核酸检测导入】删除临时描述文件失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } + } + + // 完成导入 + Result result = ImportTaskUtils.finishImportTask(importTaskId, + failed ? ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL : ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS, + errorDesFileUrl, + ""); + + if (!result.success()) { + log.error("【核酸检测导入】导入记录状态修改为'finished_success'失败"); + } + } catch (Exception e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + log.error("【核酸检测导入】出错:{}", errorMsg); + + Result result = ImportTaskUtils.finishImportTask(importTaskId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, null, "导入失败"); + + if (!result.success()) { + log.error("【核酸检测导入】导入记录状态修改为'finished_fail'失败"); + } + } finally { + // 删除临时文件 + if (Files.exists(filePath)) { + try { + Files.delete(filePath); + } catch (IOException e) { + log.error("method exception", e); + } + } + } + } + + /** + * 批量持久化 + * @param entities + */ + public void batchPersist(List entities, IcPartyMemberImportListener listener) { + String customerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID); + String currentUserId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID); + + entities.forEach(e -> { + try { + persistPartyMember(e, customerId, currentUserId, listener); + } catch (Exception exception) { + String errorMsg = ExceptionUtils.getErrorStackTrace(exception); + log.error(errorMsg); + + IcPartyMemberImportExcel.RowRemarkMessage errorRow = new IcPartyMemberImportExcel.RowRemarkMessage(); + errorRow.setName(e.getName()); + errorRow.setMobile(e.getMobile()); + errorRow.setIdCard(e.getIdCard()); + errorRow.setErrorInfo("未知系统错误"); + listener.getErrorRows().add(errorRow); + } + }); + } + + /** + * 单条持久化 + * @Param e + * @Param customerId + * @Param currentUserId + * @Param listener + * @Return + * @Author zhaoqifeng + * @Date 2022/5/23 15:24 + */ + @Transactional(rollbackFor = Exception.class) + public void persistPartyMember(IcPartyMemberEntity e, String customerId, String currentUserId, IcPartyMemberImportListener listener) { + List otherRows = listener.getOtherRows(); + String idCard = e.getIdCard(); + String name = e.getName(); + String mobile = e.getMobile(); + + //获取党组织信息 + LambdaUpdateWrapper orgWrapper = new LambdaUpdateWrapper<>(); + orgWrapper.eq(IcPartyOrgEntity::getCustomerId, customerId); + orgWrapper.eq(IcPartyOrgEntity::getPartyOrgName, e.getSszb()); + IcPartyOrgEntity org = icPartyOrgDao.selectOne(orgWrapper); + if (null == org) { + String message = "所属党组织不存在"; + IcPartyMemberImportExcel.RowRemarkMessage errorRow = new IcPartyMemberImportExcel.RowRemarkMessage(); + errorRow.setName(name); + errorRow.setMobile(mobile); + errorRow.setIdCard(idCard); + errorRow.setErrorInfo(message); + otherRows.add(errorRow); + return; + } + + //判断党员是否已存在 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcPartyMemberEntity::getCustomerId, customerId); + wrapper.eq(IcPartyMemberEntity::getIdCard, e.getIdCard()); + IcPartyMemberEntity partyMember = baseDao.selectOne(wrapper); + if (null != partyMember) { + String message = "党员已存在"; + IcPartyMemberImportExcel.RowRemarkMessage errorRow = new IcPartyMemberImportExcel.RowRemarkMessage(); + errorRow.setName(name); + errorRow.setMobile(mobile); + errorRow.setIdCard(idCard); + errorRow.setErrorInfo(message); + otherRows.add(errorRow); + return; + } + + e.setAgencyId(org.getAgencyId()); + e.setAgencyPids(org.getAgencyPids()); + e.setSszb(org.getId()); + e.setOrgPids(org.getOrgPids()); + + e.setIsLd(("是").equals(e.getIsLd())?NumConstant.ONE_STR:NumConstant.ZERO_STR); + e.setIsDyzxh(("是").equals(e.getIsDyzxh())?NumConstant.ONE_STR:NumConstant.ZERO_STR); + e.setIsMxx(("是").equals(e.getIsMxx())?NumConstant.ONE_STR:NumConstant.ZERO_STR); + //职务 + e.setPartyZw(PartyPostEnum.getCode(e.getPartyZw())); + //文化程度 + //获取文化程度字典 + DictListFormDTO dictFormDTO = new DictListFormDTO(); + dictFormDTO.setDictType(DictTypeEnum.EDUCATION.getCode()); + Result> education = epmetAdminOpenFeignClient.dictList(dictFormDTO); + if (CollectionUtils.isNotEmpty(education.getData())) { + Map map = education.getData().stream().collect(Collectors.toMap(DictListResultDTO::getLabel, DictListResultDTO::getValue)); + e.setCulture(map.get(e.getCulture())); + } + + //同步ic_resi_user表对应的数据,并获取志愿者类型 + Result result = epmetUserOpenFeignClient.icPartyMemberSync(ConvertUtils.sourceToTarget(e, IcPartyMemberDTO.class)); + if (!result.success() && null != result.getData()) { + e.setIcResiUser(result.getData().getIcResiUser()); + e.setVolunteerCategory(result.getData().getVolunteerCategory()); + } + + baseDao.insert(e); + } + +} \ No newline at end of file diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/resources/db/migration/V0.0.4__party_member_manage.sql b/epmet-module/resi-partymember/resi-partymember-server/src/main/resources/db/migration/V0.0.4__party_member_manage.sql new file mode 100644 index 0000000000..cff80410de --- /dev/null +++ b/epmet-module/resi-partymember/resi-partymember-server/src/main/resources/db/migration/V0.0.4__party_member_manage.sql @@ -0,0 +1,132 @@ +CREATE TABLE `ic_party_member` +( + `ID` varchar(64) NOT NULL COMMENT '唯一标识', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id customer.id', + `ORG_PIDS` varchar(255) DEFAULT NULL COMMENT '党组织的所有上级ID,没有上级时为0', + `AGENCY_ID` varchar(64) NOT NULL COMMENT '行政组织 机关ID', + `AGENCY_PIDS` varchar(255) NOT NULL COMMENT '行政组织 机关ID', + `IC_RESI_USER` varchar(64) DEFAULT NULL COMMENT '对应的ic_resi_user主表Id', + `NAME` varchar(64) NOT NULL COMMENT '姓名', + `MOBILE` varchar(15) DEFAULT NULL COMMENT '手机号', + `ID_CARD` varchar(18) NOT NULL COMMENT '身份证号', + `ADDRESS` varchar(255) DEFAULT NULL COMMENT '地址', + `RDSJ` varchar(64) DEFAULT NULL COMMENT '入党时间', + `SSZB` varchar(256) DEFAULT NULL COMMENT '所属支部', + `IS_LD` char(2) DEFAULT NULL COMMENT '是否流动党员', + `LDZH` varchar(64) DEFAULT NULL COMMENT '流动党员活动证号', + `PARTY_ZW` varchar(256) DEFAULT NULL COMMENT '职务', + `IS_TX` char(2) DEFAULT NULL COMMENT '是否退休', + `IS_DYZXH` char(2) DEFAULT NULL COMMENT '是否党员中心户', + `IS_MXX` char(2) DEFAULT NULL COMMENT '是否免学习0否,1是', + `CULTURE` varchar(20) DEFAULT NULL COMMENT '文化程度【字典表】', + `VOLUNTEER_CATEGORY` varchar(255) DEFAULT NULL COMMENT '志愿者类型,逗号隔开', + `REMARK` varchar(255) DEFAULT NULL COMMENT '备注', + `FIELD1` varchar(256) DEFAULT NULL COMMENT '预留字段1', + `FIELD2` varchar(256) DEFAULT NULL COMMENT '预留字段2', + `FIELD3` varchar(256) DEFAULT NULL COMMENT '预留字段3', + `FIELD4` varchar(256) DEFAULT NULL COMMENT '预留字段4', + `FIELD5` varchar(256) DEFAULT NULL COMMENT '预留字段5', + `DEL_FLAG` int(1) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(64) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(64) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`ID`) USING BTREE, + UNIQUE KEY `un_party_mem` (`IC_RESI_USER`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + ROW_FORMAT = COMPACT COMMENT ='数字平台党员信息表'; + +CREATE TABLE `ic_party_member_pay_record` +( + `ID` varchar(64) NOT NULL COMMENT '唯一标识', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id (customer.id)', + `PARTY_MEMBER_ID` varchar(64) NOT NULL COMMENT '党员ID', + `PAY_DATE` varchar(18) NOT NULL COMMENT '缴费日期', + `MONEY` decimal(8, 2) NOT NULL COMMENT '缴费金额', + `START_DATE` varchar(18) NOT NULL COMMENT '缴费开始时间', + `END_DATE` varchar(18) NOT NULL COMMENT '缴费结束时间', + `DEL_FLAG` int(11) NOT NULL COMMENT '删除标识:0.未删除 1.已删除', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + ROW_FORMAT = COMPACT COMMENT ='党员缴费记录表'; + +CREATE TABLE `ic_party_member_pay_record_detail` +( + `ID` varchar(64) NOT NULL COMMENT '唯一标识', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id (customer.id)', + `PARTY_MEMBER_ID` varchar(64) NOT NULL COMMENT '党员ID', + `RECORD_ID` varchar(64) NOT NULL COMMENT '党员缴费记录表ID', + `YEAR` varchar(18) NOT NULL COMMENT '缴费年度', + `MONTH` varchar(18) NOT NULL COMMENT '缴费月份', + `MONEY` decimal(8, 2) NOT NULL COMMENT '缴费金额', + `DEL_FLAG` int(11) NOT NULL COMMENT '删除标识:0.未删除 1.已删除', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + ROW_FORMAT = COMPACT COMMENT ='党员缴费记录明细表'; + +CREATE TABLE `ic_party_member_point` +( + `ID` varchar(64) NOT NULL DEFAULT '0' COMMENT '唯一标识', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id (customer.id)', + `PARTY_MEMBER_ID` varchar(64) NOT NULL COMMENT '党员ID', + `YEAR` varchar(8) NOT NULL COMMENT '年', + `QUARTER` varchar(8) NOT NULL COMMENT '季度', + `BASE_POINT` int(11) DEFAULT '0' COMMENT '基础积分分值', + `BASE_OPTIONS` varchar(20) DEFAULT NULL COMMENT '基础积分选项 英文逗号隔开', + `REVIEW_POINT` int(11) DEFAULT '0' COMMENT '民主评议积分分值', + `REVIEW_OPTIONS` varchar(20) DEFAULT NULL COMMENT '民主评议积分选项', + `INSPIRE_POINT` int(11) unsigned DEFAULT '0' COMMENT '激励积分分值', + `INSPIRE_OPTIONS` varchar(20) DEFAULT NULL COMMENT '激励积分选项', + `WARN_POINT` int(11) DEFAULT '0' COMMENT '警示扣分分值', + `WARN_OPTIONS` varchar(20) DEFAULT NULL COMMENT '警示扣分选项', + `TOTAL_SCORE` int(32) DEFAULT '0' COMMENT '总分', + `DEL_FLAG` int(1) NOT NULL COMMENT '删除标识:0.未删除 1.已删除', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + ROW_FORMAT = COMPACT COMMENT ='党员量化积分表'; + +CREATE TABLE `ic_party_org` +( + `ID` varchar(64) NOT NULL COMMENT '唯一标识', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id (customer.id)', + `ORG_PID` varchar(64) NOT NULL COMMENT '党组织的上级ID,没有上级时为0', + `ORG_PIDS` varchar(512) NOT NULL COMMENT '党组织的所有上级ID,没有上级时为0', + `AGENCY_ID` varchar(64) NOT NULL COMMENT '行政组织 机关ID', + `AGENCY_PIDS` varchar(512) NOT NULL COMMENT '行政组织 机关ID', + `PARTY_ORG_TYPE` char(1) NOT NULL COMMENT '党组织类型 0省委,1市委,2区委,3党工委,4党委,5支部', + `PARTY_ORG_NAME` varchar(20) NOT NULL COMMENT '组织名称', + `PARTY_ORG_CODE` varchar(128) DEFAULT NULL COMMENT '组织编码', + `LONGITUDE` varchar(32) NOT NULL COMMENT '经度', + `LATITUDE` varchar(32) NOT NULL COMMENT '纬度', + `ADDRESS` varchar(255) DEFAULT NULL COMMENT '地址', + `INTRODUCTION` varchar(500) DEFAULT NULL COMMENT '党组织介绍', + `DEL_FLAG` int(1) NOT NULL COMMENT '删除标识:0.未删除 1.已删除', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + ROW_FORMAT = COMPACT COMMENT ='党组织表'; \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/db/migration/V0.0.50_ic_volunteer.sql b/epmet-user/epmet-user-server/src/main/resources/db/migration/V0.0.50_ic_volunteer.sql new file mode 100644 index 0000000000..621c0c6f63 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/db/migration/V0.0.50_ic_volunteer.sql @@ -0,0 +1,41 @@ +CREATE TABLE `ic_volunteer_poly` +( + `ID` varchar(64) NOT NULL COMMENT '主键', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id customer.id', + `USER_ID` varchar(64) DEFAULT NULL COMMENT '居民端用户id', + `IC_RESI_USER` varchar(64) DEFAULT NULL COMMENT '对应的ic_resi_user主表Id', + `AGENCY_ID` varchar(64) DEFAULT NULL COMMENT '行政组织 机关ID', + `AGENCY_PIDS` varchar(255) DEFAULT NULL COMMENT '行政组织 机关ID', + `NAME` varchar(32) NOT NULL COMMENT '居住成员1姓名', + `ID_CARD` varchar(18) NOT NULL COMMENT '身份证号', + `MOBILE` varchar(15) DEFAULT NULL COMMENT '手机号', + `GENDER` char(2) DEFAULT NULL COMMENT '性别', + `LONGITUDE` varchar(64) DEFAULT NULL COMMENT '经度', + `LATITUDE` varchar(64) DEFAULT NULL COMMENT '纬度', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `DEL_FLAG` int(11) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除', + `UPDATED_BY` varchar(64) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + `CREATED_BY` varchar(64) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='志愿者信息聚合'; + +CREATE TABLE `ic_volunteer_poly_category` +( + `ID` varchar(64) NOT NULL COMMENT '主键', + `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id customer.id', + `ID_CARD` varchar(18) NOT NULL COMMENT '身份证号', + `VOLUNTEER_CATEGORY` varchar(256) DEFAULT NULL COMMENT '类别【字典表】', + `LONGITUDE` varchar(64) DEFAULT NULL COMMENT '经度', + `LATITUDE` varchar(64) DEFAULT NULL COMMENT '纬度', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `DEL_FLAG` int(11) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除', + `UPDATED_BY` varchar(64) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + `CREATED_BY` varchar(64) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='志愿者信息聚合,志愿者类别表'; \ No newline at end of file