From e30cdfa10ca0b08912de1ccd6864779922b8a480 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Tue, 1 Nov 2022 11:03:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E6=8F=90=E4=B8=80=E6=B3=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/exception/EpmetErrorCode.java | 2 + .../java/com/epmet/dto/IcDangerAreaDTO.java | 12 +++ .../epmet/dto/form/DangerAreaListFormDTO.java | 19 ++++ .../controller/IcDangerAreaController.java | 102 ++++++++++++++++-- .../com/epmet/entity/IcDangerAreaEntity.java | 2 + .../java/com/epmet/enums/DangerLevelEnum.java | 55 ++++++++++ .../epmet/excel/IcDangerAreaResultExcel.java | 22 ++++ .../epmet/service/IcDangerAreaService.java | 5 +- .../service/impl/IcDangerAreaServiceImpl.java | 65 ++++++++++- .../excel/ic_danger_area_template.xlsx | Bin 0 -> 9140 bytes 10 files changed, 274 insertions(+), 10 deletions(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DangerAreaListFormDTO.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/enums/DangerLevelEnum.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaResultExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_danger_area_template.xlsx diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index ec9ee8c209..af4142237d 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -268,6 +268,8 @@ public enum EpmetErrorCode { SAMPLE_TIME_IS_NULL_ERROR(8933,"采样时间不能为空"), SAMPLE_TIME_AND_RESULT_IS_NULL_ERROR(8934,"检测时间或结果不能为空"), + + DANGER_AREA_ERROR(8937,"风险地区已存在"), MISMATCH(10086,"人员与房屋信息不匹配,请与工作人员联系。"), //通用错误码 start diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcDangerAreaDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcDangerAreaDTO.java index 8597671a84..3d41095172 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcDangerAreaDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcDangerAreaDTO.java @@ -2,8 +2,13 @@ package com.epmet.dto; import java.io.Serializable; import java.util.Date; + +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** * 疫情风险地区 @@ -29,28 +34,35 @@ public class IcDangerAreaDTO implements Serializable { /** * 风险等级 */ +// @NotBlank(message = "dangerLevel不能为空",groups = {AddGroup.class}) private String dangerLevel; /** * 省 */ +// @NotBlank(message = "province不能为空",groups = {AddGroup.class}) private String province; /** * 市 */ +// @NotBlank(message = "city不能为空",groups = {AddGroup.class}) private String city; /** * 区 */ +// @NotBlank(message = "district不能为空",groups = {AddGroup.class}) private String district; /** * 省-市-区 */ + @NotBlank(message = "allName不能为空",groups = {AddGroup.class}) private String allName; + private String allNameCode; + /** * */ diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DangerAreaListFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DangerAreaListFormDTO.java new file mode 100644 index 0000000000..9071a4a1c7 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DangerAreaListFormDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto.form; + +import com.epmet.commons.tools.dto.form.PageFormDTO; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2022/10/31 16:59 + */ +@Data +public class DangerAreaListFormDTO extends PageFormDTO implements Serializable { + private static final long serialVersionUID = 8868052895161162655L; + + private String name; + private String dangerLevel; + private String customerId; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java index a9281264bd..4dcfd4bb09 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java @@ -1,20 +1,42 @@ package com.epmet.controller; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.dto.form.PageFormDTO; import com.epmet.commons.tools.page.PageData; +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.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.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.dto.IcDangerAreaDTO; +import com.epmet.dto.form.DangerAreaListFormDTO; +import com.epmet.dto.result.NatListCommonExcelResultDTO; +import com.epmet.dto.result.NatListResultDTO; +import com.epmet.enums.DangerLevelEnum; +import com.epmet.excel.IcDangerAreaResultExcel; import com.epmet.service.IcDangerAreaService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; import java.util.List; import java.util.Map; @@ -26,6 +48,7 @@ import java.util.Map; * @since v1.0.0 2022-10-31 */ @RestController +@Slf4j @RequestMapping("icDangerArea") public class IcDangerAreaController { @@ -44,11 +67,18 @@ public class IcDangerAreaController { return new Result().ok(data); } + /** + * @Description 新增 + * @param dto + * @param tokenDto + * @Author zxc + * @Date 2022/11/1 09:09 + */ @NoRepeatSubmit @PostMapping("save") - public Result save(@RequestBody IcDangerAreaDTO dto){ - //效验数据 + public Result save(@RequestBody IcDangerAreaDTO dto, @LoginUser TokenDto tokenDto){ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + dto.setCustomerId(tokenDto.getCustomerId()); icDangerAreaService.save(dto); return new Result(); } @@ -63,10 +93,70 @@ public class IcDangerAreaController { } @PostMapping("delete") - public Result delete(@RequestBody String[] ids){ - //效验数据 - AssertUtils.isArrayEmpty(ids, "id"); - icDangerAreaService.delete(ids); + public Result delete(@RequestBody List ids,@LoginUser TokenDto tokenDto){ + icDangerAreaService.delete(ids,tokenDto.getUserId()); return new Result(); } + + @RequestMapping("list") + public Result> list(@RequestBody DangerAreaListFormDTO formDTO,@LoginUser TokenDto tokenDto){ + ValidatorUtils.validateEntity(formDTO, PageFormDTO.AddUserInternalGroup.class); + formDTO.setCustomerId(tokenDto.getCustomerId()); + return new Result>().ok(icDangerAreaService.list(formDTO)); + } + + @RequestMapping("export") + public void export(@LoginUser TokenDto tokenDto,@RequestBody DangerAreaListFormDTO formDTO,HttpServletResponse response){ + formDTO.setCustomerId(tokenDto.getCustomerId()); + ExcelWriter excelWriter = null; + int pageNo = NumConstant.ONE; + formDTO.setPageSize(NumConstant.ONE_THOUSAND); + try { + excelWriter = EasyExcel.write(ExcelUtils.getOutputStreamForExcel("风险地区", response), IcDangerAreaResultExcel.class).build(); + WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").registerWriteHandler(new FreezeAndFilter()).build(); + Integer size; + do { + PageData list = icDangerAreaService.list(formDTO); + List data = list.getList(); + if (CollectionUtils.isNotEmpty(data)){ + data.forEach(d -> { + d.setDangerLevel(DangerLevelEnum.getNameByCode(d.getDangerLevel())); + }); + } + excelWriter.write(ConvertUtils.sourceToTarget(data,IcDangerAreaResultExcel.class), writeSheet); + formDTO.setPageNo(pageNo++); + size = data.size(); + } while (size == NumConstant.ONE_THOUSAND); + }catch (Exception e){ + log.error("export exception", e); + }finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + /** + * @Description 模板下载 + * @param response + * @Author zxc + * @Date 2022/11/1 09:52 + */ + @PostMapping("downloadTemplate") + public void downloadTemplate(HttpServletResponse response) throws IOException{ + 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"); + InputStream is = this.getClass().getClassLoader().getResourceAsStream("excel/ic_danger_area_template.xlsx"); + try { + ServletOutputStream os = response.getOutputStream(); + IOUtils.copy(is, os); + } finally { + if (is != null) { + is.close(); + } + } + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcDangerAreaEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcDangerAreaEntity.java index 9d895750f9..e7a4968bea 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcDangerAreaEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcDangerAreaEntity.java @@ -51,4 +51,6 @@ public class IcDangerAreaEntity extends BaseEpmetEntity { */ private String allName; + private String allNameCode; + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/DangerLevelEnum.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/DangerLevelEnum.java new file mode 100644 index 0000000000..9c3441043c --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/DangerLevelEnum.java @@ -0,0 +1,55 @@ +package com.epmet.enums; + +/** + * desc:数据同步配置枚举 对应data_sync_config中的DATA_CODE + * @author Administrator + */ + +public enum DangerLevelEnum { + + LOW("0", "低风险"), + MIDDLE("1", "中风险"), + HIGH("2", "高风险"), + OTHER("3", "无风险"), + + ; + + private final String code; + private final String name; + + + + DangerLevelEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public static DangerLevelEnum getEnum(String code) { + DangerLevelEnum[] values = DangerLevelEnum.values(); + for (DangerLevelEnum value : values) { + if (value.getCode().equals(code)) { + return value; + } + } + return DangerLevelEnum.OTHER; + } + + public static String getNameByCode(String code) { + DangerLevelEnum[] values = DangerLevelEnum.values(); + for (DangerLevelEnum value : values) { + if (value.getCode().equals(code)) { + return value.getName(); + } + } + return DangerLevelEnum.OTHER.getName(); + } + + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaResultExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaResultExcel.java new file mode 100644 index 0000000000..6aa4f89e5b --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaResultExcel.java @@ -0,0 +1,22 @@ +package com.epmet.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +/** + * @Author zxc + * @DateTime 2022/11/1 10:26 + */ +@Data +public class IcDangerAreaResultExcel { + + @ColumnWidth(40) + @ExcelProperty(value = "风险地区") + private String allName; + + @ColumnWidth(20) + @ExcelProperty(value = "风险等级") + private String dangerLevel; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java index 88e680c180..9baf3e2b99 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java @@ -3,6 +3,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcDangerAreaDTO; +import com.epmet.dto.form.DangerAreaListFormDTO; import com.epmet.entity.IcDangerAreaEntity; import java.util.List; @@ -36,6 +37,8 @@ public interface IcDangerAreaService extends BaseService { */ List list(Map params); + PageData list(DangerAreaListFormDTO formDTO); + /** * 单条查询 * @@ -74,5 +77,5 @@ public interface IcDangerAreaService extends BaseService { * @author generator * @date 2022-10-31 */ - void delete(String[] ids); + void delete(List ids,String staffId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java index 0e7a4d5b2f..498712ae68 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java @@ -1,21 +1,30 @@ package com.epmet.service.impl; +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.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.dao.IcDangerAreaDao; import com.epmet.dto.IcDangerAreaDTO; +import com.epmet.dto.form.DangerAreaListFormDTO; import com.epmet.entity.IcDangerAreaEntity; import com.epmet.service.IcDangerAreaService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Map; @@ -44,6 +53,24 @@ public class IcDangerAreaServiceImpl extends BaseServiceImpl list(DangerAreaListFormDTO formDTO) { + PageData result = new PageData<>(); + LambdaQueryWrapper qr = new LambdaQueryWrapper<>(); + qr.like(StringUtils.isNotBlank(formDTO.getName()),IcDangerAreaEntity::getAllName,formDTO.getName()) + .eq(StringUtils.isNotBlank(formDTO.getDangerLevel()),IcDangerAreaEntity::getDangerLevel,formDTO.getDangerLevel()); + if (formDTO.getIsPage()){ + PageInfo pageInfo = PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize()).doSelectPageInfo(() -> baseDao.selectList(qr)); + result.setTotal(Integer.valueOf(String.valueOf(pageInfo.getTotal()))); + result.setList(ConvertUtils.sourceToTarget(pageInfo.getList(),IcDangerAreaDTO.class)); + }else { + List entities = baseDao.selectList(qr); + result.setTotal(entities.size()); + result.setList(ConvertUtils.sourceToTarget(entities,IcDangerAreaDTO.class)); + } + return result; + } + private QueryWrapper getWrapper(Map params){ String id = (String)params.get(FieldConstant.ID_HUMP); @@ -59,10 +86,38 @@ public class IcDangerAreaServiceImpl extends BaseServiceImpl qw = new LambdaQueryWrapper<>(); + qw.eq(IcDangerAreaEntity::getAllName,dto.getAllName()); + IcDangerAreaEntity icDangerAreaEntity = baseDao.selectOne(qw); + if (null != icDangerAreaEntity){ + throw new EpmetException(EpmetErrorCode.DANGER_AREA_ERROR.getCode()); + } IcDangerAreaEntity entity = ConvertUtils.sourceToTarget(dto, IcDangerAreaEntity.class); + String[] split = dto.getAllName().split("-"); + for (int i = NumConstant.ZERO; i < split.length; i++) { + switch (i){ + case NumConstant.ZERO: + entity.setProvince(split[i]); + break; + case NumConstant.ONE: + entity.setCity(split[i]); + break; + case NumConstant.TWO: + entity.setDistrict(split[i]); + break; + default: + break; + } + } insert(entity); } @@ -75,9 +130,13 @@ public class IcDangerAreaServiceImpl extends BaseServiceImpl ids,String staffId) { + LambdaUpdateWrapper updateWrapper=new LambdaUpdateWrapper<>(); + updateWrapper.in(IcDangerAreaEntity::getId,ids) + .set(IcDangerAreaEntity::getUpdatedBy,staffId) + .set(IcDangerAreaEntity::getUpdatedTime,new Date()) + .set(IcDangerAreaEntity::getDelFlag, NumConstant.ONE_STR); + baseDao.update(null,updateWrapper); } } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_danger_area_template.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_danger_area_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..764d637a6ad1bafcf6d9d86ed0ca59c8ae81a554 GIT binary patch literal 9140 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