From 7515277f481430c490f9746d38ff71c72dbfc3bc Mon Sep 17 00:00:00 2001 From: wanggongfeng <1305282856@qq.com> Date: Tue, 29 Nov 2022 10:06:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A6=8F=E5=88=A9=E4=BA=BA=E5=91=98=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChangeWelfareController.java | 70 +++++ .../java/com/epmet/dao/ChangeWelfareDao.java | 2 + .../java/com/epmet/dao/IcResiUserDao.java | 3 + .../epmet/excel/ChangeWelfareImportExcel.java | 63 +++++ .../excel/error/ChangeWelfareErrorExcel.java | 35 +++ .../epmet/service/ChangeWelfareService.java | 11 + .../impl/ChangeWelfareServiceImpl.java | 242 ++++++++++++++++++ .../resources/excel/pli_change_welfare.xlsx | Bin 0 -> 11358 bytes .../resources/mapper/ChangeWelfareDao.xml | 8 + .../main/resources/mapper/IcResiUserDao.xml | 4 + 10 files changed, 438 insertions(+) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/ChangeWelfareImportExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/error/ChangeWelfareErrorExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/pli_change_welfare.xlsx diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/ChangeWelfareController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/ChangeWelfareController.java index c1cac171ec..671c4c8681 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/ChangeWelfareController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/ChangeWelfareController.java @@ -1,8 +1,13 @@ package com.epmet.controller; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +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.exception.EpmetException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.ExcelPoiUtils; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -10,14 +15,23 @@ 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.ChangeWelfareDTO; import com.epmet.dto.CheckWelfareByIdCardDTO; +import com.epmet.dto.form.ImportTaskCommonFormDTO; +import com.epmet.dto.result.ImportTaskCommonResultDTO; import com.epmet.excel.ChangeWelfareExcel; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.service.ChangeWelfareService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; 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.InputStream; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,11 +44,15 @@ import java.util.Map; */ @RestController @RequestMapping("changeWelfare") +@Slf4j public class ChangeWelfareController { @Autowired private ChangeWelfareService changeWelfareService; + @Autowired + private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient; + @RequestMapping("page") @MaskResponse(fieldNames = {"mobile", "idCard"}, fieldsMaskType = {MaskResponse.MASK_TYPE_MOBILE, MaskResponse.MASK_TYPE_ID_CARD}) public Result> page(@RequestParam Map params){ @@ -109,4 +127,56 @@ public class ChangeWelfareController { return changeWelfareService.checkWelfareByIdCard(dto); } + /** + * Desc: 【福利人员】导入 + * @param + * @author wgf + * @date 2022/11/28 13:40 + */ + @PostMapping("pointImport") + public Result pointImport(@LoginUser TokenDto tokenDto, @RequestParam("file") MultipartFile file){ + if (file.isEmpty()) { + throw new EpmetException("请上传文件"); + } + // 校验文件类型 + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (!"xls".equals(extension) && !"xlsx".equals(extension)) { + throw new EpmetException("文件类型不匹配"); + } + + ImportTaskCommonFormDTO importTaskForm = new ImportTaskCommonFormDTO(); + importTaskForm.setOriginFileName(file.getOriginalFilename()); + importTaskForm.setOperatorId(tokenDto.getUserId()); + importTaskForm.setBizType(ImportTaskConstants.IC_POINT_NUCLEIC_MONITORING); + Result result = commonServiceOpenFeignClient.createImportTask(importTaskForm); + if (!result.success()) { + throw new EpmetException(9999,"存在进行中的导入"); + } + InputStream inputStream = null; + try { + inputStream = file.getInputStream(); + }catch (Exception e){ + ImportTaskCommonFormDTO input = new ImportTaskCommonFormDTO(); + input.setOperatorId(tokenDto.getUserId()); + input.setTaskId(result.getData().getTaskId()); + input.setProcessStatus(ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL); + commonServiceOpenFeignClient.finishImportTask(input); + log.error("读取文件失败"); + } + changeWelfareService.importFile(tokenDto,inputStream,result.getData().getTaskId()); + return new Result(); + } + + + /** + * 导出模板 + * @param response + * @throws Exception + */ + @PostMapping("exporttemplate") + public void exportTemplate( HttpServletResponse response) throws Exception { + TemplateExportParams templatePath = new TemplateExportParams("excel/pli_change_welfare.xlsx"); + ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"福利人员模板",response); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/ChangeWelfareDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/ChangeWelfareDao.java index c7f64d3231..14cc96ce66 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/ChangeWelfareDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/ChangeWelfareDao.java @@ -45,4 +45,6 @@ public interface ChangeWelfareDao extends BaseDao { * @return com.epmet.commons.tools.utils.Result */ void removeWelfare(ChangeWelfareDTO dto); + + List getAllWelfareIdCard(@Param("customerId") String customerId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 23830a2e4c..e6845fefd3 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -444,4 +444,7 @@ public interface IcResiUserDao extends BaseDao { List getResiUserList(ComparisonFormDTO formDTO); List getUserByRenHu(RHZKStatisticsFormDTO formDTO); + + List getImportUserList(@Param("customerId")String customerId,@Param("agencyId")String agencyId); + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/ChangeWelfareImportExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/ChangeWelfareImportExcel.java new file mode 100644 index 0000000000..992be96b4a --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/ChangeWelfareImportExcel.java @@ -0,0 +1,63 @@ +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.excel.annotation.ExcelIgnore; +import lombok.Data; + +/** + * 福利表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-05-09 + */ +@Data +public class ChangeWelfareImportExcel { + + @Excel(name = "姓名") + private String name; + + @Excel(name = "证件号") + private String idCard; + + @Excel(name = "手机号") + private String mobile; + + @Excel(name = "性别",replace = { "男_1", "女_0", " _null"} ) + private String gender; + +// @Excel(name = "类型") +// private String type; + + @Excel(name = "福利原因") + private String joinReason; + +// @Excel(name = "客户ID") +// private String customerId; + + @ExcelIgnore + private Boolean addStatus = false; + + @ExcelIgnore + private Integer num; + + + /** + * 加入时间 + */ + @ExcelIgnore + private String joinDate; + + /** + * epmet用户主键 + */ + @ExcelIgnore + private String userId; + + /** + * epmet网格ID + */ + @ExcelIgnore + private String gridId; + + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/error/ChangeWelfareErrorExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/error/ChangeWelfareErrorExcel.java new file mode 100644 index 0000000000..edadf94704 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/error/ChangeWelfareErrorExcel.java @@ -0,0 +1,35 @@ +package com.epmet.excel.error; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.excel.annotation.ExcelIgnore; +import lombok.Data; + +/** + * 福利表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2022-05-09 + */ +@Data +public class ChangeWelfareErrorExcel { + + @Excel(name = "行号",width = 10) + private Integer num; + + @Excel(name = "姓名",width = 30) + private String name; + + @Excel(name = "证件号",width = 30) + private String idCard; + + @Excel(name = "手机号",width = 20) + private String mobile; + + @Excel(name = "福利原因",width = 40) + private String joinReason; + + @Excel(name = "错误信息", width = 200) + private String errorMsg; + + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/ChangeWelfareService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/ChangeWelfareService.java index ab13abb470..184cfd9c9a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/ChangeWelfareService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/ChangeWelfareService.java @@ -2,11 +2,13 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.ChangeWelfareDTO; import com.epmet.dto.CheckWelfareByIdCardDTO; import com.epmet.entity.ChangeWelfareEntity; +import java.io.InputStream; import java.util.List; import java.util.Map; @@ -104,4 +106,13 @@ public interface ChangeWelfareService extends BaseService { * @return com.epmet.commons.tools.utils.Result */ Result saveWelfareInfo(ChangeWelfareDTO dto); + + /** + * Desc: 【福利人员】导入 + * @param tokenDto + * @param inputStream + * @author wgf + * @date 2022/11/28 15:35 + */ + void importFile(TokenDto tokenDto, InputStream inputStream, String taskId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/ChangeWelfareServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/ChangeWelfareServiceImpl.java index 87cf889ab7..4b5d11c661 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/ChangeWelfareServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/ChangeWelfareServiceImpl.java @@ -1,32 +1,67 @@ package com.epmet.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; +import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerOrgRedis; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; +import com.epmet.commons.tools.redis.common.bean.AgencyInfoCache; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; +import com.epmet.commons.tools.utils.ExcelPoiUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dao.ChangeWelfareDao; +import com.epmet.dao.IcResiUserDao; import com.epmet.dto.ChangeWelfareDTO; import com.epmet.dto.CheckWelfareByIdCardDTO; +import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.form.ImportTaskCommonFormDTO; import com.epmet.dto.form.RentTenantDataFormDTO; import com.epmet.dto.result.RentTenantDataResultDTO; +import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.entity.ChangeWelfareEntity; +import com.epmet.excel.ChangeWelfareImportExcel; +import com.epmet.excel.error.ChangeWelfareErrorExcel; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; +import com.epmet.feign.GovOrgFeignClient; +import com.epmet.feign.OssFeignClient; import com.epmet.redis.ChangeWelfareRedis; import com.epmet.service.ChangeWelfareService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; +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 java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; /** * 福利表 @@ -35,6 +70,7 @@ import java.util.*; * @since v1.0.0 2022-05-09 */ @Service +@Slf4j public class ChangeWelfareServiceImpl extends BaseServiceImpl implements ChangeWelfareService { @Autowired @@ -46,6 +82,18 @@ public class ChangeWelfareServiceImpl extends BaseServiceImpl page(Map params) { params.put("customerId", loginUserUtil.getLoginUserCustomerId()); @@ -163,4 +211,198 @@ public class ChangeWelfareServiceImpl extends BaseServiceImpl errorInfo = new ArrayList<>(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + try { + List list = ExcelPoiUtils.importExcel(inputStream, 0,1,ChangeWelfareImportExcel.class); + if (CollectionUtils.isEmpty(list)){ + closeTask(taskId,tokenDto.getUserId(), ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL,""); + return; + } + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); + if (null == staffInfo){ + throw new EpmetException("未查询到工作人员信息"+tokenDto.getUserId()); + } + AgencyInfoCache agencyInfo = CustomerOrgRedis.getAgencyInfo(staffInfo.getAgencyId()); + if (null == agencyInfo){ + throw new EpmetException("未查询到组织信息"+staffInfo.getAgencyId()); + } + // 获取所有居民信息 + IcResiUserPageFormDTO formDTO = new IcResiUserPageFormDTO(); + formDTO.setCustomerId(tokenDto.getCustomerId()); + formDTO.setStaffId(tokenDto.getUserId()); + formDTO.setListType("resi"); + formDTO.setConditions(new ArrayList<>()); + + + // 获取居民信息 + CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); + List userList = icResiUserDao.getImportUserList(tokenDto.getCustomerId(),staffInfoCache.getAgencyId()); + // 获取证件号List + List idCardList = userList.stream().map(IcResiUserDTO::getIdCard).collect(Collectors.toList()); + + // 获取已存在福利人员 + List welfareList = baseDao.getAllWelfareIdCard(tokenDto.getCustomerId()); + + + for (int i = 0; i < list.size(); i++) { + list.get(i).setNum(i+1); + if (StringUtils.isBlank(list.get(i).getIdCard()) && !list.get(i).getAddStatus()){ + errorInfo.add(getErrorInfo(list.get(i), "证件号不能为空",i+1)); + list.get(i).setAddStatus(true); + continue; + } + // 校验是否为居民 + if (!idCardList.contains(list.get(i).getIdCard()) && !list.get(i).getAddStatus()){ + errorInfo.add(getErrorInfo(list.get(i), "身份证号为【" + list.get(i).getIdCard() + "】的居民信息未找到,请确认该居民信息存在",i+1)); + list.get(i).setAddStatus(true); + continue; + }else if(idCardList.contains(list.get(i).getIdCard()) && !list.get(i).getAddStatus()){ + // 组装居民数据 + for(IcResiUserDTO icResiUserDTO : userList){ + if(list.get(i).getIdCard().equals(icResiUserDTO.getIdCard())){ + list.get(i).setGender(icResiUserDTO.getGender()); + list.get(i).setMobile(icResiUserDTO.getMobile()); + list.get(i).setName(icResiUserDTO.getName()); + list.get(i).setUserId(icResiUserDTO.getId()); + list.get(i).setGridId(icResiUserDTO.getGridId()); + break; + } + } + list.get(i).setJoinDate(sdf.format(new Date())); + } + // 校验数据库是否存在该福利人员 + if (welfareList.contains(list.get(i).getIdCard()) && !list.get(i).getAddStatus()){ + errorInfo.add(getErrorInfo(list.get(i), "该福利人员已存在",i+1)); + list.get(i).setAddStatus(true); + continue; + } + + } + if (list.size() > errorInfo.size()){ + Map groupByIdCard = list.stream().collect(Collectors.groupingBy(ChangeWelfareImportExcel::getIdCard, Collectors.counting())); + groupByIdCard.forEach((idCard,count) -> { + if (Integer.valueOf(count.toString()).compareTo(1) != 0){ + for (ChangeWelfareImportExcel i : list) { + if (idCard.equals(i.getIdCard()) && !i.getAddStatus()){ + errorInfo.add(getErrorInfo(i,"数据重复",i.getNum())); + i.setAddStatus(true); + } + } + } + }); + } + Map> groupByStatus = list.stream().collect(Collectors.groupingBy(ChangeWelfareImportExcel::getAddStatus)); + List needInsert = groupByStatus.get(false); + if (CollectionUtils.isNotEmpty(needInsert)){ + List entities = ConvertUtils.sourceToTarget(needInsert, ChangeWelfareEntity.class); + entities.forEach(e -> { + // 设置客户ID + e.setCustomerId(tokenDto.getCustomerId()); + }); + insertBatch(entities); + } + if (CollectionUtils.isNotEmpty(errorInfo)){ + String url = importOssUpload(errorInfo, ChangeWelfareErrorExcel.class); + closeTask(taskId,tokenDto.getUserId(), ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL,url); + }else { + closeTask(taskId,tokenDto.getUserId(),ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS,""); + } + }catch (Exception e){ + log.error(e.getMessage()); + closeTask(taskId,tokenDto.getUserId(),ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL,""); + } + } + + /** + * Desc: 关闭任务 + * @param taskId + * @param userId + * @param status + * @param url + * @author wgf + * @date 2022/11/28 09:05 + */ + public void closeTask(String taskId,String userId,String status,String url){ + ImportTaskCommonFormDTO input = new ImportTaskCommonFormDTO(); + input.setOperatorId(userId); + input.setTaskId(taskId); + input.setProcessStatus(status); + input.setResultDescFilePath(url); + commonServiceOpenFeignClient.finishImportTask(input); + } + + /** + * Desc: 构造错误信息 + * @param dto + * @param info + * @param num + * @author wgf + * @date 2022/11/28 17:17 + */ + public ChangeWelfareErrorExcel getErrorInfo(ChangeWelfareImportExcel dto, String info, Integer num){ + ChangeWelfareErrorExcel result = ConvertUtils.sourceToTarget(dto, ChangeWelfareErrorExcel.class); + result.setErrorMsg(info); + result.setNum(num); + return result; + } + + /** + * Desc: 文件上传并返回url + * @param errorRows + * @param tClass + * @author zxc + * @date 2022/3/30 09:16 + */ + public String importOssUpload(Collection errorRows, Class tClass) throws IOException { + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的数据列表","导入失败的数据列表"), + tClass, errorRows); + + // 文件名 + String resultDescFileName = UUID.randomUUID().toString().concat(".xls"); + + FileItemFactory factory = new DiskFileItemFactory(16, null); + FileItem fileItem = factory.createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), true, resultDescFileName); + OutputStream os = fileItem.getOutputStream(); + Result uploadResult = null; + try { + workbook.write(os); + uploadResult = ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem)); + } catch (Exception e) { + String errormsg = ExceptionUtils.getErrorStackTrace(e); + log.error("上传错误描述文件:{}", errormsg); + } finally { + try { + os.close(); + } catch (IOException e) { + String errormsg = ExceptionUtils.getErrorStackTrace(e); + log.error("上传错误描述文件关闭输出流:{}", errormsg); + } + try { + fileItem.delete(); + } catch (Exception e) { + String errormsg = ExceptionUtils.getErrorStackTrace(e); + log.error("上传错误描述文件删除临时文件:{}", errormsg); + } + } + + if (uploadResult == null || !uploadResult.success()) { + log.error("调用OSS上传结果描述文件失败"); + return null; + } + return uploadResult.getData().getUrl(); + } + } diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/pli_change_welfare.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/pli_change_welfare.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a9aa1b3e6a83b3c49be25d8671c9f11f725b82b9 GIT binary patch literal 11358 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 MxO1FO{h + diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 2383d57e49..ab9c03c402 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -1483,5 +1483,9 @@ AND b.id is null order by a.pids ASC, a.created_time DESC +