From a80d6f01ec9a00393fe9d3d3ac76f3ac00ab878c Mon Sep 17 00:00:00 2001 From: luyan Date: Tue, 18 Apr 2023 09:57:06 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=8D=B3=E5=A2=A8=E7=81=B5=E5=B1=B1?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/form/EventAddEditFormDTO.java | 83 +++++++++++ .../com/epmet/dto/form/EventFormsDTO.java | 86 +++++++++++ .../com/epmet/dto/result/EventResultDTO.java | 102 +++++++++++++ .../com/epmet/controller/EventController.java | 88 ++++++++++++ .../java/com/epmet/dao/EventEntityDao.java | 19 +++ .../com/epmet/entity/EventDetailEntity.java | 43 ++++++ .../java/com/epmet/entity/EventEntity.java | 97 +++++++++++++ .../java/com/epmet/service/EventService.java | 19 +++ .../epmet/service/impl/EventServiceImpl.java | 136 ++++++++++++++++++ .../main/resources/mapper/EventEntityDao.xml | 13 ++ 10 files changed, 686 insertions(+) create mode 100644 epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventAddEditFormDTO.java create mode 100644 epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventFormsDTO.java create mode 100644 epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/EventResultDTO.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/EventController.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/EventEntityDao.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventDetailEntity.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventEntity.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/EventService.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/EventServiceImpl.java create mode 100644 epmet-module/gov-project/gov-project-server/src/main/resources/mapper/EventEntityDao.xml diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventAddEditFormDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventAddEditFormDTO.java new file mode 100644 index 0000000000..d31d57b3d1 --- /dev/null +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventAddEditFormDTO.java @@ -0,0 +1,83 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +@Data +public class EventAddEditFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 事件编号 + */ + private String code; + /** + * 事件状态 + */ + private String status; + /** + * 上报人员 + */ + private String reporter; + /** + * 联系电话 + */ + private String phone; + /** + * 上报事件 + */ + private Date reportDate; + /** + * 紧急程度 + */ + private String urgency; + /** + * 所属网格 + */ + private String grid; + /** + * 事件类型 + */ + private String eventType; + /** + * 即办类型 + */ + private String type; + /** + * 办理期限 + */ + private Date lastDate; + + /** + * 满意度 + */ + private String satisficing; + + /** + * 页码 + */ + private Integer pageNo = 1; + /** + * 每页显示数量 + */ + private Integer pageSize = 20; + + private Boolean isPage = true; + + + private String customerId; + + private String agencyId; + + private String staffId; + + private String userId; + + private String app; + + private String client; +} diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventFormsDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventFormsDTO.java new file mode 100644 index 0000000000..a9c4c2baa5 --- /dev/null +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/EventFormsDTO.java @@ -0,0 +1,86 @@ +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 灵山项目事件 formDTO + */ + +@Data +public class EventFormsDTO implements Serializable { + private static final long serialVersionUID = 1; + + public interface Detail extends CustomerClientShowGroup { + } + + public interface GovRedDot extends CustomerClientShowGroup { + } + + /** + * 事件编号 + */ + private String code; + /** + * 事件状态 + */ + private String status; + /** + * 上报人员 + */ + private String reporter; + /** + * 联系电话 + */ + private String phone; + /** + * 上报事件 + */ + private Date reportDate; + /** + * 紧急程度 + */ + private String urgency; + /** + * 所属网格 + */ + private String grid; + /** + * 事件类型 + */ + private String eventType; + /** + * 即办类型 + */ + private String type; + /** + * 办理期限 + */ + private Date lastDate; + + /** + * 满意度 + */ + private String satisficing; + + /** + * 页码 + */ + private Integer pageNo = 1; + /** + * 每页显示数量 + */ + private Integer pageSize = 20; + + private Boolean isPage = true; + + + private String customerId; + + private String agencyId; + + private String staffId; +} diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/EventResultDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/EventResultDTO.java new file mode 100644 index 0000000000..059905086a --- /dev/null +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/result/EventResultDTO.java @@ -0,0 +1,102 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 即墨灵山项目 + */ + +@Data +public class EventResultDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + private String id; + + /** + * 事件编号 + */ + private String code; + + /** + * 事件状态 + */ + private String status; + + /** + * 事件明细ID + */ + private String detailId; + /** + * 上报人员 + */ + private String reporter; + /** + * 联系电话 + */ + private String phone; + /** + * 上报事件事件 + */ + private Date reportDate; + /** + * 紧急程度 + */ + private String urgency; + /** + * 所属网格 + */ + private String grid; + /** + * 事件类型 + */ + private String eventType; + /** + * 即办类型 + */ + private String type; + /** + * 办理期限 + */ + private Date lastDate; + /** + * 事件地址 + */ + private String eventAddr; + + /** + * 坐标经度 + */ + private String longitude; + /** + * 坐标纬度 + */ + private String latitude; + /** + * 音频 + */ + private String voice; + /** + * 视频 + */ + private String video; + /** + * 满意度 + */ + private String satisficing; + /** + * 解决情况 + */ + private String remark; + /** + * 事件描述 + */ + private String conetnt; + +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/EventController.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/EventController.java new file mode 100644 index 0000000000..2a85af367f --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/EventController.java @@ -0,0 +1,88 @@ +package com.epmet.controller; + +import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.aop.NoRepeatSubmit; +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.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.dto.form.EventAddEditFormDTO; +import com.epmet.dto.form.EventFormsDTO; +import com.epmet.dto.result.EventResultDTO; +import com.epmet.service.EventService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author yan Lu + * @date 2023-04-14 19:07 + * @deprecated 社会治理--事件处理 + */ +@Slf4j +@RestController +@RequestMapping("event") +public class EventController { + + @Autowired + private EventService eventService; + + /** + * 社会治理 事件列表 + * @param tokenDto + * @param formDTO + * @return + */ + @PostMapping("list") + public Result> getList(@LoginUser TokenDto tokenDto, @RequestBody EventFormsDTO formDTO) { + formDTO.setCustomerId(tokenDto.getCustomerId()); + formDTO.setStaffId(tokenDto.getUserId()); + return new Result>().ok(eventService.getList(formDTO)); + } + + /** + * @deprecated 根据ID获取事件 + * @param id + * @return + */ + @RequestMapping(value = "{id}",method = {RequestMethod.POST,RequestMethod.GET}) + public Result get(@PathVariable("id") String id){ + EventResultDTO data = eventService.getById(id); + return new Result().ok(data); + } + + + @NoRepeatSubmit + @PostMapping("add") + public Result save(@LoginUser TokenDto tokenDto, @RequestBody EventAddEditFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, AddGroup.class, DefaultGroup.class); + formDTO.setCustomerId(tokenDto.getCustomerId()); + formDTO.setUserId(tokenDto.getUserId()); + formDTO.setApp(tokenDto.getApp()); + formDTO.setClient(tokenDto.getClient()); + eventService.save(formDTO); + return new Result(); + } + + @NoRepeatSubmit + @PostMapping("update") + public Result update(@RequestBody EventResultDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + eventService.update(dto); + return new Result(); + } + + @PostMapping("delete") + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + eventService.delete(ids); + return new Result(); + } + +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/EventEntityDao.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/EventEntityDao.java new file mode 100644 index 0000000000..fe05484677 --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/dao/EventEntityDao.java @@ -0,0 +1,19 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.form.EventFormsDTO; +import com.epmet.dto.result.EventResultDTO; +import com.epmet.entity.EventEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 灵山项目 + */ + +@Mapper +public interface EventEntityDao extends BaseDao { + + List getList(EventFormsDTO formDTO); +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventDetailEntity.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventDetailEntity.java new file mode 100644 index 0000000000..84d4c2e0c8 --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventDetailEntity.java @@ -0,0 +1,43 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("event_detail") +public class EventDetailEntity extends BaseEpmetEntity { + + /** + * 事件ID + */ + private String eventId; + /** + * 上报人 + */ + private String reporter; + /** + * 接收人 + */ + private String recipient; + /** + * 上报事件 + */ + private Date reportDate; + /** + * 事件附件地址 + */ + private String atts; + /** + * 事件处理耗时 + */ + private String timeSpent; + /** + * 反馈内容 + */ + private String content; +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventEntity.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventEntity.java new file mode 100644 index 0000000000..1d6212adcf --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/entity/EventEntity.java @@ -0,0 +1,97 @@ +package com.epmet.entity; + + +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 灵山项目事件 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("event_entity") +public class EventEntity extends BaseEpmetEntity { + + /** + * 事件编号 + */ + private String code; + /** + * 事件状态 + */ + private String status; + /** + * 事件明细ID + */ + private String detailId; + /** + * 上报人员 + */ + private String reporter; + /** + * 联系电话 + */ + private String phone; + /** + * 上报事件事件 + */ + private Date reportDate; + /** + * 紧急程度 + */ + private String urgency; + /** + * 所属网格 + */ + private String grid; + /** + * 事件类型 + */ + private String eventType; + /** + * 即办类型 + */ + private String type; + /** + * 办理期限 + */ + private Date lastDate; + /** + * 事件地址 + */ + private String eventAddr; + + /** + * 坐标经度 + */ + private String longitude; + /** + * 坐标纬度 + */ + private String latitude; + /** + * 音频 + */ + private String voice; + /** + * 视频 + */ + private String video; + /** + * 满意度 + */ + private String satisficing; + /** + * 解决情况 + */ + private String remark; + /** + * 事件描述 + */ + private String conetnt; + +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/EventService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/EventService.java new file mode 100644 index 0000000000..07371f7f4f --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/EventService.java @@ -0,0 +1,19 @@ +package com.epmet.service; + + +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.form.EventAddEditFormDTO; +import com.epmet.dto.form.EventFormsDTO; +import com.epmet.dto.result.EventResultDTO; + +public interface EventService { + PageData getList(EventFormsDTO formDTO); + + EventResultDTO getById(String id); + + void update(EventResultDTO dto); + + void delete(String[] ids); + + void save(EventAddEditFormDTO dto); +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/EventServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/EventServiceImpl.java new file mode 100644 index 0000000000..7567d05e6d --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/EventServiceImpl.java @@ -0,0 +1,136 @@ +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +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.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; +import com.epmet.commons.tools.security.user.LoginUserUtil; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.EventEntityDao; +import com.epmet.dto.form.EventAddEditFormDTO; +import com.epmet.dto.form.EventFormsDTO; +import com.epmet.dto.result.EventResultDTO; +import com.epmet.entity.EventEntity; +import com.epmet.entity.IcEventOperationLogEntity; +import com.epmet.service.EventService; +import com.epmet.service.IcEventOperationLogService; +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.Date; +import java.util.List; + +@Service +public class EventServiceImpl extends BaseServiceImpl implements EventService { + + @Autowired + private LoginUserUtil loginUserUtil; + + @Autowired + private IcEventOperationLogService icEventOperationLogService; + + /** + * @param formDTO + * @return + * @deprecated 查询事件列表 + */ + @Override + public PageData getList(EventFormsDTO formDTO) { + if (StringUtils.isBlank(formDTO.getAgencyId())) { + //获取当前工作人员缓存信息 + CustomerStaffInfoCacheResult staffInfo = getStaffInfo(formDTO.getCustomerId(), formDTO.getStaffId()); + formDTO.setAgencyId(staffInfo.getAgencyId()); + } + //分页查询当前组织下网格内事件数据 + PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize(), formDTO.getIsPage()); + List list = baseDao.getList(formDTO); + PageInfo pageInfo = new PageInfo<>(list); + return new PageData<>(list, pageInfo.getTotal()); + } + + /** + * @param id + * @return + * @deprecated 获取事件详情 + */ + @Override + public EventResultDTO getById(String id) { + EventEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, EventResultDTO.class); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(EventResultDTO dto) { + EventEntity entity = ConvertUtils.sourceToTarget(dto, EventEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + for (String id : ids) { + EventEntity entity = baseDao.selectById(id); + if (null == entity) { + continue; + } + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper(); + wrapper.eq(EventEntity::getId, id).set(EventEntity::getUpdatedTime, new Date()) + .set(EventEntity::getUpdatedBy, loginUserUtil.getLoginUserId()) + .set(EventEntity::getDelFlag, NumConstant.ONE_STR); + baseDao.update(null, wrapper); +// icEventCategoryService.delInsert(id,null); + } + } + + @Override + public void save(EventAddEditFormDTO formDTO) { + EventEntity entity = ConvertUtils.sourceToTarget(formDTO, EventEntity.class); + entity.setId(IdWorker.getIdStr()); +// List logList = new ArrayList<>(); +// logList.add(logEntity(formDTO.getCustomerId(), entity.getId(), formDTO.getUserId(), new Date(), "add", "publish")); +// icEventOperationLogService.insertBatch(logList); + insert(entity); + } + + /** + * @param customerId + * @param staffId + * @return + * @deprecated 获取当前登陆人员信息 + */ + + public CustomerStaffInfoCacheResult getStaffInfo(String customerId, String staffId) { + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(customerId, staffId); + if (null == staffInfo) { + throw new EpmetException(String.format("查询工作人员%s缓存信息失败...", staffId)); + } + return staffInfo; + } + + /** + * 事件管理操作日志记录 + * + * @return + */ + private IcEventOperationLogEntity logEntity(String customerId, String icEventId, String userId, Date operateTime, String actionCode, String actionDesc) { + IcEventOperationLogEntity logEntity = new IcEventOperationLogEntity(); + logEntity.setCustomerId(customerId); + logEntity.setIcEventId(icEventId); + logEntity.setUserId(userId); + logEntity.setUserIdentity("staff"); + logEntity.setActionCode(actionCode); + logEntity.setActionDesc(actionDesc); + logEntity.setOperateTime(operateTime); + return logEntity; + } +} diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/EventEntityDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/EventEntityDao.xml new file mode 100644 index 0000000000..722e76a38f --- /dev/null +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/EventEntityDao.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file From a177f6be63e88c7a7d3e844b4cf4d450ef324800 Mon Sep 17 00:00:00 2001 From: wxz Date: Tue, 18 Apr 2023 14:00:20 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E3=80=90=E7=81=B5=E5=B1=B1=E5=A4=A7?= =?UTF-8?q?=E5=B1=8F=E3=80=911.=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E5=AF=B9/orgmap=E6=8E=A5=E5=8F=A3=E7=9A=84=E9=89=B4?= =?UTF-8?q?=E6=9D=83=EF=BC=8C=E5=9B=A0=E4=B8=BA=E5=A4=A7=E5=B1=8F=E8=A6=81?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-gateway/src/main/resources/bootstrap.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index c723860629..0aa5931823 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -528,6 +528,8 @@ epmet: # 员工登记、受众群体登记 - /gov/org/icEmployeeRegister/add - /gov/org/icGroupPeopleRegister/add + # 组织树,灵山大屏需要无登录调用,放开 + - /gov/org/agency/maporg # 外部应用认证,使用AccessToken等头进行认证 externalOpenUrls: - /data/report/** From 960e252cec3b05d35e5b9b1e8251fed850fefa95 Mon Sep 17 00:00:00 2001 From: wxz Date: Tue, 18 Apr 2023 14:30:13 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E3=80=90=E7=81=B5=E5=B1=B1=E5=A4=A7?= =?UTF-8?q?=E5=B1=8F=E3=80=911.=E4=BF=AE=E6=94=B9=EF=BC=9Aorgmap=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=B0=83=E6=95=B4=EF=BC=8C=E4=BD=BF=E7=94=A8EpmetRequ?= =?UTF-8?q?estHolder=E4=BB=A3=E6=9B=BF@LoginUser=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/controller/AgencyController.java | 5 ++-- .../java/com/epmet/service/AgencyService.java | 3 +- .../epmet/service/impl/AgencyServiceImpl.java | 28 +++++++++++++++---- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java index c6576dde5e..1218dc9381 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java @@ -362,14 +362,13 @@ public class AgencyController { /** * @param formDTO - * @param tokenDto * @Description 【地图配置】组织查询 * @author zxc * @date 2021/10/25 10:50 上午 */ @PostMapping("maporg") - public Result mapOrg(@RequestBody MapOrgFormDTO formDTO, @LoginUser TokenDto tokenDto) { - return new Result().ok(agencyService.mapOrg(formDTO, tokenDto)); + public Result mapOrg(@RequestBody MapOrgFormDTO formDTO) { + return new Result().ok(agencyService.mapOrg(formDTO)); } /** diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/AgencyService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/AgencyService.java index d7bb4b2564..126a4ac975 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/AgencyService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/AgencyService.java @@ -118,12 +118,11 @@ public interface AgencyService { /** * @param formDTO - * @param tokenDto * @Description 【地图配置】组织查询 * @author zxc * @date 2021/10/25 10:50 上午 */ - MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto); + MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO); /** * @param formDTO diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java index fcb04db161..9b7ee4e3ba 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java @@ -32,6 +32,7 @@ import com.epmet.commons.tools.redis.RedisKeys; 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.redis.common.bean.GridInfoCache; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.*; @@ -732,7 +733,6 @@ public class AgencyServiceImpl implements AgencyService { /** * @param formDTO - * @param tokenDto * @Description 【地图配置】组织查询 * 根据level查询去查询不同的表,类型,组织:agency,网格:grid,小区:neighborHood * 组织类型去查 customer_agency,看本级是不是 community,是,下级组织就是网格,查询customer_grid,不是,继续查customer_agency @@ -743,19 +743,35 @@ public class AgencyServiceImpl implements AgencyService { * @date 2021/10/25 10:50 上午 */ @Override - public MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto) { + public MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO) { MapOrgResultDTO result = new MapOrgResultDTO(); - LambdaQueryWrapper qw = new LambdaQueryWrapper(); - qw.eq(CustomerAgencyEntity::getPid, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getDelFlag, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getCustomerId, tokenDto.getCustomerId()); - CustomerAgencyEntity customerAgencyEntity = customerAgencyDao.selectOne(qw); + + String customerId = null; + if (StringUtils.isBlank(formDTO.getOrgId())) { - CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); + // 没有传参,则使用当前用户所属组织 + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo((customerId = EpmetRequestHolder.getLoginUserCustomerId()), EpmetRequestHolder.getLoginUserId()); if (null == staffInfo) { return result; } formDTO.setOrgId(staffInfo.getAgencyId()); formDTO.setLevel(OrgInfoConstant.AGENCY); + } else { + // 前段传递了,那就用前端传递的level和orgId,并且查出来这个组织的客户id,用于后面查询跟组织中心点 + if (OrgInfoConstant.AGENCY.equals(formDTO.getLevel())) { + AgencyInfoCache agencyInfo = CustomerOrgRedis.getAgencyInfo(formDTO.getOrgId()); + customerId = agencyInfo.getCustomerId(); + } else if (OrgInfoConstant.GRID.equals(formDTO.getLevel())) { + GridInfoCache gridInfo = CustomerOrgRedis.getGridInfo(formDTO.getOrgId()); + customerId = gridInfo.getCustomerId(); + } } + + // 查询客户跟组织中心点 + LambdaQueryWrapper qw = new LambdaQueryWrapper(); + qw.eq(CustomerAgencyEntity::getPid, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getDelFlag, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getCustomerId, customerId); + CustomerAgencyEntity customerAgencyEntity = customerAgencyDao.selectOne(qw); + if (StringUtils.isNotBlank(customerAgencyEntity.getLatitude())) { result.setLatitude(new BigDecimal(customerAgencyEntity.getLatitude())); } From 44208966aca664ad3352520e7b1b408357e15e65 Mon Sep 17 00:00:00 2001 From: luyan Date: Wed, 19 Apr 2023 14:25:47 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E8=BD=AC=E6=8D=A2=E4=B8=BAlog.info(),=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=8F=82=E6=95=B0=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/utils/net/TCCCClientUtils.java | 8 ++++---- .../com/epmet/controller/tccc/TCCCAuthController.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/TCCCClientUtils.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/TCCCClientUtils.java index 34647de7ec..822d6cfe22 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/TCCCClientUtils.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/net/TCCCClientUtils.java @@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class TCCCClientUtils { - private static String SDKAPPID = "1400801042"; + private static Long SDKAPPID = 1400801042L; private static String USERID = "286388969@qq.com"; @@ -34,12 +34,12 @@ public class TCCCClientUtils { CccClient client = new CccClient(cred, "", clientProfile); // 实例化一个请求对象,每个接口都会对应一个request对象 CreateSDKLoginTokenRequest req = new CreateSDKLoginTokenRequest(); - req.setSdkAppId(1400801042L); - req.setSeatUserId("286388969@qq.com"); + req.setSdkAppId(SDKAPPID); + req.setSeatUserId(USERID); // 返回的resp是一个CreateSDKLoginTokenResponse的实例,与请求对象对应 CreateSDKLoginTokenResponse resp = client.CreateSDKLoginToken(req); // 输出json格式的字符串回包 - System.out.println(CreateSDKLoginTokenResponse.toJsonString(resp)); + log.info(CreateSDKLoginTokenResponse.toJsonString(resp)); return CreateSDKLoginTokenResponse.toJsonString(resp); } catch (TencentCloudSDKException e) { log.error(e.toString()); diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/tccc/TCCCAuthController.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/tccc/TCCCAuthController.java index 18c2baba6e..dd852c7eca 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/tccc/TCCCAuthController.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/tccc/TCCCAuthController.java @@ -14,7 +14,7 @@ public class TCCCAuthController { public String getTcccAuth() { try { String tcccAuth = TCCCClientUtils.getToken(); - System.out.println(tcccAuth); + log.info(tcccAuth); return tcccAuth; } catch (Exception e) { log.error(e.toString()); From 01717d97d82d4401f1b2ce1886b8332bc8dcb8d4 Mon Sep 17 00:00:00 2001 From: wxz Date: Wed, 19 Apr 2023 16:57:38 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E3=80=90=E7=81=B5=E5=B1=B1=E8=A1=97?= =?UTF-8?q?=E9=81=93=E3=80=911.=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=AE=8C=E6=88=90=E4=B8=80=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/LingShanSpecialCrowdTypeEnums.java | 42 +++ .../LingShanSpecialCrowdController.java | 114 ++++++ .../LingshanSpecialCrowdDetailAzbjDao.java | 20 + .../LingshanSpecialCrowdDetailJdryDao.java | 20 + .../LingshanSpecialCrowdDetailJzhzDao.java | 20 + .../LingshanSpecialCrowdDetailSqjzDao.java | 20 + .../LingshanSpecialCrowdDetailXfryDao.java | 20 + .../dao/LingshanSpecialCrowdPersonDao.java | 21 ++ .../LingshanSpecialCrowdPersonTypeDao.java | 20 + .../LingshanSpecialCrowdDetailAzbjEntity.java | 69 ++++ .../LingshanSpecialCrowdDetailBaseEntity.java | 22 ++ .../LingshanSpecialCrowdDetailJdryEntity.java | 69 ++++ .../LingshanSpecialCrowdDetailJzhzEntity.java | 74 ++++ .../LingshanSpecialCrowdDetailSqjzEntity.java | 79 ++++ .../LingshanSpecialCrowdDetailXfryEntity.java | 70 ++++ .../LingshanSpecialCrowdPersonEntity.java | 64 ++++ .../LingshanSpecialCrowdPersonTypeEntity.java | 59 +++ .../LingShanSpecialCrowdIsOrNotConverter.java | 34 ++ .../LingShanSpecialCrowdJzhzConverter.java | 57 +++ .../LingShanSpecialCrowdSqjzConverter.java | 51 +++ ...ngShanSpecialCrowdDetailAzbjExcelData.java | 73 ++++ ...ngShanSpecialCrowdDetailBaseExcelData.java | 30 ++ ...ngshanSpecialCrowdDetailJdryExcelData.java | 79 ++++ ...ngshanSpecialCrowdDetailJzhzExcelData.java | 84 +++++ ...ngshanSpecialCrowdDetailSqjzExcelData.java | 92 +++++ ...ngshanSpecialCrowdDetailXfryExcelData.java | 77 ++++ ...ngShanSpecialCrowdExcelImportListener.java | 351 ++++++++++++++++++ ...anSpecialCrowdAzbjExcelImportListener.java | 49 +++ ...nSpecialCrowdJieduExcelImportListener.java | 45 +++ ...cialCrowdJingZhangExcelImportListener.java | 46 +++ ...anSpecialCrowdSqjzExcelImportListener.java | 45 +++ ...pecialCrowdXinFangExcelImportListener.java | 46 +++ .../service/LingShanSpecialCrowdService.java | 47 +++ .../impl/LingShanSpecialCrowdServiceImpl.java | 163 ++++++++ .../LingshanSpecialCrowdDetailAzbjDao.xml | 57 +++ .../LingshanSpecialCrowdDetailJdryDao.xml | 36 ++ .../LingshanSpecialCrowdDetailJzhzDao.xml | 61 +++ .../LingshanSpecialCrowdDetailSqjzDao.xml | 59 +++ .../LingshanSpecialCrowdDetailXfryDao.xml | 61 +++ .../mapper/LingshanSpecialCrowdPersonDao.xml | 45 +++ .../LingshanSpecialCrowdPersonTypeDao.xml | 36 ++ 41 files changed, 2527 insertions(+) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/enums/LingShanSpecialCrowdTypeEnums.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailAzbjDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJdryDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJzhzDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailSqjzDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailXfryDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonTypeDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailAzbjEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailBaseEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJdryEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJzhzEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailSqjzEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailXfryEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonTypeEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdIsOrNotConverter.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdJzhzConverter.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdSqjzConverter.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailAzbjExcelData.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailBaseExcelData.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJdryExcelData.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJzhzExcelData.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailSqjzExcelData.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailXfryExcelData.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailAzbjDao.xml create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJdryDao.xml create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJzhzDao.xml create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailSqjzDao.xml create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonDao.xml create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonTypeDao.xml diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/enums/LingShanSpecialCrowdTypeEnums.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/enums/LingShanSpecialCrowdTypeEnums.java new file mode 100644 index 0000000000..28e0c19e7c --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/enums/LingShanSpecialCrowdTypeEnums.java @@ -0,0 +1,42 @@ +package com.epmet.enums; + +/** + * @description: 灵山街道-特殊人群 + * @param null: + * @return + * @author: WangXianZhang + * @date: 2023/4/19 10:55 AM + */ +public enum LingShanSpecialCrowdTypeEnums { + AZBJ("anzhibangjiao", "安置帮教", 1), + SQJZ("shequjiaozheng", "社区矫正", 1), + JDRY("xidurenyuan", "戒毒人员", 1), + JZHZ("jingzhanghuanzhe", "精障患者", 1), + XFRY("xinfangrenyuan", "信访人员", 1); + + /** + * 类型。anzhibangjiao, + */ + private String type; + private String name; + + private Integer headerRowNumber; + + LingShanSpecialCrowdTypeEnums(String type, String name, Integer headerRowNumber) { + this.type = type; + this.name = name; + this.headerRowNumber = headerRowNumber; + } + + public String getType() { + return type; + } + + public String getName() { + return name; + } + + public Integer getHeaderRowNumber() { + return headerRowNumber; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java new file mode 100644 index 0000000000..aa21a72797 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java @@ -0,0 +1,114 @@ +package com.epmet.controller; + +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.utils.DateUtils; +import com.epmet.commons.tools.utils.FileUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.service.LingShanSpecialCrowdService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Date; + +/** + * @description: 灵山社会维稳(特殊人群) + * @param null: + * @return + * @author: WangXianZhang + * @date: 2023/4/18 9:08 AM + */ +@Slf4j +@RestController +@RequestMapping("lingShan/specialCrowd") +public class LingShanSpecialCrowdController { + + @Autowired + private LingShanSpecialCrowdService lingShanSpecialCrowdService; + + /** + * @description: 特殊人群导入 + * @param file: + * @param crowdCategory: 人群类别 + * anzhibangjiao + * buliangqingshaonian + * shequjiaozheng + * xidurenyuan + * xiejiaorenyuan + * zhaoshizhaohuojingshenbing + * @return + * @author: WangXianZhang + * @date: 2023/4/18 9:12 AM + */ + @PostMapping("import") + public Result importSpecialCowd(MultipartFile file, @RequestParam("crowdCategory") String crowdCategory) { + + // 1.存文件 + Path fileSavePath = saveSpecialCrowdTempFile(file); + + // 2.执行业务导入 + try { + lingShanSpecialCrowdService.importSpecialCrowd(crowdCategory, fileSavePath.toString()); + } catch (Exception e) { + throw e; + // ... + } finally { + // 3.删除文件 + deleteSpecialCrowdTempFile(fileSavePath); + } + + return null; + } + + /** + * @description: 保存特殊人群临时文件 + * @param file: + * @return + * @author: WangXianZhang + * @date: 2023/4/18 9:46 AM + */ + public Path saveSpecialCrowdTempFile(@RequestParam("file") MultipartFile file) { + Path fileSavePath; + FileOutputStream os = null; + try { + Path fileSaveDir = FileUtils.getAndCreateDirUnderEpmetFilesDir("special_crowd_import"); + String fileName = DateUtils.format(new Date(), "yyyyMMdd_HHmmss_" + System.nanoTime()); + fileSavePath = fileSaveDir.resolve(fileName); + IOUtils.copy(file.getInputStream(), (os = new FileOutputStream(fileSavePath.toString()))); + return fileSavePath; + } catch (IOException e) { + log.error("【灵山街道】导入社会维稳数据,缓存文件失败。"); + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, null); + } finally { + org.apache.poi.util.IOUtils.closeQuietly(os); + } + } + + /** + * @description: 删除特殊人群临时文件 + * @param fileSavePath: + * @return + * @author: WangXianZhang + * @date: 2023/4/18 9:47 AM + */ + public void deleteSpecialCrowdTempFile(Path fileSavePath) { + if (fileSavePath != null) { + try { + Files.deleteIfExists(fileSavePath); + } catch ( + IOException e) { + log.error("【灵山街道】导入社会维稳数据,删除临时文件失败"); + } + } + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailAzbjDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailAzbjDao.java new file mode 100644 index 0000000000..867b812be2 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailAzbjDao.java @@ -0,0 +1,20 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdDetailAzbjEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-安置帮教 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdDetailAzbjDao extends BaseDao { + + void saveBatchManually(@Param("asbjList") List l); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJdryDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJdryDao.java new file mode 100644 index 0000000000..46419693c3 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJdryDao.java @@ -0,0 +1,20 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdDetailJdryEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-戒毒人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdDetailJdryDao extends BaseDao { + + void saveBatchManually(@Param("list") List l); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJzhzDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJzhzDao.java new file mode 100644 index 0000000000..727b1f3e07 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailJzhzDao.java @@ -0,0 +1,20 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdDetailJzhzEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-精障患者 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdDetailJzhzDao extends BaseDao { + + void saveBatchManually(@Param("list") List l); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailSqjzDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailSqjzDao.java new file mode 100644 index 0000000000..331aa3a227 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailSqjzDao.java @@ -0,0 +1,20 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdDetailSqjzEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-社区矫正 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdDetailSqjzDao extends BaseDao { + + void saveBatchManually(@Param("list") List l); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailXfryDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailXfryDao.java new file mode 100644 index 0000000000..e3e3ef3527 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdDetailXfryDao.java @@ -0,0 +1,20 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdDetailXfryEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-信访人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdDetailXfryDao extends BaseDao { + + void saveBatchManually(@Param("list") List l); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonDao.java new file mode 100644 index 0000000000..5c048ed7fb --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonDao.java @@ -0,0 +1,21 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdDetailAzbjEntity; +import com.epmet.entity.LingshanSpecialCrowdPersonEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-人员基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdPersonDao extends BaseDao { + + void saveOrUpdateManually(@Param("list") List list); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonTypeDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonTypeDao.java new file mode 100644 index 0000000000..5dbb31709b --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/LingshanSpecialCrowdPersonTypeDao.java @@ -0,0 +1,20 @@ +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.LingshanSpecialCrowdPersonTypeEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 灵山-特殊人群-人员具有的特殊人群类型信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Mapper +public interface LingshanSpecialCrowdPersonTypeDao extends BaseDao { + + void saveOrUpdateManually(@Param("types") List types); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailAzbjEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailAzbjEntity.java new file mode 100644 index 0000000000..e8905d6624 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailAzbjEntity.java @@ -0,0 +1,69 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 灵山-特殊人群-安置帮教 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_detail_azbj") +public class LingshanSpecialCrowdDetailAzbjEntity extends LingshanSpecialCrowdDetailBaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 原罪名 + */ + private String originalCharge; + + /** + * 释放日期 + */ + private Date releaseDate; + + /** + * 原判刑期(单位:月) + */ + private Date originPrisonTerm; + + /** + * 是否累犯。0否,1是 + */ + private Integer recidivismFlag; + + /** + * 是否安置。0否,1是 + */ + private Integer emplacementFlag; + + /** + * 安置日期 + */ + private Date emplacementDate; + + /** + * 安置帮教情况 + */ + private String emplacementInfo; + + /** + * 是否注销 + */ + private Integer canceledFlag; + + /** + * 注销原因 + */ + private String canceledReason; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailBaseEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailBaseEntity.java new file mode 100644 index 0000000000..ae663fc8c1 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailBaseEntity.java @@ -0,0 +1,22 @@ +package com.epmet.entity; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; + +@Data +public class LingshanSpecialCrowdDetailBaseEntity extends BaseEpmetEntity { + /** + * 客户Id + */ + private String customerId; + + /** + * org id路径,:分割 + */ + private String orgIdPath; + + /** + * 证件号 + */ + private String idCard; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJdryEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJdryEntity.java new file mode 100644 index 0000000000..279af30d10 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJdryEntity.java @@ -0,0 +1,69 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 灵山-特殊人群-戒毒人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_detail_jdry") +public class LingshanSpecialCrowdDetailJdryEntity extends LingshanSpecialCrowdDetailBaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 有无犯罪史 + */ + private Integer criminalHistoryFlag; + + /** + * 有无复吸史 + */ + private Integer drugRepetitionFlag; + + /** + * 初次发现日期 + */ + private Date firstDiscoveryDate; + + /** + * 管控人姓名 + */ + private String controllerName; + + /** + * 管控人联系方式 + */ + private String controllerContact; + + /** + * 帮扶人姓名 + */ + private String helperName; + + /** + * 帮扶人联系方式 + */ + private String helperContact; + + /** + * 是否脱管 + */ + private Integer detachedFlag; + + /** + * 脱管原因 + */ + private String detachedReason; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJzhzEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJzhzEntity.java new file mode 100644 index 0000000000..4bdef1f2b0 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailJzhzEntity.java @@ -0,0 +1,74 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 灵山-特殊人群-精障患者 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_detail_jzhz") +public class LingshanSpecialCrowdDetailJzhzEntity extends LingshanSpecialCrowdDetailBaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 有无肇事肇祸史 + */ + private Integer causeTroubleHistoryFlag; + + /** + * 肇事肇祸次数 + */ + private Integer causeTroubleTimes; + + /** + * 目前诊断类型。1精神分裂症,2分裂情感性障碍,3持久的妄想性障碍(偏执性精神病),4双相(情感)障碍,5癫痫所致精神障碍,6精神发育迟滞伴发精神障碍,7重度抑郁发作,8精神活性物质所致精神障碍,9其他 + */ + private Integer currentDiagnosis; + + /** + * 危险性评估等级。0,1,2,3,4,5 + */ + private Integer dangerousClass; + + /** + * 是否具备外出能力 + */ + private Integer canGoOutFlag; + + /** + * 是否有暴力倾向 + */ + private Integer violenceFlag; + + /** + * 是否落实监管补助 + */ + private Integer allowanceFlag; + + /** + * 是否纳入低保 + */ + private Integer subsistenceFlag; + + /** + * 监护人姓名 + */ + private String guardianName; + + /** + * 监护人联系方式 + */ + private String guardianContact; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailSqjzEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailSqjzEntity.java new file mode 100644 index 0000000000..66f1b8767a --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailSqjzEntity.java @@ -0,0 +1,79 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 灵山-特殊人群-社区矫正 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_detail_sqjz") +public class LingshanSpecialCrowdDetailSqjzEntity extends LingshanSpecialCrowdDetailBaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 矫正类型。1.管制,2缓刑,3假释,4暂予监外执行,5剥夺政治权利 + */ + private Integer rectificateType; + + /** + * 矫正开始日期 + */ + private Date rectificateStartDate; + + /** + * 矫正结束日期 + */ + private Date rectificateEndDate; + + /** + * 原羁押场所 + */ + private String originDetainAddress; + + /** + * 原罪名 + */ + private String originalCharge; + + /** + * 接受方式。1.自行报到,2狱所押送,3当庭交接,4其他 + */ + private Integer receiveWay; + + /** + * 矫正情况说明 + */ + private String rectificateInfo; + + /** + * 是否脱管 + */ + private Integer detachedFlag; + + /** + * 脱管原因 + */ + private String detachedReason; + + /** + * 是否注销 + */ + private Integer canceledFlag; + + /** + * 注销原因 + */ + private String canceledReason; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailXfryEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailXfryEntity.java new file mode 100644 index 0000000000..34605bd8cc --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdDetailXfryEntity.java @@ -0,0 +1,70 @@ +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 灵山-特殊人群-信访人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_detail_xfry") +public class LingshanSpecialCrowdDetailXfryEntity extends LingshanSpecialCrowdDetailBaseEntity { + + private static final long serialVersionUID = 1L; + + + /** + * 反映问题 + */ + private String problem; + + /** + * 稳控措施 + */ + private String stableControlMeasurement; + + /** + * 是否多次上访 + */ + private Integer multipleFlag; + + /** + * 是否在当地 + */ + private Integer localFlag; + + /** + * 分管领导 + */ + private String branchLeader; + + /** + * 分管领导联系方式 + */ + private String branchLeaderContact; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人联系方式 + */ + private String principalContact; + + /** + * 稳控人员名单 + */ + private String stableControlerList; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonEntity.java new file mode 100644 index 0000000000..8291a3fe24 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonEntity.java @@ -0,0 +1,64 @@ +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; + +/** + * 灵山-特殊人群-人员基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_person") +public class LingshanSpecialCrowdPersonEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * org id路径,:分割 + */ + private String orgIdPath; + + /** + * 姓名 + */ + private String name; + + /** + * 证件号 + */ + private String idCard; + + public LingshanSpecialCrowdPersonEntity() { + } + + public LingshanSpecialCrowdPersonEntity(String id, String customerId, String orgIdPath, String name, String idCard, + String delFlag, Integer revision, Date createdTime, String createdBy, Date updatedTime, + String updatedBy) { + this.customerId = customerId; + this.orgIdPath = orgIdPath; + this.name = name; + this.idCard = idCard; + this.setDelFlag(delFlag); + this.setCreatedBy(createdBy); + this.setCreatedTime(createdTime); + this.setUpdatedBy(updatedBy); + this.setUpdatedTime(updatedTime); + this.setRevision(revision); + this.setId(id); + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonTypeEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonTypeEntity.java new file mode 100644 index 0000000000..35276f46ef --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/LingshanSpecialCrowdPersonTypeEntity.java @@ -0,0 +1,59 @@ +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 java.util.Date; + +/** + * 灵山-特殊人群-人员具有的特殊人群类型信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("lingshan_special_crowd_person_type") +public class LingshanSpecialCrowdPersonTypeEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * org id路径,:分割 + */ + private String orgIdPath; + + /** + * 证件号 + */ + private String idCard; + + /** + * 特殊人群类别 + */ + private String specialType; + + public LingshanSpecialCrowdPersonTypeEntity(String id, String customerId, String orgIdPath, String idCard, String specialType, String delFlag, + Integer revision, Date createdTime, String createdBy, Date updatedTime, String updatedBy) { + this.customerId = customerId; + this.orgIdPath = orgIdPath; + this.idCard = idCard; + this.specialType = specialType; + this.setDelFlag(delFlag); + this.setCreatedBy(createdBy); + this.setCreatedTime(createdTime); + this.setUpdatedBy(updatedBy); + this.setUpdatedTime(updatedTime); + this.setRevision(revision); + this.setId(id); + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdIsOrNotConverter.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdIsOrNotConverter.java new file mode 100644 index 0000000000..e146615243 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdIsOrNotConverter.java @@ -0,0 +1,34 @@ +package com.epmet.excel.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; +import org.apache.commons.lang3.StringUtils; + +/** + * 灵山-是否转换器 + */ +public class LingShanSpecialCrowdIsOrNotConverter implements Converter { + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public Integer convertToJavaData(ReadConverterContext context) throws Exception { + String content = context.getReadCellData().getStringValue(); + if (StringUtils.isNotBlank(content)) { + if (content.equals("是") || content.equals("有")) { + return 1; + } else if (content.equals("无") || content.equals("否")) { + return 0; + } + } + return Converter.super.convertToJavaData(context); + } +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdJzhzConverter.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdJzhzConverter.java new file mode 100644 index 0000000000..fbefaf92fd --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdJzhzConverter.java @@ -0,0 +1,57 @@ +package com.epmet.excel.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; + +/** + * 灵山-诊断类型转换器 + */ +public class LingShanSpecialCrowdJzhzConverter implements Converter { + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Integer convertToJavaData(ReadConverterContext context) throws Exception { + String content = context.getReadCellData().getStringValue(); + if (content instanceof String) { + switch (content) { + // 诊断类型 + case "精神分裂症": + return 1; + case "分裂情感性障碍": + return 2; + case "持久的妄想性障碍(偏执性精神病)": + return 3; + case "双相(情感)障碍": + return 4; + case "癫痫所致精神障碍": + return 5; + case "精神发育迟滞伴发精神障碍": + return 6; + case "重度抑郁发作": + return 7; + case "精神活性物质所致精神障碍": + return 8; + case "其他": + return 9; + // 危险性评估等级 + case "0级": + return 0; + case "1级": + return 1; + case "2级": + return 2; + case "3级": + return 3; + case "4级": + return 4; + case "5级": + return 5; + } + } + return Converter.super.convertToJavaData(context); + } +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdSqjzConverter.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdSqjzConverter.java new file mode 100644 index 0000000000..8de25b0e9a --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/converter/LingShanSpecialCrowdSqjzConverter.java @@ -0,0 +1,51 @@ +package com.epmet.excel.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; + +/** + * 灵山-社区矫正转换器 + */ +public class LingShanSpecialCrowdSqjzConverter implements Converter { + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public Integer convertToJavaData(ReadConverterContext context) throws Exception { + Object content = context.getReadCellData().getStringValue(); + if (content instanceof String) { + switch ((String) content) { + // 矫正类型 + case "管制": + return 1; + case "缓刑": + return 2; + case "假释": + return 3; + case "暂予监外执行": + return 4; + case "剥夺政治权利": + return 5; + // 接受方式 + case "自行报到": + return 1; + case "狱所押送": + return 2; + case "当庭交接": + return 3; + case "其他": + return 4; + + } + } + return Converter.super.convertToJavaData(context); + } +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailAzbjExcelData.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailAzbjExcelData.java new file mode 100644 index 0000000000..49bacc91d7 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailAzbjExcelData.java @@ -0,0 +1,73 @@ +package com.epmet.excel.data; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.epmet.excel.converter.LingShanSpecialCrowdIsOrNotConverter; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 安置帮教 + */ +@Data +public class LingShanSpecialCrowdDetailAzbjExcelData extends LingShanSpecialCrowdDetailBaseExcelData { + + /** + * 原罪名 + */ + @ExcelProperty(value = "*原罪名") + @NotBlank(message = "原罪名不能为空") + private String originalCharge; + + /** + * 释放日期 + */ + @ExcelProperty(value = "*释放日期") + @NotNull(message = "释放日期不能为空") + private Date releaseDate; + + /** + * 原判刑期(单位:月) + */ + @ExcelProperty(value = "原判刑期(单位:月)") + private Date originPrisonTerm; + + /** + * 是否累犯。0否,1是 + */ + @ExcelProperty(value = "是否累犯", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer recidivismFlag; + + /** + * 是否安置。0否,1是 + */ + @ExcelProperty(value = "是否安置", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer emplacementFlag; + + /** + * 安置日期 + */ + @ExcelProperty(value = "安置日期") + private Date emplacementDate; + + /** + * 安置帮教情况 + */ + @ExcelProperty(value = "安置帮教情况") + private String emplacementInfo; + + /** + * 是否注销 + */ + @ExcelProperty(value = "是否注销", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer canceledFlag; + + /** + * 注销原因 + */ + @ExcelProperty(value = "注销原因") + private String canceledReason; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailBaseExcelData.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailBaseExcelData.java new file mode 100644 index 0000000000..1d43fb5790 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingShanSpecialCrowdDetailBaseExcelData.java @@ -0,0 +1,30 @@ +package com.epmet.excel.data; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * + */ +@Data +public class LingShanSpecialCrowdDetailBaseExcelData { + /** + * 姓名 + */ + @ExcelProperty(value = "*姓名") + @NotBlank(message = "姓名不能为空") + private String name; + /** + * 证件号 + */ + @ExcelProperty(value = "*身份证号") + @NotBlank(message = "身份证号不能为空") + private String idCard; + + /** + * 错误信息 + */ + private String errorInfo; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJdryExcelData.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJdryExcelData.java new file mode 100644 index 0000000000..8ca975af70 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJdryExcelData.java @@ -0,0 +1,79 @@ +package com.epmet.excel.data; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import com.epmet.excel.converter.LingShanSpecialCrowdIsOrNotConverter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 灵山-特殊人群-戒毒人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +public class LingshanSpecialCrowdDetailJdryExcelData extends LingShanSpecialCrowdDetailBaseExcelData { + + /** + * 有无犯罪史 + */ + @ExcelProperty(value = "*有无犯罪史", converter = LingShanSpecialCrowdIsOrNotConverter.class) + @NotNull(message = "有无犯罪史不能为空") + private Integer criminalHistoryFlag; + + /** + * 有无复吸史 + */ + @ExcelProperty(value = "*有无复吸史", converter = LingShanSpecialCrowdIsOrNotConverter.class) + @NotNull(message = "有无复吸史不能为空") + private Integer drugRepetitionFlag; + + /** + * 初次发现日期 + */ + @ExcelProperty(value = "初次发现日期") + private Date firstDiscoveryDate; + + /** + * 管控人姓名 + */ + @ExcelProperty(value = "管控人姓名") + private String controllerName; + + /** + * 管控人联系方式 + */ + @ExcelProperty(value = "管控人联系方式") + private String controllerContact; + + /** + * 帮扶人姓名 + */ + @ExcelProperty(value = "帮扶人姓名") + private String helperName; + + /** + * 帮扶人联系方式 + */ + @ExcelProperty(value = "帮扶人联系方式") + private String helperContact; + + /** + * 是否脱管 + */ + @ExcelProperty(value = "是否脱管", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer detachedFlag; + + /** + * 脱管原因 + */ + @ExcelProperty(value = "脱管原因") + private String detachedReason; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJzhzExcelData.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJzhzExcelData.java new file mode 100644 index 0000000000..067cd35987 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailJzhzExcelData.java @@ -0,0 +1,84 @@ +package com.epmet.excel.data; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.epmet.excel.converter.LingShanSpecialCrowdIsOrNotConverter; +import com.epmet.excel.converter.LingShanSpecialCrowdJzhzConverter; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 灵山-特殊人群-精障患者 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +public class LingshanSpecialCrowdDetailJzhzExcelData extends LingShanSpecialCrowdDetailBaseExcelData { + + private static final long serialVersionUID = 1L; + + /** + * 有无肇事肇祸史 + */ + @ExcelProperty(value = "*有无肇事肇祸史", converter = LingShanSpecialCrowdIsOrNotConverter.class) + @NotNull(message = "有无肇事肇祸史不能为空") + private Integer causeTroubleHistoryFlag; + + /** + * 肇事肇祸次数 + */ + @ExcelProperty(value = "*肇事肇祸次数") + @NotNull(message = "肇事肇祸次数不能为空") + private Integer causeTroubleTimes; + + /** + * 目前诊断类型。1精神分裂症,2分裂情感性障碍,3持久的妄想性障碍(偏执性精神病),4双相(情感)障碍,5癫痫所致精神障碍,6精神发育迟滞伴发精神障碍,7重度抑郁发作,8精神活性物质所致精神障碍,9其他 + */ + @ExcelProperty(value = "目前诊断类型", converter = LingShanSpecialCrowdJzhzConverter.class) + private Integer currentDiagnosis; + + /** + * 危险性评估等级。0,1,2,3,4,5 + */ + @ExcelProperty(value = "危险性评估等级", converter = LingShanSpecialCrowdJzhzConverter.class) + private Integer dangerousClass; + + /** + * 是否具备外出能力 + */ + @ExcelProperty(value = "是否具备外出能力", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer canGoOutFlag; + + /** + * 是否有暴力倾向 + */ + @ExcelProperty(value = "是否有暴力倾向", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer violenceFlag; + + /** + * 是否落实监管补助 + */ + @ExcelProperty(value = "是否落实监管补助", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer allowanceFlag; + + /** + * 是否纳入低保 + */ + @ExcelProperty(value = "是否纳入低保", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer subsistenceFlag; + + /** + * 监护人姓名 + */ + @ExcelProperty(value = "监护人姓名") + private String guardianName; + + /** + * 监护人联系方式 + */ + @ExcelProperty(value = "监护人联系方式") + private String guardianContact; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailSqjzExcelData.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailSqjzExcelData.java new file mode 100644 index 0000000000..950ce47381 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailSqjzExcelData.java @@ -0,0 +1,92 @@ +package com.epmet.excel.data; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import com.epmet.excel.converter.LingShanSpecialCrowdIsOrNotConverter; +import com.epmet.excel.converter.LingShanSpecialCrowdSqjzConverter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 灵山-特殊人群-社区矫正 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +public class LingshanSpecialCrowdDetailSqjzExcelData extends LingShanSpecialCrowdDetailBaseExcelData { + + + /** + * 矫正类型。1.管制,2缓刑,3假释,4暂予监外执行,5剥夺政治权利 + */ + @ExcelProperty(value = "*矫正类型", converter = LingShanSpecialCrowdSqjzConverter.class) + @NotNull(message = "矫正类型不能为空") + private Integer rectificateType; + + /** + * 矫正开始日期 + */ + @ExcelProperty(value = "矫正开始日期") + private Date rectificateStartDate; + + /** + * 矫正结束日期 + */ + @ExcelProperty(value = "矫正结束日期") + private Date rectificateEndDate; + + /** + * 原羁押场所 + */ + @ExcelProperty(value = "原羁押场所") + private String originDetainAddress; + + /** + * 原罪名 + */ + @ExcelProperty(value = "原罪名") + private String originalCharge; + + /** + * 接受方式。1.自行报到,2狱所押送,3当庭交接,4其他 + */ + @ExcelProperty(value = "接受方式", converter = LingShanSpecialCrowdSqjzConverter.class) + private Integer receiveWay; + + /** + * 矫正情况说明 + */ + @ExcelProperty(value = "矫正情况说明") + private String rectificateInfo; + + /** + * 是否脱管 + */ + @ExcelProperty(value = "是否脱管", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer detachedFlag; + + /** + * 脱管原因 + */ + @ExcelProperty(value = "脱管原因") + private String detachedReason; + + /** + * 是否注销 + */ + @ExcelProperty(value = "是否注销" , converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer canceledFlag; + + /** + * 注销原因 + */ + @ExcelProperty(value = "注销原因") + private String canceledReason; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailXfryExcelData.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailXfryExcelData.java new file mode 100644 index 0000000000..f7a865a3ba --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/data/LingshanSpecialCrowdDetailXfryExcelData.java @@ -0,0 +1,77 @@ +package com.epmet.excel.data; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import com.epmet.excel.converter.LingShanSpecialCrowdIsOrNotConverter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; + +/** + * 灵山-特殊人群-信访人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2023-04-18 + */ +@Data +public class LingshanSpecialCrowdDetailXfryExcelData extends LingShanSpecialCrowdDetailBaseExcelData { + + /** + * 反映问题 + */ + @ExcelProperty(value = "*反映问题") + @NotBlank(message = "反映问题不能为空") + private String problem; + + /** + * 稳控措施 + */ + @ExcelProperty(value = "*稳控措施") + @NotBlank(message = "稳控措施不能为空") + private String stableControlMeasurement; + + /** + * 是否多次上访 + */ + @ExcelProperty(value = "是否多次上访", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer multipleFlag; + + /** + * 是否在当地 + */ + @ExcelProperty(value = "是否在当地", converter = LingShanSpecialCrowdIsOrNotConverter.class) + private Integer localFlag; + + /** + * 分管领导 + */ + @ExcelProperty(value = "分管领导") + private String branchLeader; + + /** + * 分管领导联系方式 + */ + @ExcelProperty(value = "分管领导联系方式") + private String branchLeaderContact; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String principal; + + /** + * 负责人联系方式 + */ + @ExcelProperty(value = "负责人联系方式") + private String principalContact; + + /** + * 稳控人员名单 + */ + @ExcelProperty(value = "稳控人员名单") + private String stableControlerList; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java new file mode 100644 index 0000000000..e86d714d11 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java @@ -0,0 +1,351 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.read.listener.ReadListener; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.epmet.common.token.util.TokenUtil; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ValidateException; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.EpmetRequestHolder; +import com.epmet.commons.tools.utils.PidUtils; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.entity.LingshanSpecialCrowdDetailBaseEntity; +import com.epmet.entity.LingshanSpecialCrowdPersonEntity; +import com.epmet.entity.LingshanSpecialCrowdPersonTypeEntity; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.LingShanSpecialCrowdDetailBaseExcelData; +import com.epmet.service.LingShanSpecialCrowdService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 灵山大屏-抽象的导入excel监听器 + */ +public abstract class AbstractLingShanSpecialCrowdExcelImportListener + extends AnalysisEventListener { + + /** + * @description: 分布式锁 + * @param null: + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:43 PM + */ + private DistributedLock distributedLock; + + /** + * 按批次保存,单次最大数据量 + */ + private static final Integer MAX_BATCH_SIZE = 500; + + /** + * 表头应有行数 + */ + private Integer maxHeadRowNum; + + /** + * 文件的表头中应当有哪些列 + */ + private List headerZhList; + + /** + * 当前表头读到了第几行 + */ + private Integer currentHeadRowNum = 0; + + /** + * 原始数据列表 + */ + private List originDatas = new ArrayList<>(); + + /** + * 错误数据列表 + */ + private List errorDatas = new ArrayList<>(); + + /** + * 正确数据 + */ + private List correctDatas = new ArrayList<>(); + + private List persons = new ArrayList<>(); + private List personTypes = new ArrayList<>(); + + protected LingShanSpecialCrowdService lingShanSpecialCrowdService; + + private Class entityClass; + + private CustomerStaffInfoCacheResult currentStaffInfo; + + private LingShanSpecialCrowdTypeEnums specialCrowdType; + + public AbstractLingShanSpecialCrowdExcelImportListener() { + lingShanSpecialCrowdService = SpringContextUtils.getBean(LingShanSpecialCrowdService.class); + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + currentStaffInfo = CustomerStaffRedis.getStaffInfo(EpmetRequestHolder.getLoginUserCustomerId(), EpmetRequestHolder.getLoginUserId()); + maxHeadRowNum = setMaxHeadRowNum(); + headerZhList = setHeaderZhList(); + specialCrowdType = getSpecialCrowdType(); + entityClass = getEntityClass(); + } + + /** + * @param headMap: + * @param context: + * @return + * @description: 表头回调函数,此处做统一表头校验,确认文件内容与当前要导入的数据的字段一致,防止导错类型. + * @author: WangXianZhang + * @date: 2023/4/18 10:42 AM + */ + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + // super.invokeHeadMap(headMap, context); + + if (maxHeadRowNum == null || CollectionUtils.isEmpty(headerZhList)) { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, "【灵山街道】社会维稳数据导入-子类未设置header行数以及header字段列表。"); + } + + if ((++currentHeadRowNum).equals(maxHeadRowNum)) { + // 如果是表头最后一行,则校验表头 + + Collection headersFromFile = headMap.values(); + // 2次循环,双向校验 + for (String headerZh : headersFromFile) { + if (StringUtils.isNotBlank(headerZh) && !headerZhList.contains(headerZh)) { + throw new EpmetException("请确认表头内容与模板一致"); + } + } + + for (String headerZh : headerZhList) { + if (StringUtils.isNotBlank(headerZh) && !headersFromFile.contains(headerZh)) { + throw new EpmetException("请确认表头内容与模板一致"); + } + } + } + } + + /** + * @description: 行读取回调函数 + * @param row: + * @param context: + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:44 PM + */ + @Override + public void invoke(T row, AnalysisContext context) { + try { + ValidatorUtils.validateEntity(row); + } catch ( + ValidateException e) { + // 加入到错误记录中去 + errorDatas.add(row); + return; + } + + originDatas.add(row); + + if (originDatas.size() >= MAX_BATCH_SIZE) { + // 满足了一批次的数量,执行保存 + saveBatchWithLock(); + clear(); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + if (originDatas.size() > 0) { + saveBatchWithLock(); + clear(); + } + } + + /** + * @param : + * @return + * @description: 批量保存,带锁的。因为要在Listener中过滤出哪些数据不能导入,返回给前端。 + * 所以需要再lisener中做批量检查,然后批量保存。过程需要一点时间,为了防止并发问题,加分布式锁。以agencyId为粒度。 + * @author: WangXianZhang + * @date: 2023/4/18 4:33 PM + */ + private void saveBatchWithLock() { + String customerId = EpmetRequestHolder.getLoginUserCustomerId(); + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(customerId, EpmetRequestHolder.getLoginUserId()); + RLock lock = distributedLock.getLock(String.format("{}:{}:{}", "lock:specialcrowd", customerId, staffInfo.getAgencyId())); + try { + this.saveBatch(); + } catch (Exception e) { + throw e; + } finally { + if (lock != null && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + /** + * @param : + * @return + * @description: 批量保存 + * @author: WangXianZhang + * @date: 2023/4/18 3:42 PM + */ + protected void saveBatch() { + String orgIdPath = PidUtils.convertPid2OrgIdPath(currentStaffInfo.getFromOrgId(), currentStaffInfo.getAgencyPIds()); + String customerId = EpmetRequestHolder.getLoginUserCustomerId(); + Date now = new Date(); + Iterator it = getOriginDatas().iterator(); + for (; it.hasNext(); ) { + T row = it.next(); + String errorInfo = lingShanSpecialCrowdService.validate(row); + if (StringUtils.isNotBlank(errorInfo)) { + row.setErrorInfo(errorInfo); + errorDatas.add(row); + it.remove(); + } else { + persons.add(new LingshanSpecialCrowdPersonEntity(IdWorker.getIdStr(), customerId, orgIdPath, row.getName(), row.getIdCard(), + "0", 0, now, currentStaffInfo.getStaffId(), now, currentStaffInfo.getStaffId())); + personTypes.add(new LingshanSpecialCrowdPersonTypeEntity(IdWorker.getIdStr(), customerId, orgIdPath, row.getIdCard(), specialCrowdType.getType(), + "0", 0, now, currentStaffInfo.getStaffId(), now, currentStaffInfo.getStaffId())); + + E e = ConvertUtils.sourceToTarget(row, entityClass); + e.setCustomerId(customerId); + e.setOrgIdPath(orgIdPath); + e.setId(IdWorker.getIdStr()); + e.setRevision(0); + e.setCreatedTime(now); + e.setUpdatedTime(now); + e.setCreatedBy(currentStaffInfo.getStaffId()); + e.setUpdatedBy(currentStaffInfo.getStaffId()); + e.setDelFlag("0"); + correctDatas.add(e); + } + } + + // 执行保存 + if(!CollectionUtils.isEmpty(persons) && !CollectionUtils.isEmpty(personTypes)) { + savePersonAndTypes(persons, personTypes); + } + + // 将错误的数据处理 todo + + // 保存人群详情数据 + saveBatchCallback(correctDatas); + } + + /** + * @description: 保存人员信息,人员类型 + * @param persons: + * @param personTypes: + * @return + * @author: WangXianZhang + * @date: 2023/4/19 11:06 AM + */ + private void savePersonAndTypes(List persons, List personTypes) { + lingShanSpecialCrowdService.savePersonAndTypes(persons, personTypes); + } + + /** + * @param : + * @return + * @description: 清理数据 + * @author: WangXianZhang + * @date: 2023/4/18 4:41 PM + */ + protected void clear() { + originDatas.clear(); + errorDatas.clear(); + } + + /** + * @description: 获取读取到的原始数据 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:21 PM + */ + protected List getOriginDatas() { + return originDatas; + } + + /** + * @description: 获取错误数据行 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:22 PM + */ + protected List getErrorDatas() { + return errorDatas; + } + + /** + * @description: 获取正确数据行 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:22 PM + */ + protected List getCorrectDatas() { + return correctDatas; + } + + /** + * @param : + * @return + * @description: 批量保存,子类实现 + * @author: WangXianZhang + * @date: 2023/4/18 4:32 PM + */ + abstract void saveBatchCallback(List entities); + + /** + * @description: 设置表头行数 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:22 PM + */ + abstract Integer setMaxHeadRowNum(); + + /** + * @description: 设置header字段列表。子类应当调用该方法设置该值 + * @return + * @author: WangXianZhang + * @date: 2023/4/18 11:21 PM + */ + abstract List setHeaderZhList(); + + /** + * @description: 获取entity的class,用于数据拷贝 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/19 9:47 AM + */ + abstract Class getEntityClass(); + + /** + * @description: 指定特殊人群类型 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/19 11:00 AM + */ + abstract LingShanSpecialCrowdTypeEnums getSpecialCrowdType(); + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java new file mode 100644 index 0000000000..6be9cba8b4 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java @@ -0,0 +1,49 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.epmet.commons.tools.exception.ValidateException; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.entity.LingshanSpecialCrowdDetailAzbjEntity; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.LingShanSpecialCrowdDetailAzbjExcelData; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; + +import java.io.File; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +/** + * 灵山-安置帮教导入 + */ +public class LingShanSpecialCrowdAzbjExcelImportListener + extends AbstractLingShanSpecialCrowdExcelImportListener { + + @Override + Integer setMaxHeadRowNum() { + return 1; + } + + @Override + List setHeaderZhList() { + return Arrays.asList("*姓名", "*身份证号", "*原罪名", "*释放日期", "原判刑期(单位:月)", "是否累犯", "是否安置", "安置日期", "安置帮教情况", "是否注销", "注销原因"); + } + + @Override + Class getEntityClass() { + return LingshanSpecialCrowdDetailAzbjEntity.class; + } + + @Override + void saveBatchCallback(List entities) { + lingShanSpecialCrowdService.saveBatch(entities, new LingshanSpecialCrowdDetailAzbjEntity()); + } + + @Override + LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { + return LingShanSpecialCrowdTypeEnums.AZBJ; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java new file mode 100644 index 0000000000..98038505a6 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java @@ -0,0 +1,45 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.epmet.entity.LingshanSpecialCrowdDetailAzbjEntity; +import com.epmet.entity.LingshanSpecialCrowdDetailJdryEntity; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.LingshanSpecialCrowdDetailJdryExcelData; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 灵山-戒毒导入 + */ +public class LingShanSpecialCrowdJieduExcelImportListener + extends AbstractLingShanSpecialCrowdExcelImportListener { + + @Override + Integer setMaxHeadRowNum() { + return 1; + } + + @Override + List setHeaderZhList() { + return Arrays.asList("*姓名", "*身份证号", "*有无犯罪史", "*有无复吸史", "初次发现日期", "管控人姓名", "管控人联系方式", "帮扶人姓名", "帮扶人联系方式", "是否脱管", "脱管原因"); + } + + @Override + Class getEntityClass() { + return LingshanSpecialCrowdDetailJdryEntity.class; + } + + @Override + void saveBatchCallback(List entities) { + lingShanSpecialCrowdService.saveBatch(entities, new LingshanSpecialCrowdDetailJdryEntity()); + } + + @Override + LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { + return LingShanSpecialCrowdTypeEnums.JDRY; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java new file mode 100644 index 0000000000..6ea1034872 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java @@ -0,0 +1,46 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.epmet.entity.LingshanSpecialCrowdDetailJdryEntity; +import com.epmet.entity.LingshanSpecialCrowdDetailJzhzEntity; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.LingshanSpecialCrowdDetailJzhzExcelData; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 灵山-精神障碍患者导入 + */ +public class LingShanSpecialCrowdJingZhangExcelImportListener + extends AbstractLingShanSpecialCrowdExcelImportListener { + + + @Override + void saveBatchCallback(List entities) { + lingShanSpecialCrowdService.saveBatch(entities, new LingshanSpecialCrowdDetailJzhzEntity()); + } + + @Override + Integer setMaxHeadRowNum() { + return 1; + } + + @Override + List setHeaderZhList() { + return Arrays.asList("*姓名", "*身份证号", "*有无肇事肇祸史", "*肇事肇祸次数", "目前诊断类型", "危险性评估等级", "是否具备外出能力", "是否有暴力倾向", "是否落实监管补助", "是否纳入低保", "监护人姓名", "监护人联系方式"); + } + + @Override + Class getEntityClass() { + return LingshanSpecialCrowdDetailJzhzEntity.class; + } + + @Override + LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { + return LingShanSpecialCrowdTypeEnums.JZHZ; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java new file mode 100644 index 0000000000..d347b131d4 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java @@ -0,0 +1,45 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.epmet.dao.LingshanSpecialCrowdDetailSqjzDao; +import com.epmet.entity.LingshanSpecialCrowdDetailJzhzEntity; +import com.epmet.entity.LingshanSpecialCrowdDetailSqjzEntity; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.LingshanSpecialCrowdDetailSqjzExcelData; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +/** + * 灵山-矫正人员导入 + */ +public class LingShanSpecialCrowdSqjzExcelImportListener + extends AbstractLingShanSpecialCrowdExcelImportListener { + + @Override + void saveBatchCallback(List entities) { + lingShanSpecialCrowdService.saveBatch(entities, new LingshanSpecialCrowdDetailSqjzEntity()); + } + + @Override + Integer setMaxHeadRowNum() { + return 1; + } + + @Override + List setHeaderZhList() { + return Arrays.asList("*姓名", "*身份证号", "*矫正类型", "矫正开始日期", "矫正结束日期", "原羁押场所", "原罪名", "接受方式", "矫正情况说明", "是否脱管", "脱管原因", "是否注销", "注销原因"); + } + + @Override + Class getEntityClass() { + return LingshanSpecialCrowdDetailSqjzEntity.class; + } + + @Override + LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { + return LingShanSpecialCrowdTypeEnums.SQJZ; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java new file mode 100644 index 0000000000..062c7bff64 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java @@ -0,0 +1,46 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.epmet.entity.LingshanSpecialCrowdDetailJzhzEntity; +import com.epmet.entity.LingshanSpecialCrowdDetailXfryEntity; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.LingshanSpecialCrowdDetailXfryExcelData; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 灵山-信访人员导入 + */ +public class LingShanSpecialCrowdXinFangExcelImportListener + extends AbstractLingShanSpecialCrowdExcelImportListener { + + + @Override + void saveBatchCallback(List entities) { + lingShanSpecialCrowdService.saveBatch(entities, new LingshanSpecialCrowdDetailXfryEntity()); + } + + @Override + Integer setMaxHeadRowNum() { + return 1; + } + + @Override + List setHeaderZhList() { + return Arrays.asList("*姓名", "*身份证号", "*反映问题", "*稳控措施", "是否多次上访", "是否在当地", "分管领导", "分管领导联系方式", "负责人", "负责人联系方式", "稳控人员名单"); + } + + @Override + Class getEntityClass() { + return LingshanSpecialCrowdDetailXfryEntity.class; + } + + @Override + LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { + return LingShanSpecialCrowdTypeEnums.XFRY; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java new file mode 100644 index 0000000000..bf26d89d83 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java @@ -0,0 +1,47 @@ +package com.epmet.service; + +import com.epmet.entity.*; +import com.epmet.excel.data.LingShanSpecialCrowdDetailAzbjExcelData; +import com.epmet.excel.data.LingShanSpecialCrowdDetailBaseExcelData; +import org.apache.poi.ss.formula.functions.T; + +import java.util.List; + +/** + * 灵山特殊人群service + */ +public interface LingShanSpecialCrowdService { + + /** + * @description: 导入特殊人群 + * @param crowdCategory: + * @param fileSavePath: + * @return + * @author: WangXianZhang + * @date: 2023/4/18 5:42 PM + */ + void importSpecialCrowd(String crowdCategory, String fileSavePath); + + /** + * @description: 数据校验 + * @param row: + * @returns + * @author: WangXianZhang + * @date: 2023/4/18 4:49 PM + */ + String validate(LingShanSpecialCrowdDetailBaseExcelData row); + + void savePersonAndTypes(List persons, List personTypes); + + /** + * @description: 安置帮教-导入 + * @return + * @author: WangXianZhang + * @date: 2023/4/18 4:11 PM + */ + void saveBatch(List entities, LingshanSpecialCrowdDetailAzbjEntity e); + void saveBatch(List entities, LingshanSpecialCrowdDetailJdryEntity e); + void saveBatch(List entities, LingshanSpecialCrowdDetailJzhzEntity e); + void saveBatch(List entities, LingshanSpecialCrowdDetailSqjzEntity e); + void saveBatch(List entities, LingshanSpecialCrowdDetailXfryEntity e); +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java new file mode 100644 index 0000000000..3522ce8a7e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java @@ -0,0 +1,163 @@ +package com.epmet.service.impl; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.read.metadata.ReadSheet; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.utils.EpmetRequestHolder; +import com.epmet.dao.*; +import com.epmet.entity.*; +import com.epmet.enums.LingShanSpecialCrowdTypeEnums; +import com.epmet.excel.data.*; +import com.epmet.excel.handler.*; +import com.epmet.service.LingShanSpecialCrowdService; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.List; + +/** + * 灵山特殊人群service + */ +@Service +public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdService { + + @Autowired + private LingshanSpecialCrowdPersonDao specialCrowdPersonDao; + + @Autowired + private LingshanSpecialCrowdPersonTypeDao specialCrowdPersonTypeDao; + + @Autowired + private LingshanSpecialCrowdDetailAzbjDao specialCrowdDetailAzbjDao; + + @Autowired + private LingshanSpecialCrowdDetailSqjzDao specialCrowdDetailSqjzDao; + + @Autowired + private LingshanSpecialCrowdDetailJdryDao specialCrowdDetailJdryDao; + + @Autowired + private LingshanSpecialCrowdDetailJzhzDao specialCrowdDetailJzhzDao; + + @Autowired + private LingshanSpecialCrowdDetailXfryDao specialCrowdDetailXfryDao; + + @Autowired + private IcResiUserDao icResiUserDao; + + @Override + public void importSpecialCrowd(String crowdCategory, String fileSavePath) { + Class excelDataClass; + AbstractLingShanSpecialCrowdExcelImportListener listener; + LingShanSpecialCrowdTypeEnums specialCrowdTypeEnum; + + if (LingShanSpecialCrowdTypeEnums.AZBJ.getType().equals(crowdCategory)) { + listener = new LingShanSpecialCrowdAzbjExcelImportListener(); + excelDataClass = LingShanSpecialCrowdDetailAzbjExcelData.class; + specialCrowdTypeEnum = LingShanSpecialCrowdTypeEnums.AZBJ; + } else if (LingShanSpecialCrowdTypeEnums.SQJZ.getType().equals(crowdCategory)) { + listener = new LingShanSpecialCrowdSqjzExcelImportListener(); + excelDataClass = LingshanSpecialCrowdDetailSqjzExcelData.class; + specialCrowdTypeEnum = LingShanSpecialCrowdTypeEnums.SQJZ; + } else if (LingShanSpecialCrowdTypeEnums.JDRY.getType().equals(crowdCategory)) { + listener = new LingShanSpecialCrowdJieduExcelImportListener(); + excelDataClass = LingshanSpecialCrowdDetailJdryExcelData.class; + specialCrowdTypeEnum = LingShanSpecialCrowdTypeEnums.JDRY; + } else if (LingShanSpecialCrowdTypeEnums.JZHZ.getType().equals(crowdCategory)) { + listener = new LingShanSpecialCrowdJingZhangExcelImportListener(); + excelDataClass = LingshanSpecialCrowdDetailJzhzExcelData.class; + specialCrowdTypeEnum = LingShanSpecialCrowdTypeEnums.JZHZ; + } else if (LingShanSpecialCrowdTypeEnums.XFRY.getType().equals(crowdCategory)) { + listener = new LingShanSpecialCrowdXinFangExcelImportListener(); + excelDataClass = LingshanSpecialCrowdDetailXfryExcelData.class; + specialCrowdTypeEnum = LingShanSpecialCrowdTypeEnums.XFRY; + } else { + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, "【灵山街道-维稳】导入。不支持的人群类别:" + crowdCategory); + } + + // Execute reading + // ReadSheet sheet = EasyExcel.readSheet(0).registerReadListener(listener).build(); + // EasyExcel.read(fileSavePath).build().read(sheet); + + EasyExcel.read(fileSavePath, excelDataClass, listener) + .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) + .sheet(0) + .doRead(); + } + + @Override + public String validate(LingShanSpecialCrowdDetailBaseExcelData row) { + String idCard = row.getIdCard(); + String name = row.getName(); + + IcResiUserEntity resiEntity = icResiUserDao.selectResiUserEntityByIdCard(idCard, EpmetRequestHolder.getLoginUserCustomerId()); + if (resiEntity == null) { + // 居民不存在,报错 + return "居民信息不存在,请先维护居民基础信息。"; + } + if (!resiEntity.getName().equals(name)) { + return String.format("姓名信息与居民基础信息不一致。(在居民哭华总根据身份证号找到的居民姓名为:{})", name); + } + + return null; + } + + @Override + public void savePersonAndTypes(List persons, List personTypes) { + List> personParts = ListUtils.partition(persons, 50); + List> personTypeParts = ListUtils.partition(personTypes, 50); + + for (List p : personParts) { + specialCrowdPersonDao.saveOrUpdateManually(p); + } + for (List p : personTypeParts) { + specialCrowdPersonTypeDao.saveOrUpdateManually(p); + } + } + + @Override + public void saveBatch(List entities, LingshanSpecialCrowdDetailAzbjEntity e) { + List> partition = ListUtils.partition(entities, 50); + for (List l : partition) { + specialCrowdDetailAzbjDao.saveBatchManually(l); + } + } + + @Override + public void saveBatch(List entities, LingshanSpecialCrowdDetailJdryEntity e) { + List> partition = ListUtils.partition(entities, 50); + for (List l : partition) { + specialCrowdDetailJdryDao.saveBatchManually(l); + } + } + + @Override + public void saveBatch(List entities, LingshanSpecialCrowdDetailJzhzEntity e) { + List> partition = ListUtils.partition(entities, 50); + for (List l : partition) { + specialCrowdDetailJzhzDao.saveBatchManually(l); + } + } + + @Override + public void saveBatch(List entities, LingshanSpecialCrowdDetailSqjzEntity e) { + List> partition = ListUtils.partition(entities, 50); + for (List l : partition) { + specialCrowdDetailSqjzDao.saveBatchManually(l); + } + } + + @Override + public void saveBatch(List entities, LingshanSpecialCrowdDetailXfryEntity e) { + List> partition = ListUtils.partition(entities, 50); + for (List l : partition) { + specialCrowdDetailXfryDao.saveBatchManually(l); + } + } +} diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailAzbjDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailAzbjDao.xml new file mode 100644 index 0000000000..60a3bb3c17 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailAzbjDao.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into lingshan_special_crowd_detail_azbj ( ID, CUSTOMER_ID, ORG_ID_PATH, ID_CARD, ORIGINAL_CHARGE, RELEASE_DATE + , ORIGIN_PRISON_TERM, RECIDIVISM_FLAG, EMPLACEMENT_FLAG, EMPLACEMENT_DATE + , EMPLACEMENT_INFO, CANCELED_FLAG, CANCELED_REASON, DEL_FLAG, REVISION + , CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME) + values + + ( #{item.id}, #{item.customerId}, #{item.orgIdPath}, #{item.idCard}, #{item.originalCharge}, + #{item.releaseDate},#{item.originPrisonTerm},#{item.recidivismFlag},#{item.emplacementFlag}, + #{item.emplacementDate}, #{item.emplacementInfo}, #{item.canceledFlag}, #{item.canceledReason}, #{item.delFlag}, + #{item.revision}, #{item.createdBy}, #{item.createdTime}, #{item.updatedBy}, #{item.updatedTime} + ) + + on duplicate key update ORG_ID_PATH = values(ORG_ID_PATH) + , ID_CARD = values(ID_CARD) + , ORIGINAL_CHARGE = values(ORIGINAL_CHARGE) + , RELEASE_DATE = values(RELEASE_DATE) + , ORIGIN_PRISON_TERM = values(ORIGIN_PRISON_TERM) + , RECIDIVISM_FLAG = values(RECIDIVISM_FLAG) + , EMPLACEMENT_FLAG = values(EMPLACEMENT_FLAG) + , EMPLACEMENT_DATE = values(EMPLACEMENT_DATE) + , EMPLACEMENT_INFO = values(EMPLACEMENT_INFO) + , CANCELED_FLAG = values(CANCELED_FLAG) + , CANCELED_REASON = values(CANCELED_REASON) + , UPDATED_BY = values(UPDATED_BY) + , UPDATED_TIME = values(UPDATED_TIME) + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJdryDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJdryDao.xml new file mode 100644 index 0000000000..efdc2079e7 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJdryDao.xml @@ -0,0 +1,36 @@ + + + + + + insert into lingshan_special_crowd_detail_jdry ( ID, CUSTOMER_ID, ORG_ID_PATH, ID_CARD, CRIMINAL_HISTORY_FLAG + , DRUG_REPETITION_FLAG, FIRST_DISCOVERY_DATE, CONTROLLER_NAME + , CONTROLLER_CONTACT, HELPER_NAME, HELPER_CONTACT, DETACHED_FLAG + , DETACHED_REASON, DEL_FLAG, REVISION, CREATED_BY, CREATED_TIME + , UPDATED_BY, UPDATED_TIME) + values + + (#{item.id}, #{item.customerId}, #{item.orgIdPath}, #{item.idCard}, #{item.criminalHistoryFlag}, + #{item.drugRepetitionFlag}, #{item.firstDiscoveryDate}, #{item.controllerName}, #{item.controllerContact}, #{item.helperName}, + #{item.helperContact}, #{item.detachedFlag}, #{item.detachedReason}, #{item.delFlag}, #{item.revision}, + #{item.createdBy}, #{item.createdTime}, #{item.updatedBy}, #{item.updatedTime}) + + on duplicate key update + ORG_ID_PATH = values(ORG_ID_PATH), + CRIMINAL_HISTORY_FLAG = values(CRIMINAL_HISTORY_FLAG), + DRUG_REPETITION_FLAG = values(DRUG_REPETITION_FLAG), + FIRST_DISCOVERY_DATE = values(FIRST_DISCOVERY_DATE), + CONTROLLER_NAME = values(CONTROLLER_NAME), + CONTROLLER_CONTACT = values(CONTROLLER_CONTACT), + HELPER_NAME = values(HELPER_NAME), + HELPER_CONTACT = values(HELPER_CONTACT), + DETACHED_FLAG = values(DETACHED_FLAG), + DETACHED_REASON = values(DETACHED_REASON), + DEL_FLAG = values(DEL_FLAG), + REVISION = values(REVISION), + UPDATED_BY = values(UPDATED_BY), + UPDATED_TIME = values(UPDATED_TIME) + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJzhzDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJzhzDao.xml new file mode 100644 index 0000000000..e750b74a6c --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailJzhzDao.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into lingshan_special_crowd_detail_jzhz ( ID, CUSTOMER_ID, ORG_ID_PATH, ID_CARD, CAUSE_TROUBLE_HISTORY_FLAG + , CAUSE_TROUBLE_TIMES, CURRENT_DIAGNOSIS, DANGEROUS_CLASS + , CAN_GO_OUT_FLAG, VIOLENCE_FLAG, ALLOWANCE_FLAG, SUBSISTENCE_FLAG + , GUARDIAN_NAME, GUARDIAN_CONTACT, DEL_FLAG, REVISION, CREATED_BY + , CREATED_TIME, UPDATED_BY, UPDATED_TIME) + values + + (#{item.id}, #{item.customerId}, #{item.orgIdPath}, #{item.idCard}, #{item.causeTroubleHistoryFlag}, + #{item.causeTroubleTimes}, #{item.currentDiagnosis}, #{item.dangerousClass}, #{item.canGoOutFlag}, #{item.violenceFlag}, + #{item.allowanceFlag}, #{item.subsistenceFlag}, #{item.guardianName}, #{item.guardianContact}, #{item.delFlag}, + #{item.revision}, #{item.createdBy}, #{item.createdTime}, #{item.updatedBy}, #{item.updatedTime} + ) + + on duplicate key update ORG_ID_PATH = values(ORG_ID_PATH) + , ID_CARD = values(ID_CARD) + , CAUSE_TROUBLE_HISTORY_FLAG = values(CAUSE_TROUBLE_HISTORY_FLAG) + , CAUSE_TROUBLE_TIMES = values(CAUSE_TROUBLE_TIMES) + , CURRENT_DIAGNOSIS = values(CURRENT_DIAGNOSIS) + , DANGEROUS_CLASS = values(DANGEROUS_CLASS) + , CAN_GO_OUT_FLAG = values(CAN_GO_OUT_FLAG) + , VIOLENCE_FLAG = values(VIOLENCE_FLAG) + , ALLOWANCE_FLAG = values(ALLOWANCE_FLAG) + , SUBSISTENCE_FLAG = values(SUBSISTENCE_FLAG) + , GUARDIAN_NAME = values(GUARDIAN_NAME) + , GUARDIAN_CONTACT = values(GUARDIAN_CONTACT) + , UPDATED_BY = values(UPDATED_BY) + , UPDATED_TIME = values(UPDATED_TIME) + + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailSqjzDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailSqjzDao.xml new file mode 100644 index 0000000000..fd26ee7938 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailSqjzDao.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into lingshan_special_crowd_detail_sqjz ( ID, CUSTOMER_ID, ORG_ID_PATH, ID_CARD, RECTIFICATE_TYPE + , RECTIFICATE_START_DATE, RECTIFICATE_END_DATE, ORIGIN_DETAIN_ADDRESS + , ORIGINAL_CHARGE, RECEIVE_WAY, RECTIFICATE_INFO, DETACHED_FLAG + , DETACHED_REASON, CANCELED_FLAG, CANCELED_REASON, DEL_FLAG, REVISION + , CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME) + values + + (#{item.id}, #{item.customerId}, #{item.orgIdPath}, #{item.idCard}, #{item.rectificateType}, + #{item.rectificateStartDate}, #{item.rectificateEndDate}, #{item.originDetainAddress}, #{item.originalCharge}, #{item.receiveWay}, + #{item.rectificateInfo}, #{item.detachedFlag}, #{item.detachedReason}, #{item.canceledFlag}, #{item.canceledReason}, + #{item.delFlag}, #{item.revision}, #{item.createdBy}, #{item.createdTime}, #{item.updatedBy}, + #{item.updatedTime}) + + on duplicate key update + ORG_ID_PATH = values(ORG_ID_PATH) + , RECTIFICATE_TYPE = values(RECTIFICATE_TYPE) + , RECTIFICATE_START_DATE = values(RECTIFICATE_START_DATE) + , RECTIFICATE_END_DATE = values(RECTIFICATE_END_DATE) + , ORIGIN_DETAIN_ADDRESS = values(ORIGIN_DETAIN_ADDRESS) + , ORIGINAL_CHARGE = values(ORIGINAL_CHARGE), RECEIVE_WAY = values(RECEIVE_WAY) + , RECTIFICATE_INFO = values(RECTIFICATE_INFO), DETACHED_FLAG = values(DETACHED_FLAG) + , DETACHED_REASON = values(DETACHED_REASON), CANCELED_FLAG = values(CANCELED_FLAG) + , CANCELED_REASON = values(CANCELED_REASON) + , UPDATED_BY = values(UPDATED_BY), + , UPDATED_TIME = values(UPDATED_TIME) + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml new file mode 100644 index 0000000000..149129d3ec --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into lingshan_special_crowd_detail_xfry ( ID, CUSTOMER_ID, ORG_ID_PATH, ID_CARD, PROBLEM + , STABLE_CONTROL_MEASUREMENT, MULTIPLE_FLAG, LOCAL_FLAG, BRANCH_LEADER + , BRANCH_LEADER_CONTACT, PRINCIPAL, PRINCIPAL_CONTACT + , STABLE_CONTROLER_LIST, DEL_FLAG, REVISION, CREATED_BY, CREATED_TIME + , UPDATED_BY, UPDATED_TIME) + values + + (#{item.id}, #{item.customerId}, #{item.orgIdPath}, #{item.idCard}, #{item.problem}, + #{item.stableControlMeasurement}, #{item.multipleFlag}, #{item.localFlag}, #{item.branchLeader}, #{item.branchLeaderContact}, + #{item.principal}, #{item.principalContact}, #{item.stableControlerList}, #{item.delFlag}, #{item.revision}, + #{item.createdBy}, #{item.createdTime}, #{item.updatedBy}, #{item.updatedTime}) + + on duplicate key update + ORG_ID_PATH = values (ORG_ID_PATH) + , PROBLEM = values(PROBLEM) + , STABLE_CONTROL_MEASUREMENT = values(STABLE_CONTROL_MEASUREMENT) + , MULTIPLE_FLAG = values(MULTIPLE_FLAG) + , LOCAL_FLAG = values(LOCAL_FLAG) + , BRANCH_LEADER = values(BRANCH_LEADER) + , BRANCH_LEADER_CONTACT = values(BRANCH_LEADER_CONTACT) + , PRINCIPAL = values(PRINCIPAL) + , PRINCIPAL_CONTACT = values(PRINCIPAL_CONTACT) + , STABLE_CONTROLER_LIST = values(STABLE_CONTROLER_LIST) + , DEL_FLAG = values(DEL_FLAG) + , REVISION = values(REVISION), CREATED_BY = values(CREATED_BY) + , CREATED_TIME = values(CREATED_TIME) + , UPDATED_BY = values(UPDATED_BY) + , UPDATED_TIME = values(UPDATED_TIME) + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonDao.xml new file mode 100644 index 0000000000..bdf6bfb32b --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonDao.xml @@ -0,0 +1,45 @@ + + + + + + + + + + insert into lingshan_special_crowd_person ( ID, CUSTOMER_ID, ORG_ID_PATH, `NAME`, ID_CARD, + DEL_FLAG, REVISION, CREATED_BY , CREATED_TIME, UPDATED_BY, UPDATED_TIME) + values + + ( #{item.id}, + #{item.customerId}, + #{item.orgIdPath}, + #{item.name}, + #{item.idCard}, + #{item.delFlag}, + #{item.revision}, + #{item.createdBy}, + #{item.createdTime}, + #{item.updatedBy}, + #{item.updatedTime} + ) + + on duplicate key update NAME=values(name) + , UPDATED_BY=values(UPDATED_BY) + , UPDATED_TIME=values(UPDATED_TIME) + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonTypeDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonTypeDao.xml new file mode 100644 index 0000000000..1fc8a8b92b --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdPersonTypeDao.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + insert into lingshan_special_crowd_person_type ( ID, CUSTOMER_ID, ORG_ID_PATH, ID_CARD, SPECIAL_TYPE, + DEL_FLAG, REVISION, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME) + values + + (#{type.id}, #{type.customerId}, #{type.orgIdPath}, #{type.idCard}, #{type.specialType}, + #{type.delFlag}, #{type.revision}, #{type.createdBy}, #{type.createdTime}, #{type.updatedBy}, #{type.updatedTime}) + + on duplicate key update + ORG_ID_PATH=values(ORG_ID_PATH) + , SPECIAL_TYPE =values(SPECIAL_TYPE) + , UPDATED_BY =values(UPDATED_BY) + , UPDATED_TIME = values(UPDATED_TIME) + + + + \ No newline at end of file From 23295fd158422ef3b8c7cc203d27381d29eb9451 Mon Sep 17 00:00:00 2001 From: wxz Date: Wed, 19 Apr 2023 18:42:06 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E3=80=90=E7=81=B5=E5=B1=B1=E8=A1=97?= =?UTF-8?q?=E9=81=93=E3=80=911.=E5=AF=BC=E5=85=A5=E6=8E=A5=E5=8F=A3,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A1=A8=E5=A4=B4=E9=A2=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LingShanSpecialCrowdController.java | 2 +- ...ngShanSpecialCrowdExcelImportListener.java | 44 ++++++++++++++++++- .../ReadExcelHeaderOnlyException.java | 7 +++ .../impl/LingShanSpecialCrowdServiceImpl.java | 32 ++++++++++++-- .../LingshanSpecialCrowdDetailXfryDao.xml | 3 +- 5 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/exceptions/ReadExcelHeaderOnlyException.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java index aa21a72797..bfd157573f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java @@ -67,7 +67,7 @@ public class LingShanSpecialCrowdController { deleteSpecialCrowdTempFile(fileSavePath); } - return null; + return new Result(); } /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java index e86d714d11..f82271ff08 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java @@ -1,5 +1,6 @@ package com.epmet.excel.handler; +import cn.hutool.log.Log; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.metadata.data.ReadCellData; @@ -23,7 +24,10 @@ import com.epmet.entity.LingshanSpecialCrowdPersonEntity; import com.epmet.entity.LingshanSpecialCrowdPersonTypeEntity; import com.epmet.enums.LingShanSpecialCrowdTypeEnums; import com.epmet.excel.data.LingShanSpecialCrowdDetailBaseExcelData; +import com.epmet.exceptions.ReadExcelHeaderOnlyException; import com.epmet.service.LingShanSpecialCrowdService; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; @@ -35,6 +39,8 @@ import java.util.stream.Collectors; /** * 灵山大屏-抽象的导入excel监听器 */ +@Data +@Slf4j public abstract class AbstractLingShanSpecialCrowdExcelImportListener extends AnalysisEventListener { @@ -62,6 +68,15 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener headerZhList; + /** + * @description: 是否只校验表头 + * @param null: + * @return + * @author: WangXianZhang + * @date: 2023/4/19 5:16 PM + */ + private Boolean validateHeaderOnly = false; + /** * 当前表头读到了第几行 */ @@ -121,20 +136,37 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener redundentHeaders = new ArrayList<>(); + List lackHeaders = new ArrayList<>(); Collection headersFromFile = headMap.values(); // 2次循环,双向校验 for (String headerZh : headersFromFile) { if (StringUtils.isNotBlank(headerZh) && !headerZhList.contains(headerZh)) { - throw new EpmetException("请确认表头内容与模板一致"); + redundentHeaders.add(headerZh); } } for (String headerZh : headerZhList) { if (StringUtils.isNotBlank(headerZh) && !headersFromFile.contains(headerZh)) { - throw new EpmetException("请确认表头内容与模板一致"); + lackHeaders.add(headerZh); } } + + // 汇总错误字段,成一句话 + String preValidTipStr = ""; + if (CollectionUtils.isNotEmpty(redundentHeaders)) { + preValidTipStr += "多余【" + String.join(",", redundentHeaders) + "】字段。"; + } + + if (CollectionUtils.isNotEmpty(lackHeaders)) { + preValidTipStr += "缺少【" + String.join(",", lackHeaders) + "】必填字段。"; + } + + if (StringUtils.isNotBlank(preValidTipStr)) { + log.error("【灵山街道-社会维稳导入】表格表头不对应," + preValidTipStr); + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, "上传文件有误!" + preValidTipStr + "请确认表格格式正确"); + } } } @@ -148,6 +180,10 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener 0) { saveBatchWithLock(); clear(); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/exceptions/ReadExcelHeaderOnlyException.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/exceptions/ReadExcelHeaderOnlyException.java new file mode 100644 index 0000000000..4efda39455 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/exceptions/ReadExcelHeaderOnlyException.java @@ -0,0 +1,7 @@ +package com.epmet.exceptions; + +/** + * 只解析表头的异常(用于停止excel导入) + */ +public class ReadExcelHeaderOnlyException extends RuntimeException { +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java index 3522ce8a7e..767afa43cc 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java @@ -7,23 +7,29 @@ import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.read.metadata.ReadSheet; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ValidateException; import com.epmet.commons.tools.utils.EpmetRequestHolder; import com.epmet.dao.*; import com.epmet.entity.*; import com.epmet.enums.LingShanSpecialCrowdTypeEnums; import com.epmet.excel.data.*; import com.epmet.excel.handler.*; +import com.epmet.exceptions.ReadExcelHeaderOnlyException; import com.epmet.service.LingShanSpecialCrowdService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; /** * 灵山特殊人群service */ +@Slf4j @Service public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdService { @@ -51,6 +57,9 @@ public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdServ @Autowired private IcResiUserDao icResiUserDao; + @Autowired + private ExecutorService executorService; + @Override public void importSpecialCrowd(String crowdCategory, String fileSavePath) { Class excelDataClass; @@ -85,10 +94,25 @@ public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdServ // ReadSheet sheet = EasyExcel.readSheet(0).registerReadListener(listener).build(); // EasyExcel.read(fileSavePath).build().read(sheet); - EasyExcel.read(fileSavePath, excelDataClass, listener) - .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) - .sheet(0) - .doRead(); + // 解析表头,判断表头是否合格 + try { + listener.setValidateHeaderOnly(true); + EasyExcel.read(fileSavePath, excelDataClass, listener) + .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) + .sheet(0) + .doRead(); + } catch (ReadExcelHeaderOnlyException e) { + log.info("【灵山街道-导入社会维稳】验证通过,可以继续导入"); + } + + // 正式开始导入。异步导入 + listener.setValidateHeaderOnly(false); + CompletableFuture.runAsync(() -> { + EasyExcel.read(fileSavePath, excelDataClass, listener) + .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) + .sheet(0) + .doRead(); + }, executorService); } @Override diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml index 149129d3ec..8258af9767 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/LingshanSpecialCrowdDetailXfryDao.xml @@ -51,8 +51,7 @@ , PRINCIPAL_CONTACT = values(PRINCIPAL_CONTACT) , STABLE_CONTROLER_LIST = values(STABLE_CONTROLER_LIST) , DEL_FLAG = values(DEL_FLAG) - , REVISION = values(REVISION), CREATED_BY = values(CREATED_BY) - , CREATED_TIME = values(CREATED_TIME) + , REVISION = values(REVISION) , UPDATED_BY = values(UPDATED_BY) , UPDATED_TIME = values(UPDATED_TIME) From bee92b0ce859cb75731281c810d9bd41dd053329 Mon Sep 17 00:00:00 2001 From: wxz Date: Thu, 20 Apr 2023 09:38:51 +0800 Subject: [PATCH 7/7] 1 --- .../commons/tools/enums/BizTypeEnum.java | 1 + .../LingShanSpecialCrowdController.java | 11 +- ...ngShanSpecialCrowdExcelImportListener.java | 16 ++- ...anSpecialCrowdAzbjExcelImportListener.java | 5 + ...nSpecialCrowdJieduExcelImportListener.java | 5 + ...cialCrowdJingZhangExcelImportListener.java | 5 + ...anSpecialCrowdSqjzExcelImportListener.java | 5 + ...pecialCrowdXinFangExcelImportListener.java | 5 + .../service/LingShanSpecialCrowdService.java | 2 +- .../impl/LingShanSpecialCrowdServiceImpl.java | 106 +++++++++++++++++- .../lingshan_special_crowd_azbj_export.xlsx | Bin 0 -> 9634 bytes .../lingshan_special_crowd_jdry_export.xlsx | Bin 0 -> 9620 bytes .../lingshan_special_crowd_jzhz_export.xlsx | Bin 0 -> 10016 bytes .../lingshan_special_crowd_sqjz_export.xlsx | Bin 0 -> 9933 bytes .../lingshan_special_crowd_xfry_export.xlsx | Bin 0 -> 9439 bytes 15 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_azbj_export.xlsx create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jdry_export.xlsx create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jzhz_export.xlsx create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_sqjz_export.xlsx create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_xfry_export.xlsx diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java index e6318f61b6..517330e427 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java @@ -19,6 +19,7 @@ public enum BizTypeEnum { GRID_PROJECT("grid_project", "网格项目"), PROJECT("project", "项目"), ARTICLE("article", "文章(党建声音)"), + SPECIAL_CROWD("special_crowd", "社会维稳(特殊人群)"), ; public static BizTypeEnum getEnum(String code) { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java index bfd157573f..1d99dbce93 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java @@ -53,12 +53,15 @@ public class LingShanSpecialCrowdController { @PostMapping("import") public Result importSpecialCowd(MultipartFile file, @RequestParam("crowdCategory") String crowdCategory) { + String originalFilename = file.getOriginalFilename(); + String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); + // 1.存文件 - Path fileSavePath = saveSpecialCrowdTempFile(file); + Path fileSavePath = saveSpecialCrowdTempFile(file, suffix); // 2.执行业务导入 try { - lingShanSpecialCrowdService.importSpecialCrowd(crowdCategory, fileSavePath.toString()); + lingShanSpecialCrowdService.importSpecialCrowd(crowdCategory, fileSavePath.toString(), originalFilename); } catch (Exception e) { throw e; // ... @@ -77,12 +80,12 @@ public class LingShanSpecialCrowdController { * @author: WangXianZhang * @date: 2023/4/18 9:46 AM */ - public Path saveSpecialCrowdTempFile(@RequestParam("file") MultipartFile file) { + public Path saveSpecialCrowdTempFile(@RequestParam("file") MultipartFile file, String suffix) { Path fileSavePath; FileOutputStream os = null; try { Path fileSaveDir = FileUtils.getAndCreateDirUnderEpmetFilesDir("special_crowd_import"); - String fileName = DateUtils.format(new Date(), "yyyyMMdd_HHmmss_" + System.nanoTime()); + String fileName = DateUtils.format(new Date(), "yyyyMMdd_HHmmss_" + System.nanoTime()) + suffix; fileSavePath = fileSaveDir.resolve(fileName); IOUtils.copy(file.getInputStream(), (os = new FileOutputStream(fileSavePath.toString()))); return fileSavePath; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java index f82271ff08..72bea84f54 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java @@ -58,6 +58,8 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener getErrorDatas() { + public List getErrorDatas() { return errorDatas; } @@ -370,6 +371,15 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener setHeaderZhList(); + /** + * @description: 设置模板名称 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/20 9:07 AM + */ + abstract String setTemplateFileName(); + /** * @description: 获取entity的class,用于数据拷贝 * @param : diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java index 6be9cba8b4..117d5c833b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java @@ -46,4 +46,9 @@ public class LingShanSpecialCrowdAzbjExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.AZBJ; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_azbj_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java index 98038505a6..6ab49e11a7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java @@ -42,4 +42,9 @@ public class LingShanSpecialCrowdJieduExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.JDRY; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_jdry_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java index 6ea1034872..236811340a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java @@ -43,4 +43,9 @@ public class LingShanSpecialCrowdJingZhangExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.JZHZ; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_jzhz_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java index d347b131d4..2d25a7652b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java @@ -42,4 +42,9 @@ public class LingShanSpecialCrowdSqjzExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.SQJZ; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_sqjz_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java index 062c7bff64..ac1557245e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java @@ -43,4 +43,9 @@ public class LingShanSpecialCrowdXinFangExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.XFRY; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_xfry_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java index bf26d89d83..5ad0abd666 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java @@ -20,7 +20,7 @@ public interface LingShanSpecialCrowdService { * @author: WangXianZhang * @date: 2023/4/18 5:42 PM */ - void importSpecialCrowd(String crowdCategory, String fileSavePath); + void importSpecialCrowd(String crowdCategory, String fileSavePath, String originFilename); /** * @description: 数据校验 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java index 767afa43cc..d9ba64e551 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java @@ -1,27 +1,49 @@ package com.epmet.service.impl; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ReadConverterContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.read.metadata.ReadSheet; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.enums.BizTypeEnum; 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.utils.DateUtils; import com.epmet.commons.tools.utils.EpmetRequestHolder; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.FileUtils; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dao.*; +import com.epmet.dto.result.ImportTaskCommonResultDTO; +import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.entity.*; import com.epmet.enums.LingShanSpecialCrowdTypeEnums; import com.epmet.excel.data.*; import com.epmet.excel.handler.*; import com.epmet.exceptions.ReadExcelHeaderOnlyException; +import com.epmet.feign.OssFeignClient; import com.epmet.service.LingShanSpecialCrowdService; +import com.epmet.utils.ImportTaskUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Date; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -31,7 +53,7 @@ import java.util.concurrent.ExecutorService; */ @Slf4j @Service -public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdService { +public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdService, ResultDataResolver { @Autowired private LingshanSpecialCrowdPersonDao specialCrowdPersonDao; @@ -60,8 +82,11 @@ public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdServ @Autowired private ExecutorService executorService; + @Autowired + private OssFeignClient ossFeignClient; + @Override - public void importSpecialCrowd(String crowdCategory, String fileSavePath) { + public void importSpecialCrowd(String crowdCategory, String fileSavePath, String originFilename) { Class excelDataClass; AbstractLingShanSpecialCrowdExcelImportListener listener; LingShanSpecialCrowdTypeEnums specialCrowdTypeEnum; @@ -107,14 +132,83 @@ public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdServ // 正式开始导入。异步导入 listener.setValidateHeaderOnly(false); + CompletableFuture.runAsync(() -> { - EasyExcel.read(fileSavePath, excelDataClass, listener) - .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) - .sheet(0) - .doRead(); + // 创建导入任务 + ImportTaskCommonResultDTO importTaskRst = getResultDataOrThrowsException(ImportTaskUtils.createImportTask(originFilename, + BizTypeEnum.SPECIAL_CROWD.getType()), + ServiceConstant.EPMET_COMMON_SERVICE, + EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), + null, "【灵山街道-导入特殊人群】创建导入任务失败"); + + try { + EasyExcel.read(fileSavePath, excelDataClass, listener) + .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) + .sheet(0) + .doRead(); + + List errorDatas = listener.getErrorDatas(); + if (CollectionUtils.isNotEmpty(errorDatas)) { + // 有错误数据需要提示 + String resultDescFilePath = uploadResultDescFilePath(errorDatas, listener.getTemplateFileName()); + ImportTaskUtils.finishImportTask(importTaskRst.getTaskId(), + ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, resultDescFilePath, "失败,请导出文件查看详细信息"); + } else { + // 全部成功 + ImportTaskUtils.finishImportTask(importTaskRst.getTaskId(), + ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS, null, "成功"); + } + } catch (Exception e) { + log.error("【灵山街道-导入特殊人群】失败,错误信息:" + ExceptionUtils.getErrorStackTrace(e)); + ImportTaskUtils.finishImportTask(importTaskRst.getTaskId(), + ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, null, "未知错误"); + } }, executorService); } + /** + * @description: 上传错误描述文件 + * @param errorDatas: + * @return + * @author: WangXianZhang + * @date: 2023/4/19 10:19 PM + */ + private String uploadResultDescFilePath(List errorDatas, String templateFileName) { + FileItem fileItem = null; + try { + String fileName = + DateUtils.format(new Date(), "yyyyMMdd_HHmmss_") + System.nanoTime() + "社会维稳导入失败数据.xlsx"; + + // 创建临时文件 + fileItem = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, FileUtils.getAndCreateDirUnderEpmetFilesDir("temp").toFile()) + .createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName); + + // 写入临时文件 + try (OutputStream os = fileItem.getOutputStream()) { + ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(templateFileName).build(); + excelWriter.finish(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // 上传文件 + UploadImgResultDTO uploadRst = getResultDataOrThrowsException(ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem)), ServiceConstant.EPMET_COMMON_SERVICE, + EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), + null, "【灵山街道-导入特殊人群】上传错误描述文件失败。"); + + return uploadRst.getUrl(); + + } catch (IOException e) { + throw new RuntimeException("【灵山街道-导入特殊人群】生成错误描述文件-创建临时目录失败"); + } finally { + try { + fileItem.delete(); + } catch (Exception e) { + log.error("【灵山街道-导入特殊人群】删除fileItem临时文件失败"); + } + } + } + @Override public String validate(LingShanSpecialCrowdDetailBaseExcelData row) { String idCard = row.getIdCard(); diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_azbj_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_azbj_export.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5fc410a64e3c503c7eebeac27ac1c05f94b5096f GIT binary patch literal 9634 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 literal 0 HcmV?d00001 diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jzhz_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jzhz_export.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d055b68eb1f1e046c015a081b951702056b68282 GIT binary patch literal 10016 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 literal 0 HcmV?d00001 diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_xfry_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_xfry_export.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9eb90e825b93aec9dc83bb01d9f6d6a6cadc3f21 GIT binary patch literal 9439 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 TejZkghdVRy4|Xl&kGTH_K^azL literal 0 HcmV?d00001