diff --git a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/controller/v2/PersonTestingV2Controller.java b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/controller/v2/PersonTestingV2Controller.java index 718b224..4b68441 100644 --- a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/controller/v2/PersonTestingV2Controller.java +++ b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/controller/v2/PersonTestingV2Controller.java @@ -31,12 +31,17 @@ import com.elink.esua.epdc.dto.PersonTestingDTO; import com.elink.esua.epdc.dto.PersonTestingPageDTO; import com.elink.esua.epdc.modules.epidemic.dao.PersonTestingDao; import com.elink.esua.epdc.modules.epidemic.excel.PersonTestingExcel; +import com.elink.esua.epdc.modules.epidemic.excel.PersonTestingImportMoudleExcel; import com.elink.esua.epdc.modules.epidemic.service.PersonTestingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; @@ -123,5 +128,33 @@ public class PersonTestingV2Controller { return personTestingService.getMobileByIdCard(dto); } + /** + * 导出模板 + * @param + * @return void + * @Author zhangyong + * @Date 11:21 2021-11-06 + **/ + @GetMapping("exportMoudle") + public void exportMoudle(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = new ArrayList<>(); + PersonTestingPageDTO dto = new PersonTestingPageDTO(); + dto.setCreatedBy(" "); + list.add(dto); + personTestingService.exportExcelToTarget(response, "核酸检测模板", list, PersonTestingImportMoudleExcel.class); + } -} \ No newline at end of file + /** + * 信息导入 + * + * @param request + * @param file + * @return com.elink.esua.epdc.commons.tools.utils.Result + * @Author zhangyong + * @Date 17:25 2021-11-02 + **/ + @PostMapping("importExcel") + public Result importExcel(HttpServletRequest request, @RequestParam("file") MultipartFile file) { + return personTestingService.importExcel(file); + } +} diff --git a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/dao/PersonTestingDao.java b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/dao/PersonTestingDao.java index aba767b..dd201b5 100644 --- a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/dao/PersonTestingDao.java +++ b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/dao/PersonTestingDao.java @@ -56,4 +56,14 @@ public interface PersonTestingDao extends BaseDao { **/ PersonTestingDTO getDetailPersonTesting(@Param("id") String id); + /** + * 根据身份证或姓名查询 检测详情 + * + * @param idcard + * @param realName + * @return java.util.List + * @Author zhangyong + * @Date 15:38 2021-11-04 + **/ + List getDetailByIdCardOrName(@Param("idcard") String idcard, @Param("realName") String realName); } diff --git a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/excel/PersonTestingImportMoudleExcel.java b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/excel/PersonTestingImportMoudleExcel.java new file mode 100644 index 0000000..d5f253e --- /dev/null +++ b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/excel/PersonTestingImportMoudleExcel.java @@ -0,0 +1,51 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.elink.esua.epdc.modules.epidemic.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 核酸检测记录 模板导出 + * 导入信息:姓名(必填)、身份证号(必填)、手机号、核酸检测时间(必填)、住址 + * + * @author qu qu@elink-cn.com + * @since v1.0.0 2021-08-20 + */ +@Data +public class PersonTestingImportMoudleExcel { + + @Excel(name = "姓名") + private String name; + + @Excel(name = "身份证号码") + private String idcard; + + @Excel(name = "手机号") + private String mobile; + + @Excel(name = "住址") + private String address; + + @Excel(name = "核酸检测时间(yyyy-MM-dd HH:mm:ss)") + private String testingTimeStr; + + private Date testingTime; +} diff --git a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/PersonTestingService.java b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/PersonTestingService.java index a7d366a..f08912f 100644 --- a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/PersonTestingService.java +++ b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/PersonTestingService.java @@ -23,8 +23,12 @@ import com.elink.esua.epdc.commons.tools.utils.Result; import com.elink.esua.epdc.dto.PersonTestingDTO; import com.elink.esua.epdc.dto.PersonTestingPageDTO; import com.elink.esua.epdc.modules.epidemic.entity.PersonTestingEntity; +import com.elink.esua.epdc.modules.epidemic.excel.PersonTestingImportMoudleExcel; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.text.ParseException; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -122,4 +126,23 @@ public interface PersonTestingService extends BaseService { * @return com.elink.esua.epdc.commons.tools.utils.Result */ Result getMobileByIdCard(PersonTestingDTO dto); -} \ No newline at end of file + + /** + * excel 模板导出 + * + * @return void + * @Author zhangyong + * @Date 17:16 2021-11-02 + **/ + void exportExcelToTarget(HttpServletResponse response, String fileName, Collection sourceList, Class targetClass) throws Exception; + + /** + * 信息导入 + * + * @param file + * @return com.elink.esua.epdc.commons.tools.utils.Result + * @Author zhangyong + * @Date 17:25 2021-11-02 + **/ + Result importExcel(MultipartFile file); +} diff --git a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/impl/PersonTestingServiceImpl.java b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/impl/PersonTestingServiceImpl.java index 6b3da47..100781d 100644 --- a/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/impl/PersonTestingServiceImpl.java +++ b/epdc-cloud-custom/src/main/java/com/elink/esua/epdc/modules/epidemic/service/impl/PersonTestingServiceImpl.java @@ -17,6 +17,10 @@ package com.elink.esua.epdc.modules.epidemic.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.ImportParams; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.elink.esua.epdc.commons.mybatis.service.impl.BaseServiceImpl; @@ -27,14 +31,14 @@ import com.elink.esua.epdc.commons.tools.exception.RenException; import com.elink.esua.epdc.commons.tools.page.PageData; import com.elink.esua.epdc.commons.tools.security.user.SecurityUser; import com.elink.esua.epdc.commons.tools.security.user.UserDetail; -import com.elink.esua.epdc.commons.tools.utils.ConvertUtils; -import com.elink.esua.epdc.commons.tools.utils.IdentityNoUtils; -import com.elink.esua.epdc.commons.tools.utils.Result; +import com.elink.esua.epdc.commons.tools.utils.*; import com.elink.esua.epdc.dto.PersonTestingDTO; import com.elink.esua.epdc.dto.PersonTestingPageDTO; import com.elink.esua.epdc.dto.UploadFormDTO; +import com.elink.esua.epdc.dto.epdc.result.EpdcPartyErroyResultDTO; import com.elink.esua.epdc.modules.epidemic.dao.PersonTestingDao; import com.elink.esua.epdc.modules.epidemic.entity.PersonTestingEntity; +import com.elink.esua.epdc.modules.epidemic.excel.PersonTestingImportMoudleExcel; import com.elink.esua.epdc.modules.epidemic.feign.OssFeignClient; import com.elink.esua.epdc.modules.epidemic.redis.PersonTestingRedis; import com.elink.esua.epdc.modules.epidemic.service.PersonTestingService; @@ -43,10 +47,19 @@ import com.elink.esua.epdc.vaccine.epidemic.entity.EpidemicUserInfoEntity; import com.elink.esua.epdc.vaccine.house.dao.PopulationInformationDao; import com.elink.esua.epdc.vaccine.house.entity.PopulationInformationEntity; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -385,5 +398,148 @@ public class PersonTestingServiceImpl extends BaseServiceImpl sourceList, + Class targetClass) throws Exception { + List targetList = new ArrayList<>(sourceList.size()); + for (Object source : sourceList) { + Object target = targetClass.newInstance(); + BeanUtils.copyProperties(source, target); + targetList.add(target); + } + + ExportParams exportParams = new ExportParams(); + exportParams.setSheetName(fileName); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, targetClass, targetList); + + Sheet sheet1 = packageSheet(workbook); + + try { + response.setCharacterEncoding("UTF-8"); + response.setHeader("content-Type", "application/vnd.ms-excel"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls"); + ServletOutputStream out = response.getOutputStream(); + workbook.write(out); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 设置Sheet页 格式及数据 + * + * @param workbook + * @return org.apache.poi.ss.usermodel.Sheet + * @Author zhangyong + * @Date 14:53 2021-05-12 + **/ + public Sheet packageSheet(Workbook workbook) { + Sheet sheet = workbook.getSheetAt(NumConstant.ZERO); + sheet.setDefaultColumnWidth(1220 * 1256); + sheet.setDefaultRowHeight((short)(2 * 256)); + + CellStyle style = workbook.createCellStyle(); + DataFormat excelFormat = workbook.createDataFormat(); + // 设置居中 + style.setAlignment(HorizontalAlignment.CENTER); + //自动换行 + style.setWrapText(true); + //文本格式 + style.setDataFormat(excelFormat.getFormat("@")); + sheet.setDefaultColumnStyle(NumConstant.ZERO, style); + sheet.setDefaultColumnStyle(NumConstant.ONE, style); + sheet.setDefaultColumnStyle(NumConstant.TWO, style); + sheet.setDefaultColumnStyle(NumConstant.THREE, style); + sheet.setDefaultColumnStyle(NumConstant.FOUR, style); + return sheet; + } + + @Override + public Result importExcel(MultipartFile file) { + File f = StreamUtils.conversionFile(file); + ImportParams importParams = new ImportParams(); + + List excelList = ExcelImportUtil.importExcel(f, PersonTestingImportMoudleExcel.class, importParams); + // 校验数据 + List erroys = this.checkExcel(excelList); + if (erroys.size() > NumConstant.ZERO) { + return new Result().ok(erroys); + } + saveList(excelList); + + return new Result(); + } + /** + * 组装异常信息 + * + * @param errorline 异常列 + * @param errorDescribe 异常描述 + * @return com.elink.esua.epdc.dto.epdc.result.EpdcPartyErroyResultDTO + * @Author zhangyong + * @Date 15:40 2021-11-04 + **/ + private EpdcPartyErroyResultDTO packageErrorInfo(int errorline, String errorDescribe) { + EpdcPartyErroyResultDTO errorLineinfoDto = new EpdcPartyErroyResultDTO(); + errorLineinfoDto.setErroLine((errorline + NumConstant.TWO) + ""); + errorLineinfoDto.setErrorInfo(errorDescribe); + return errorLineinfoDto; + } + + private List checkExcel(List excelList) { + // 不匹配信息 + List errorLineinfoList = new ArrayList<>(); + + for (int i = 0; i < excelList.size(); i++) { + PersonTestingImportMoudleExcel data = excelList.get(i); + + if (StringUtils.isBlank(data.getName())) { + errorLineinfoList.add(packageErrorInfo(i, "姓名为空")); + } else { + data.setName(data.getName().trim()); + } + if (StringUtils.isBlank(data.getIdcard())) { + errorLineinfoList.add(packageErrorInfo(i, "身份证号为空")); + } else { + data.setIdcard(data.getIdcard().trim()); + // 是否存在 + List details = baseDao.getDetailByIdCardOrName(data.getIdcard(), null); + if (NumConstant.ZERO < details.size()) { + errorLineinfoList.add(packageErrorInfo(i, "身份证号已存在")); + } + } + if (StringUtils.isBlank(data.getTestingTimeStr())) { + errorLineinfoList.add(packageErrorInfo(i, "核酸检测时间为空")); + } else { + if (DateUtils.DATE_TIME_PATTERN.length() != data.getTestingTimeStr().length()) { + errorLineinfoList.add(packageErrorInfo(i, "核酸检测时间格式不匹配")); + } else { + data.setTestingTime(DateUtils.stringToDate(data.getTestingTimeStr(), DateUtils.DATE_TIME_PATTERN)); + } + } + } + return errorLineinfoList; + } + + public void saveList(List excelList) { + List entitys = new ArrayList<>(); + List dtos = ConvertUtils.sourceToTarget(excelList, PersonTestingDTO.class); + + for (PersonTestingDTO dto : dtos) { + // 0女;1男 + String sex = IdentityNoUtils.getSex(dto.getIdcard()); + dto.setSex(NumConstant.ONE_STR.equals(sex) ? "男" : "女"); + String birthday = IdentityNoUtils.getBirthday(dto.getIdcard()); + dto.setBirthday(DateUtils.stringToDate(birthday, DateUtils.DATE_PATTERN)); + + saveScanningInfoForUserV1(dto); + + PersonTestingEntity entity = ConvertUtils.sourceToTarget(dto, PersonTestingEntity.class); + entitys.add(entity); + } + insertBatch(entitys); + } } diff --git a/epdc-cloud-custom/src/main/resources/mapper/epidemic/PersonTestingDao.xml b/epdc-cloud-custom/src/main/resources/mapper/epidemic/PersonTestingDao.xml index 0af17e8..51edfb6 100644 --- a/epdc-cloud-custom/src/main/resources/mapper/epidemic/PersonTestingDao.xml +++ b/epdc-cloud-custom/src/main/resources/mapper/epidemic/PersonTestingDao.xml @@ -122,4 +122,29 @@ AND person.ID = #{id} +