From 38effff29b02275af17cfffcabe7f5cf81cba98b Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Fri, 26 Aug 2022 14:13:04 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=B7=A5=E4=BD=9C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E3=80=91=E6=96=B0=E5=A2=9E=EF=BC=9A=E4=B8=8B=E8=BD=BD=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=EF=BC=8C=E5=AF=BC=E5=85=A5excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/security/user/LoginUserUtil.java | 1 + .../epmet/constants/ImportTaskConstants.java | 4 + .../WorkdiaryServiceController.java | 102 ++++++- .../entity/WorkdiaryServiceRecordEntity.java | 4 + .../excel/WorkdiaryServiceRecordExcel.java | 9 + .../WorkdiaryServiceImportListener.java | 54 ++++ .../WorkdiaryServiceRecordService.java | 6 + .../WorkdiaryServiceRecordServiceImpl.java | 267 +++++++++++++++++- .../templates/workdiary_service_import.xlsx | Bin 0 -> 8961 bytes .../com/epmet/dto/form/GridOptionFormDTO.java | 4 + .../dto/result/HouseAgencyInfoResultDTO.java | 1 + .../src/main/resources/mapper/IcHouseDao.xml | 1 + .../resi/IcResiPageNonDynamicFormDTO.java | 25 ++ .../resi/IcResiNonDynamicResultDTO.java | 23 ++ .../epmet/feign/EpmetUserOpenFeignClient.java | 11 + .../EpmetUserOpenFeignClientFallback.java | 7 + .../controller/IcResiUserController.java | 21 ++ .../com/epmet/service/IcResiUserService.java | 2 + .../service/impl/IcResiUserServiceImpl.java | 18 ++ 19 files changed, 544 insertions(+), 16 deletions(-) create mode 100644 epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/listener/WorkdiaryServiceImportListener.java create mode 100644 epmet-module/epmet-heart/epmet-heart-server/src/main/resources/templates/workdiary_service_import.xlsx create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/resi/IcResiPageNonDynamicFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/resi/IcResiNonDynamicResultDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java index ce92400ae0..220ac403a8 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java @@ -2,6 +2,7 @@ package com.epmet.commons.tools.security.user; import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.utils.EpmetRequestHolder; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; 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 2108042cd6..64cceb765a 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 @@ -23,6 +23,10 @@ public interface ImportTaskConstants { String BIZ_TYPE_IC_ENTERPRISE="ic_enterprise"; String IC_POINT_NUCLEIC_MONITORING = "ic_point_nucleic_monitoring"; String IC_POINT_VACCINES_INOCULATION = "ic_point_vaccines_inoculation"; + /** + * 工作日志导入 + */ + String BIZ_TYPE_WORK_DIARY_IMPORT = "work_diary_import"; /** * 核酸检测 */ diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/WorkdiaryServiceController.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/WorkdiaryServiceController.java index 1b73a301a4..31a9b61af6 100755 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/WorkdiaryServiceController.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/WorkdiaryServiceController.java @@ -1,29 +1,52 @@ package com.epmet.controller; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.form.PageFormDTO; 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.utils.EpmetRequestHolder; import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.FileUtils; import com.epmet.commons.tools.utils.Result; 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.UpdateGroup; 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.WorkdiaryServiceTypeDTO; import com.epmet.dto.form.workdiaryservice.WorkdiaryServiceQueryFormDTO; +import com.epmet.dto.result.ImportTaskCommonResultDTO; import com.epmet.dto.result.WorkdiaryServiceRecordDTO; import com.epmet.entity.WorkdiaryServiceTypeExcel; import com.epmet.service.WorkdiaryServiceRecordService; import com.epmet.service.WorkdiaryServiceTypeService; +import com.epmet.utils.ImportTaskUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.constraints.NotNull; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; /** @@ -32,9 +55,10 @@ import java.util.Map; * @author generator generator@elink-cn.com * @since v1.0.0 2022-08-23 */ +@Slf4j @RestController @RequestMapping("workdiaryService") -public class WorkdiaryServiceController { +public class WorkdiaryServiceController implements ResultDataResolver { @Autowired private WorkdiaryServiceRecordService workdiaryServiceRecordService; @@ -42,6 +66,9 @@ public class WorkdiaryServiceController { @Autowired private WorkdiaryServiceTypeService workdiaryServiceTypeService; + @Autowired + private ExecutorService executorService; + /** * 记录-分页 * @return @@ -127,6 +154,75 @@ public class WorkdiaryServiceController { workdiaryServiceRecordService.export(gridId, serviceType, applicantName, applicantAddress, serviceContent, applicantMobile, response); } + /** + * 下载模板 + * @return + */ + @RequestMapping("downloadTemplate") + public void downloadTemplate(HttpServletResponse response) throws UnsupportedEncodingException { + response.setCharacterEncoding("UTF-8"); + response.addHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "Content-Disposition"); + response.setHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("工作日志导入模板", "UTF-8") + ".xlsx"); + + try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("templates/workdiary_service_import.xlsx"); + ServletOutputStream os = response.getOutputStream()) { + IOUtils.copy(is, os); + } catch (IOException e) { + log.error("【工作日志】下载模板-IO错误:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } + + /** + * 记录导入 + * @param file + */ + @PostMapping("/record/import") + public Result recordImport(MultipartFile file) { + + if (file == null) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, "请选择文件"); + } + + // 格式校验 + // 只接受如下两种格式后缀 + String originFileName = file.getOriginalFilename(); + String suffix = originFileName.substring(originFileName.lastIndexOf(".")); + if (StringUtils.isBlank(suffix) || (!".xlsx".equals(suffix) && !".xls".equals(suffix))) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, "只支持.xls和.xlsx两种格式"); + } + + // 创建保存目录 + Path fileSavePath = null; + try { + Path saveDir = FileUtils.getAndCreateDirUnderEpmetFilesDir("workdiary", "import", EpmetRequestHolder.getLoginUserId()); + fileSavePath = saveDir.resolve(System.currentTimeMillis() + suffix); + } catch (IOException e) { + e.printStackTrace(); + } + + // 将文件保存到本地 + try (FileOutputStream fos = new FileOutputStream(fileSavePath.toString()); + InputStream is = file.getInputStream()) { + IOUtils.copy(is, fos); + } catch (Exception e) { + log.error("【书记日志】上传-保存文件到本地失败:{}", ExceptionUtils.getErrorStackTrace(e)); + throw new EpmetException(EpmetErrorCode.SERVER_ERROR.getCode()); + } + + // 创建导入记录 + ImportTaskCommonResultDTO itResult = getResultDataOrThrowsException(ImportTaskUtils.createImportTask(originFileName, ImportTaskConstants.BIZ_TYPE_WORK_DIARY_IMPORT), + ServiceConstant.EPMET_COMMON_SERVICE, EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "有导入操作正在进行", "有导入操作正在进行"); + + // 执行异步导入 + Path finalFileSavePath = fileSavePath; + CompletableFuture.runAsync(() -> { + workdiaryServiceRecordService.createImportTaskAndExecuteImport(finalFileSavePath, originFileName, itResult.getTaskId()); + }, executorService); + + return new Result(); + } + /** * 服务类型-分页 * @return diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/entity/WorkdiaryServiceRecordEntity.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/entity/WorkdiaryServiceRecordEntity.java index 4b74496fd6..16db6c8bc5 100755 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/entity/WorkdiaryServiceRecordEntity.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/entity/WorkdiaryServiceRecordEntity.java @@ -3,8 +3,10 @@ package com.epmet.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import java.util.Date; @@ -17,6 +19,8 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper=false) @TableName("workdiary_service_record") +@NoArgsConstructor +@AllArgsConstructor public class WorkdiaryServiceRecordEntity extends BaseEpmetEntity { private static final long serialVersionUID = 1L; diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/WorkdiaryServiceRecordExcel.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/WorkdiaryServiceRecordExcel.java index 7da0010c82..631c3ed943 100755 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/WorkdiaryServiceRecordExcel.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/WorkdiaryServiceRecordExcel.java @@ -4,6 +4,9 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.epmet.dto.result.WorkdiaryServiceRecordDTO; import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; /** * 工作日志(服务)-记录 excel @@ -12,16 +15,20 @@ import lombok.Data; * @since v1.0.0 2022-08-23 */ @Data +@NoArgsConstructor public class WorkdiaryServiceRecordExcel { + @NotBlank(message = "所属网格必填") @ColumnWidth(25) @ExcelProperty(value = "所属网格") private String gridName; + @NotBlank(message = "服务类型必填") @ColumnWidth(15) @ExcelProperty(value = "服务类型") private String serviceTypeName; + @NotBlank(message = "申请人必填") @ColumnWidth(10) @ExcelProperty(value = "申请人") private String applicantName; @@ -30,6 +37,7 @@ public class WorkdiaryServiceRecordExcel { @ExcelProperty(value = "住址") private String applicantAddress; + @NotBlank(message = "服务内容必填") @ColumnWidth(25) @ExcelProperty(value = "服务内容") private String serviceContent; @@ -42,6 +50,7 @@ public class WorkdiaryServiceRecordExcel { @ExcelProperty(value = "负责人") private String principal; + @NotBlank(message = "服务时间必填") @ColumnWidth(10) @ExcelProperty(value = "服务时间") private String serviceTime; diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/listener/WorkdiaryServiceImportListener.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/listener/WorkdiaryServiceImportListener.java new file mode 100644 index 0000000000..bc09d401d0 --- /dev/null +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/excel/listener/WorkdiaryServiceImportListener.java @@ -0,0 +1,54 @@ +package com.epmet.excel.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.excel.WorkdiaryServiceRecordExcel; +import com.epmet.service.WorkdiaryServiceRecordService; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +/** + * 工作日志-导入-监听器 + */ +@Slf4j +public class WorkdiaryServiceImportListener implements ReadListener { + + /** + * 200 一批执行导入 + */ + public static final Integer BATCH_SIZE = 2; + + /** + * 数据列表 + */ + private List datas = new ArrayList<>(); + + private WorkdiaryServiceRecordService workdiaryServiceRecordService; + + public WorkdiaryServiceImportListener(WorkdiaryServiceRecordService workdiaryServiceRecordService) { + this.workdiaryServiceRecordService = workdiaryServiceRecordService; + } + + @Override + public void invoke(WorkdiaryServiceRecordExcel data, AnalysisContext context) { + datas.add(data); + if (datas.size() >= BATCH_SIZE) { + // 达到批量阈值,执行一次导入 + try { + workdiaryServiceRecordService.executeBatchImport(datas); + } catch (Exception e) { + log.error("【工作日志】导入-发生未知错误:{}", ExceptionUtils.getErrorStackTrace(e)); + } finally { + datas.clear(); + } + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + workdiaryServiceRecordService.executeBatchImport(datas); + } +} diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/WorkdiaryServiceRecordService.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/WorkdiaryServiceRecordService.java index e6ed7578f4..4dfc2f3cb5 100755 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/WorkdiaryServiceRecordService.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/WorkdiaryServiceRecordService.java @@ -5,8 +5,10 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.dto.form.workdiaryservice.WorkdiaryServiceQueryFormDTO; import com.epmet.dto.result.WorkdiaryServiceRecordDTO; import com.epmet.entity.WorkdiaryServiceRecordEntity; +import com.epmet.excel.WorkdiaryServiceRecordExcel; import javax.servlet.http.HttpServletResponse; +import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -85,4 +87,8 @@ public interface WorkdiaryServiceRecordService extends BaseService datas); } \ No newline at end of file diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkdiaryServiceRecordServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkdiaryServiceRecordServiceImpl.java index 64505ae54a..ea0966c7a0 100755 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkdiaryServiceRecordServiceImpl.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkdiaryServiceRecordServiceImpl.java @@ -1,7 +1,11 @@ package com.epmet.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.write.metadata.WriteSheet; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -9,41 +13,61 @@ 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.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; 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.exception.ValidateException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.common.CustomerOrgRedis; -import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.EpmetRequestHolder; -import com.epmet.commons.tools.utils.ExcelUtils; -import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.commons.tools.security.user.LoginUserUtil; +import com.epmet.commons.tools.utils.*; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dao.WorkdiaryServiceRecordDao; import com.epmet.dao.WorkdiaryServiceTypeDao; -import com.epmet.dto.IcResiUserDTO; -import com.epmet.dto.WorkdiaryServiceTypeDTO; -import com.epmet.dto.result.WorkdiaryServiceRecordDTO; +import com.epmet.dto.*; +import com.epmet.dto.form.GridOptionFormDTO; +import com.epmet.dto.form.LoginUserDetailsFormDTO; +import com.epmet.dto.form.resi.IcResiPageNonDynamicFormDTO; +import com.epmet.dto.result.*; +import com.epmet.dto.result.resi.IcResiNonDynamicResultDTO; import com.epmet.entity.WorkdiaryServiceRecordEntity; import com.epmet.excel.WorkdiaryServiceRecordExcel; +import com.epmet.excel.listener.WorkdiaryServiceImportListener; import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.feign.OssFeignClient; import com.epmet.redis.WorkdiaryServiceRecordRedis; import com.epmet.service.WorkdiaryServiceRecordService; import com.epmet.service.WorkdiaryServiceTypeService; +import com.epmet.utils.ImportTaskUtils; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; 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.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -64,6 +88,34 @@ public class WorkdiaryServiceRecordServiceImpl extends BaseServiceImpl> importResultDescTl = new ThreadLocal<>(); + + /** + * 导入结果描述 + */ + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ImportResultDesc { + @ColumnWidth(20) + @ExcelProperty(value = "申请人") + private String applicantName; + + @ColumnWidth(30) + @ExcelProperty(value = "服务内容") + private String serviceContent; + + @ColumnWidth(30) + @ExcelProperty(value = "描述") + private String desc; + } + @Override public PageData page(Map params) { IPage page = baseDao.selectPage( @@ -77,14 +129,18 @@ public class WorkdiaryServiceRecordServiceImpl extends BaseServiceImpl page(String gridId, Short serviceType, String applicantName, String applicantAddress, String serviceContent, String applicantMobile, Integer pageNo, Integer pageSize) { + LoginUserDetailsResultDTO currentStaff = getResultDataOrThrowsException(userOpenFeignClient.getLoginUserDetails(new LoginUserDetailsFormDTO( + EpmetRequestHolder.getLoginUserApp(), EpmetRequestHolder.getLoginUserClient(), EpmetRequestHolder.getLoginUserId() + )), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "查询工作人员信息失败", "查询工作人员信息失败"); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(StringUtils.isNotBlank(gridId), WorkdiaryServiceRecordEntity::getGridId, gridId); query.eq(serviceType != null, WorkdiaryServiceRecordEntity::getServiceType, serviceType); - query.eq(WorkdiaryServiceRecordEntity::getCreatedBy, EpmetRequestHolder.getLoginUserId()); query.like(StringUtils.isNotBlank(applicantName), WorkdiaryServiceRecordEntity::getApplicantName, applicantName); query.like(StringUtils.isNotBlank(applicantAddress), WorkdiaryServiceRecordEntity::getApplicantAddress, applicantAddress); query.like(StringUtils.isNotBlank(serviceContent), WorkdiaryServiceRecordEntity::getServiceContent, serviceContent); query.like(StringUtils.isNotBlank(applicantMobile), WorkdiaryServiceRecordEntity::getApplicantMobile, applicantMobile); + query.likeRight(WorkdiaryServiceRecordEntity::getOrgIdPath, currentStaff.getOrgIdPath()); // 查找类型列表 List stList = SpringContextUtils.getBean(WorkdiaryServiceTypeService.class).list(null, 1, 100); @@ -246,4 +302,189 @@ public class WorkdiaryServiceRecordServiceImpl extends BaseServiceImpl()); + WorkdiaryServiceImportListener listener = new WorkdiaryServiceImportListener(this); + EasyExcel.read(fileSavePath.toFile(), WorkdiaryServiceRecordExcel.class,listener).headRowNumber(1).sheet(0).doRead(); + } catch (Exception e) { + logger.error("【工作日志】-导入-未知错误:{}", ExceptionUtils.getErrorStackTrace(e)); + } finally { + // 清理临时文件 + try { + Files.deleteIfExists(fileSavePath); + } catch (IOException e) { + logger.error("【书记日志】-导入-删除导入临时文件失败,staffId:{}, 文件名称:{}, 错误信息:{}", + EpmetRequestHolder.getLoginUserId(), fileSavePath.toString(), ExceptionUtils.getErrorStackTrace(e)); + } + + // 上传错误描述文件 + try { + resultDescFileUtl = buildAndUploadResultDescFile(importResultDescTl.get()); + } catch (IOException e) { + logger.error("【工作日志】导入-生成和上传错误描述文件失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + + // 清理错误结果描述缓存 + importResultDescTl.remove(); + } + + + + // 修改导入记录状态为已完成 + ImportTaskUtils.finishImportTask(taskId, ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS, resultDescFileUtl, ""); + } + + /** + * 生成和上传错误描述文件 + * @return + */ + private String buildAndUploadResultDescFile(List descs) throws IOException { + if(CollectionUtils.isEmpty(descs)) { + return null; + } + //Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的数据列表","导入失败的数据列表"), + // ImportResultDesc.class, descs); + + String fileName = System.currentTimeMillis() + "_" + EpmetRequestHolder.getLoginUserId() + ".xlsx"; + + FileItem fileItem = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, FileUtils.getAndCreateDirUnderEpmetFilesDir("workdiary", "result_desc").toFile()) + .createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName); + + // 为了自动关闭流 + try (OutputStream os = fileItem.getOutputStream()) { + EasyExcel.write(os, ImportResultDesc.class).sheet("失败列表").doWrite(descs); + } + + UploadImgResultDTO result = getResultDataOrThrowsException(ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem)), + ServiceConstant.EPMET_OSS_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "上传结果描述文件失败", "上传结果描述文件失败"); + + if (!fileItem.isInMemory()) { + fileItem.delete(); + } + return result.getUrl(); + } + + /** + * 执行批量插入 + * @param datas + */ + @Override + public void executeBatchImport(List datas) { + if (CollectionUtils.isEmpty(datas)) { + return; + } + + // 当前登录人 + LoginUserDetailsResultDTO currentStaff = getResultDataOrThrowsException(userOpenFeignClient.getLoginUserDetails( + new LoginUserDetailsFormDTO(EpmetRequestHolder.getLoginUserApp(), EpmetRequestHolder.getLoginUserClient(), EpmetRequestHolder.getLoginUserId())), + ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【工作日志】-导入-没有找到当前登录人信息", "【工作日志】-导入-没有找到当前登录人信息"); + + // 服务类型字典。key:养老 value:object + List serviceTypes = SpringContextUtils.getBean(WorkdiaryServiceTypeService.class).page(null, 1, 100).getList(); + Map serviceTypeMap = serviceTypes.stream().collect(Collectors.toMap(WorkdiaryServiceTypeDTO::getServiceTypeName, Function.identity())); + + ArrayList diaryRecordList = new ArrayList<>(); + + // 循环校验和填充数据 + for (WorkdiaryServiceRecordExcel row : datas) { + + String gridName = row.getGridName(); + String serviceTypeName = row.getServiceTypeName(); + String applicantName = row.getApplicantName(); + + try { + // 校验必填 + ValidatorUtils.validateEntity(row); + + // 检查服务类型 + WorkdiaryServiceTypeDTO serviceType = serviceTypeMap.get(serviceTypeName); + if (serviceType == null || serviceType.getEnabled().shortValue() == 0) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "所选服务类型不存在或已禁用", "所选服务类型不存在或已禁用"); + } + + // 检查网格 + OptionResultDTO grid = findGrid(currentStaff.getAgencyId(), gridName); + if (grid == null) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "网格不存在,或不在您所属的组织下", "网格不存在,或不在您所属的组织下"); + } + + // 查找居民 + IcResiNonDynamicResultDTO resi = findResi(grid.getValue(), row.getApplicantName(), row.getApplicantMobile()); + + if (StringUtils.isBlank(row.getApplicantMobile())) { + row.setApplicantMobile(resi.getMobile()); + } + + // 没填写住址的,到系统查询 + if (StringUtils.isBlank(row.getApplicantAddress())) { + + HouseAgencyInfoResultDTO house = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseAgencyInfo(resi.getHomeId()), + ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "查询房屋失败", "查询房屋失败"); + + if (house == null) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "居民住址未找到", "居民未找到"); + } + + row.setApplicantAddress(house.getFullName()); + } + // 填充到entity + WorkdiaryServiceRecordEntity record = new WorkdiaryServiceRecordEntity(EpmetRequestHolder.getLoginUserCustomerId(), serviceType.getServiceType(), currentStaff.getAgencyId(), + grid.getValue(), currentStaff.getOrgIdPath().concat(":").concat(grid.getValue()), resi.getId(), row.getApplicantName(), + row.getApplicantAddress(), row.getApplicantMobile(), row.getServiceContent(), row.getServiceTime(), row.getPrincipal(), row.getRemark()); + + diaryRecordList.add(record); + } catch (ValidateException ve) { + importResultDescTl.get().add(new ImportResultDesc(applicantName, row.getServiceContent(), ve.getMsg())); + } catch (EpmetException ee) { + importResultDescTl.get().add(new ImportResultDesc(applicantName, row.getServiceContent(), ee.getMsg())); + } catch (Throwable t) { + logger.error(ExceptionUtils.getThrowableErrorStackTrace(t)); + importResultDescTl.get().add(new ImportResultDesc(applicantName, row.getServiceContent(), "未知错误")); + } + } + + // 批量持久化 + insertBatch(diaryRecordList, 50); + } + + private IcResiNonDynamicResultDTO findResi(String gridId, String applicantName, String mobile) { + PageData page = getResultDataOrThrowsException(userOpenFeignClient.listResiNonDynamic(new IcResiPageNonDynamicFormDTO(gridId, applicantName, mobile, false)), + ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "居民未找到", "居民未找到"); + + List list = page.getList(); + + if (page == null || CollectionUtils.isEmpty(page.getList())) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "居民未找到", "居民未找到"); + } + + return list.get(0); + } + + /** + * 从组织下查找指定的网格名称,得到网格数据 + * @param agencyId + * @param gridName + * @return + */ + private OptionResultDTO findGrid(String agencyId, String gridName) { + List gridOptions = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(new GridOptionFormDTO(agencyId, "saveOrUpdate")), + ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【工作日志】-导入-网格查询失败", "【工作日志】-导入-网格查询失败"); + + for (OptionResultDTO grid : gridOptions) { + if (gridName.equals(grid.getLabel())) { + return grid; + } + } + + return null; + } +} diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/templates/workdiary_service_import.xlsx b/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/templates/workdiary_service_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..06bf284e8b4126ca92f7360d17ab57001bbc1e49 GIT binary patch literal 8961 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 C3}CVV literal 0 HcmV?d00001 diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java index e6fae52bc9..434af5aed4 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java @@ -1,6 +1,8 @@ package com.epmet.dto.form; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; import java.io.Serializable; @@ -11,6 +13,8 @@ import java.io.Serializable; * @Date 2021/11/12 10:54 上午 */ @Data +@NoArgsConstructor +@AllArgsConstructor public class GridOptionFormDTO implements Serializable { /** * 部门Id diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseAgencyInfoResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseAgencyInfoResultDTO.java index d5734e2791..eff5a441d8 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseAgencyInfoResultDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseAgencyInfoResultDTO.java @@ -21,6 +21,7 @@ public class HouseAgencyInfoResultDTO implements Serializable { private String neighborHoodId; private String buildingId; private String buildingUnitId; + private String fullName; public HouseAgencyInfoResultDTO() { this.agencyId = ""; diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index 8b900c90dd..6098775330 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -393,6 +393,7 @@ h.BUILDING_UNIT_ID, nh.AGENCY_ID, nh.GRID_ID, + h.FULL_NAME, nh.AGENCY_PIDS AS pids FROM ic_house h INNER JOIN ic_neighbor_hood nh ON (nh.ID = h.NEIGHBOR_HOOD_ID AND nh.DEL_FLAG = '0') diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/resi/IcResiPageNonDynamicFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/resi/IcResiPageNonDynamicFormDTO.java new file mode 100644 index 0000000000..e5453cda85 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/resi/IcResiPageNonDynamicFormDTO.java @@ -0,0 +1,25 @@ +package com.epmet.dto.form.resi; + +import com.epmet.commons.tools.dto.form.PageFormDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IcResiPageNonDynamicFormDTO extends PageFormDTO { + + private String gridId; + + private String name; + + private String mobile; + + /** + * 是否模糊。true:模糊,false:精确 + */ + private Boolean fuzzy = false; + +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/resi/IcResiNonDynamicResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/resi/IcResiNonDynamicResultDTO.java new file mode 100644 index 0000000000..52da33987e --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/resi/IcResiNonDynamicResultDTO.java @@ -0,0 +1,23 @@ +package com.epmet.dto.result.resi; + +import lombok.Data; + +/** + * 居民基础信息V2 + */ +@Data +public class IcResiNonDynamicResultDTO { + private String id; + private String name; + private String customerId; + private String agencyId; + private String gridId; + private String villageId; + private String buildId; + private String unitId; + private String homeId; + private String mobile; + private String idCard; + private String gender; + private String idCardType; +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index e37454ed35..47a67e5fbd 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -3,12 +3,15 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.result.OptionDataResultDTO; +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.*; import com.epmet.dto.form.*; import com.epmet.dto.form.patrol.PatrolQueryFormDTO; +import com.epmet.dto.form.resi.IcResiPageNonDynamicFormDTO; import com.epmet.dto.result.*; +import com.epmet.dto.result.resi.IcResiNonDynamicResultDTO; import com.epmet.feign.fallback.EpmetUserOpenFeignClientFallbackFactory; import com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO; import org.springframework.cloud.openfeign.FeignClient; @@ -871,4 +874,12 @@ public interface EpmetUserOpenFeignClient { @PostMapping("/epmetuser/customerstaff/customerstaff") Result> customerStaff(@RequestBody GridStaffUploadtFormDTO formDTO); + + /** + * 居民列表,非动态 + * @param input + * @return + */ + @PostMapping("/epmetuser/icresiuser/nonDynamic/listResi") + Result> listResiNonDynamic(@RequestBody IcResiPageNonDynamicFormDTO input); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index 71711e66a8..7c9cc3b2a4 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -2,13 +2,16 @@ package com.epmet.feign.fallback; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.result.OptionDataResultDTO; +import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.form.patrol.PatrolQueryFormDTO; +import com.epmet.dto.form.resi.IcResiPageNonDynamicFormDTO; import com.epmet.dto.result.*; +import com.epmet.dto.result.resi.IcResiNonDynamicResultDTO; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO; import org.springframework.web.bind.annotation.RequestBody; @@ -671,4 +674,8 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "customerStaff", formDTO); } + @Override + public Result> listResiNonDynamic(IcResiPageNonDynamicFormDTO input) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "listResiNonDynamic", input); + } } 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 7604ebc5c7..9b0fe3324c 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 @@ -55,8 +55,10 @@ import com.epmet.constant.SystemMessageType; import com.epmet.constants.ImportTaskConstants; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; +import com.epmet.dto.form.resi.IcResiPageNonDynamicFormDTO; import com.epmet.dto.result.*; import com.epmet.dto.result.demand.OptionDTO; +import com.epmet.dto.result.resi.IcResiNonDynamicResultDTO; import com.epmet.enums.IcResiUserTableEnum; import com.epmet.excel.PartyMemberAgeExportExcel; import com.epmet.excel.PartyMemberEducationExportExcel; @@ -1371,4 +1373,23 @@ public class IcResiUserController implements ResultDataResolver { return new Result().ok(icResiUserService.icUserMatchGrid(formDTO)); } + /** + * 居民列表分页查询 非动态 + * @param input + * @return + */ + @PostMapping("/nonDynamic/listResi") + public Result> listResiNonDynamic(@RequestBody IcResiPageNonDynamicFormDTO input) { + + String gridId = input.getGridId(); + String name = input.getName(); + Integer pageNo = input.getPageNo(); + Integer pageSize = input.getPageSize(); + Boolean fuzzy = input.getFuzzy(); + String mobile = input.getMobile(); + + PageData page = icResiUserService.listResiNonDynamic(fuzzy, gridId, name, mobile, pageNo, pageSize); + return new Result>().ok(page); + } + } 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 37cf258e14..8975e06443 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 @@ -26,6 +26,7 @@ import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.dto.result.demand.OptionDTO; +import com.epmet.dto.result.resi.IcResiNonDynamicResultDTO; import com.epmet.entity.IcResiUserEntity; import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO; @@ -505,4 +506,5 @@ public interface IcResiUserService extends BaseService { */ IcUserMatchGridResultDTO icUserMatchGrid(IcUserMatchGridFormDTO formDTO); + PageData listResiNonDynamic(Boolean fuzzy, String gridId, String name, String mobile, Integer pageNo, Integer pageSize); } 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 d8f57e4e81..ce30430738 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 @@ -63,6 +63,7 @@ import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.dto.result.*; import com.epmet.dto.result.demand.IcResiDemandDictDTO; import com.epmet.dto.result.demand.OptionDTO; +import com.epmet.dto.result.resi.IcResiNonDynamicResultDTO; import com.epmet.entity.*; import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.feign.*; @@ -3312,4 +3313,21 @@ public class IcResiUserServiceImpl extends BaseServiceImpl" + customer); return customer; } + + @Override + public PageData listResiNonDynamic(Boolean fuzzy, String gridId, String name, String mobile, Integer pageNo, Integer pageSize) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(IcResiUserEntity::getCustomerId, EpmetRequestHolder.getLoginUserCustomerId()); + query.eq(StringUtils.isNotBlank(gridId), IcResiUserEntity::getGridId, gridId); + // 一个模糊一个精确 + query.eq((!fuzzy && StringUtils.isNotBlank(name)), IcResiUserEntity::getName, name); + query.like((fuzzy && StringUtils.isNotBlank(name)), IcResiUserEntity::getName, name); + + query.eq((!fuzzy && StringUtils.isNotBlank(mobile)), IcResiUserEntity::getMobile, mobile); + query.like((fuzzy && StringUtils.isNotBlank(mobile)), IcResiUserEntity::getMobile, mobile); + + PageHelper.startPage(pageNo, pageSize); + List list = baseDao.selectList(query).stream().map((e) -> ConvertUtils.sourceToTarget(e, IcResiNonDynamicResultDTO.class)).collect(Collectors.toList()); + return new PageData(list, new PageInfo<>(list).getTotal(), pageSize); + } }