From e03b7adea754852ee33583e59c0d58e79a33d5e1 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 25 Oct 2021 14:58:21 +0800 Subject: [PATCH 001/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A5=BC=E6=A0=8B=E7=AD=89=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dto/IcBuildingDTO.java | 132 +++++++++++++++++ .../java/com/epmet/dto/IcBuildingUnitDTO.java | 91 ++++++++++++ .../main/java/com/epmet/dto/IcHouseDTO.java | 136 ++++++++++++++++++ .../java/com/epmet/dto/IcNeighborHoodDTO.java | 131 +++++++++++++++++ .../com/epmet/dto/IcNeighborHoodPartDTO.java | 86 +++++++++++ .../epmet/dto/IcNeighborHoodPropertyDTO.java | 81 +++++++++++ .../epmet/dto/IcPropertyManagementDTO.java | 76 ++++++++++ .../controller/IcBuildingController.java | 85 +++++++++++ .../controller/IcBuildingUnitController.java | 87 +++++++++++ .../epmet/controller/IcHouseController.java | 85 +++++++++++ .../controller/IcNeighborHoodController.java | 87 +++++++++++ .../IcNeighborHoodPartController.java | 84 +++++++++++ .../IcNeighborHoodPropertyController.java | 85 +++++++++++ .../IcPropertyManagementController.java | 87 +++++++++++ .../java/com/epmet/dao/IcBuildingDao.java | 33 +++++ .../java/com/epmet/dao/IcBuildingUnitDao.java | 33 +++++ .../main/java/com/epmet/dao/IcHouseDao.java | 33 +++++ .../java/com/epmet/dao/IcNeighborHoodDao.java | 33 +++++ .../com/epmet/dao/IcNeighborHoodPartDao.java | 33 +++++ .../epmet/dao/IcNeighborHoodPropertyDao.java | 33 +++++ .../epmet/dao/IcPropertyManagementDao.java | 33 +++++ .../com/epmet/entity/IcBuildingEntity.java | 98 +++++++++++++ .../epmet/entity/IcBuildingUnitEntity.java | 61 ++++++++ .../java/com/epmet/entity/IcHouseEntity.java | 106 ++++++++++++++ .../epmet/entity/IcNeighborHoodEntity.java | 101 +++++++++++++ .../entity/IcNeighborHoodPartEntity.java | 56 ++++++++ .../entity/IcNeighborHoodPropertyEntity.java | 51 +++++++ .../entity/IcPropertyManagementEntity.java | 46 ++++++ .../com/epmet/service/IcBuildingService.java | 95 ++++++++++++ .../epmet/service/IcBuildingUnitService.java | 95 ++++++++++++ .../com/epmet/service/IcHouseService.java | 95 ++++++++++++ .../service/IcNeighborHoodPartService.java | 95 ++++++++++++ .../IcNeighborHoodPropertyService.java | 95 ++++++++++++ .../epmet/service/IcNeighborHoodService.java | 95 ++++++++++++ .../service/IcPropertyManagementService.java | 95 ++++++++++++ .../service/impl/IcBuildingServiceImpl.java | 101 +++++++++++++ .../impl/IcBuildingUnitServiceImpl.java | 101 +++++++++++++ .../service/impl/IcHouseServiceImpl.java | 100 +++++++++++++ .../impl/IcNeighborHoodPartServiceImpl.java | 101 +++++++++++++ .../IcNeighborHoodPropertyServiceImpl.java | 101 +++++++++++++ .../impl/IcNeighborHoodServiceImpl.java | 101 +++++++++++++ .../impl/IcPropertyManagementServiceImpl.java | 100 +++++++++++++ .../main/resources/mapper/IcBuildingDao.xml | 29 ++++ .../resources/mapper/IcBuildingUnitDao.xml | 21 +++ .../src/main/resources/mapper/IcHouseDao.xml | 30 ++++ .../resources/mapper/IcNeighborHoodDao.xml | 29 ++++ .../mapper/IcNeighborHoodPartDao.xml | 20 +++ .../mapper/IcNeighborHoodPropertyDao.xml | 19 +++ .../mapper/IcPropertyManagementDao.xml | 18 +++ 49 files changed, 3619 insertions(+) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingUnitDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcHouseDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPartDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPropertyDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcPropertyManagementDTO.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPartController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPropertyController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcPropertyManagementController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingUnitDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPartDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPropertyDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingUnitEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcHouseEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPartEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPropertyEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcPropertyManagementEntity.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPartService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPropertyService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcPropertyManagementService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPartServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPropertyServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcPropertyManagementServiceImpl.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingUnitDao.xml create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPartDao.xml create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPropertyDao.xml create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingDTO.java new file mode 100644 index 0000000000..61eba8fd2e --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingDTO.java @@ -0,0 +1,132 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 楼栋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcBuildingDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 楼栋主键 + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 片区id,neighbor_hood_part.id,可为空。 + */ + private String partId; + + /** + * 楼栋名称 + */ + private String buildingName; + + /** + * 楼栋类型,这里存储字典编码就可以 + */ + private String type; + + /** + * 排序 + */ + private Integer sort; + + /** + * 总单元数 + */ + private Integer totalUnitNum; + + /** + * 总楼层总数 + */ + private Integer totalFloorNum; + + /** + * 总户数 + */ + private Integer totalHouseNum; + + /** + * 中心点位:经度 + */ + private String longitude; + + /** + * 中心点位:纬度 + */ + private String latitude; + + /** + * 坐标位置 + */ + private String coordinatePosition; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingUnitDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingUnitDTO.java new file mode 100644 index 0000000000..3ec964009d --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcBuildingUnitDTO.java @@ -0,0 +1,91 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 楼栋单元信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcBuildingUnitDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 单元主键 + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 楼宇id + */ + private String buildingId; + + /** + * 单元号:1,2,3?? + */ + private String unitNum; + + /** + * 单元名 + */ + private String unitName; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcHouseDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcHouseDTO.java new file mode 100644 index 0000000000..2bec463b9b --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcHouseDTO.java @@ -0,0 +1,136 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 房屋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcHouseDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 房屋主键 + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 片区id,neighbor_hood_part.id,可为空。 + */ + private String partId; + + /** + * 所属楼栋id + */ + private String buildingId; + + /** + * 所属单元id + */ + private String buildingUnitId; + + /** + * 房屋名字后台插入时生成 + */ + private String houseName; + + /** + * 门牌号 + */ + private String doorName; + + /** + * 房屋类型,这里存储字典value就可以 + */ + private String houseType; + + /** + * 存储字典value + */ + private String purpose; + + /** + * 1出租;0未出租 + */ + private Integer rentFlag; + + /** + * 房主姓名 + */ + private String ownerName; + + /** + * 房主电话 + */ + private String ownerPhone; + + /** + * 房主身份证号 + */ + private String ownerIdCard; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodDTO.java new file mode 100644 index 0000000000..004c2312b4 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodDTO.java @@ -0,0 +1,131 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 小区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcNeighborHoodDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 小区主键 + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区名称 + */ + private String neighborHoodName; + + /** + * 组织id + */ + private String agencyId; + + /** + * 上级组织id + */ + private String parentAgencyId; + + /** + * 组织的所有上级组织id + */ + private String agencyPids; + + /** + * 网格id + */ + private String gridId; + + /** + * 详细地址 + */ + private String address; + + /** + * 备注 + */ + private String remark; + + /** + * 中心点位:经度 + */ + private String longitude; + + /** + * 中心点位:纬度 + */ + private String latitude; + + /** + * 坐标区域 + */ + private String coordinates; + + /** + * 坐标位置 + */ + private String location; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPartDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPartDTO.java new file mode 100644 index 0000000000..6d5ca4a3bc --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPartDTO.java @@ -0,0 +1,86 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 小区-分区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcNeighborHoodPartDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键,片区id + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 名称,比如北区,南区 + */ + private String name; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPropertyDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPropertyDTO.java new file mode 100644 index 0000000000..e889a21468 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcNeighborHoodPropertyDTO.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 小区物业关系表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcNeighborHoodPropertyDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 小区物业关系表 + */ + private String id; + + /** + * 物业id + */ + private String propertyId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcPropertyManagementDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcPropertyManagementDTO.java new file mode 100644 index 0000000000..732ff0d5ce --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/IcPropertyManagementDTO.java @@ -0,0 +1,76 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +public class IcPropertyManagementDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 物业id + */ + private String id; + + /** + * 物业名称 + */ + private String name; + + /** + * 删除标识 0未删除、1已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java new file mode 100644 index 0000000000..aae2c36569 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java @@ -0,0 +1,85 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +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.IcBuildingDTO; +import com.epmet.service.IcBuildingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 楼栋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("icbuilding") +public class IcBuildingController { + + @Autowired + private IcBuildingService icBuildingService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icBuildingService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcBuildingDTO data = icBuildingService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcBuildingDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icBuildingService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcBuildingDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icBuildingService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icBuildingService.delete(ids); + return new Result(); + } + + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java new file mode 100644 index 0000000000..93e3f11314 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java @@ -0,0 +1,87 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcBuildingUnitDTO; +import com.epmet.service.IcBuildingUnitService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 楼栋单元信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("icbuildingunit") +public class IcBuildingUnitController { + + @Autowired + private IcBuildingUnitService icBuildingUnitService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icBuildingUnitService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcBuildingUnitDTO data = icBuildingUnitService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcBuildingUnitDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icBuildingUnitService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcBuildingUnitDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icBuildingUnitService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icBuildingUnitService.delete(ids); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java new file mode 100644 index 0000000000..5d649ce45b --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java @@ -0,0 +1,85 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +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.IcHouseDTO; +import com.epmet.service.IcHouseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 房屋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("ichouse") +public class IcHouseController { + + @Autowired + private IcHouseService icHouseService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icHouseService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcHouseDTO data = icHouseService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcHouseDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icHouseService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcHouseDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icHouseService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icHouseService.delete(ids); + return new Result(); + } + + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java new file mode 100644 index 0000000000..0cf22c6da7 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -0,0 +1,87 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcNeighborHoodDTO; +import com.epmet.service.IcNeighborHoodService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 小区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("icneighborhood") +public class IcNeighborHoodController { + + @Autowired + private IcNeighborHoodService icNeighborHoodService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icNeighborHoodService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcNeighborHoodDTO data = icNeighborHoodService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcNeighborHoodDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icNeighborHoodService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcNeighborHoodDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icNeighborHoodService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icNeighborHoodService.delete(ids); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPartController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPartController.java new file mode 100644 index 0000000000..1059863233 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPartController.java @@ -0,0 +1,84 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +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.IcNeighborHoodPartDTO; +import com.epmet.service.IcNeighborHoodPartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 小区-分区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("icneighborhoodpart") +public class IcNeighborHoodPartController { + + @Autowired + private IcNeighborHoodPartService icNeighborHoodPartService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icNeighborHoodPartService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcNeighborHoodPartDTO data = icNeighborHoodPartService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcNeighborHoodPartDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icNeighborHoodPartService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcNeighborHoodPartDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icNeighborHoodPartService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icNeighborHoodPartService.delete(ids); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPropertyController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPropertyController.java new file mode 100644 index 0000000000..e5d0e61093 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodPropertyController.java @@ -0,0 +1,85 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +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.IcNeighborHoodPropertyDTO; +import com.epmet.service.IcNeighborHoodPropertyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 小区物业关系表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("icneighborhoodproperty") +public class IcNeighborHoodPropertyController { + + @Autowired + private IcNeighborHoodPropertyService icNeighborHoodPropertyService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icNeighborHoodPropertyService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcNeighborHoodPropertyDTO data = icNeighborHoodPropertyService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcNeighborHoodPropertyDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icNeighborHoodPropertyService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcNeighborHoodPropertyDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icNeighborHoodPropertyService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icNeighborHoodPropertyService.delete(ids); + return new Result(); + } + + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcPropertyManagementController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcPropertyManagementController.java new file mode 100644 index 0000000000..baa7c40fc4 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcPropertyManagementController.java @@ -0,0 +1,87 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcPropertyManagementDTO; +import com.epmet.service.IcPropertyManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("icpropertymanagement") +public class IcPropertyManagementController { + + @Autowired + private IcPropertyManagementService icPropertyManagementService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icPropertyManagementService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcPropertyManagementDTO data = icPropertyManagementService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcPropertyManagementDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icPropertyManagementService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcPropertyManagementDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icPropertyManagementService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icPropertyManagementService.delete(ids); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java new file mode 100644 index 0000000000..d800bb6761 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcBuildingEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 楼栋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcBuildingDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingUnitDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingUnitDao.java new file mode 100644 index 0000000000..69465df911 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingUnitDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcBuildingUnitEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 楼栋单元信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcBuildingUnitDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java new file mode 100644 index 0000000000..e8c196935d --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcHouseEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 房屋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcHouseDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java new file mode 100644 index 0000000000..1635ddcce2 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcNeighborHoodEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 小区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcNeighborHoodDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPartDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPartDao.java new file mode 100644 index 0000000000..6b0154f538 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPartDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcNeighborHoodPartEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 小区-分区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcNeighborHoodPartDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPropertyDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPropertyDao.java new file mode 100644 index 0000000000..79a71a11b8 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodPropertyDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcNeighborHoodPropertyEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 小区物业关系表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcNeighborHoodPropertyDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java new file mode 100644 index 0000000000..545bb0c601 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcPropertyManagementEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Mapper +public interface IcPropertyManagementDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingEntity.java new file mode 100644 index 0000000000..b4d4811caa --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingEntity.java @@ -0,0 +1,98 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 楼栋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_building") +public class IcBuildingEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 片区id,neighbor_hood_part.id,可为空。 + */ + private String partId; + + /** + * 楼栋名称 + */ + private String buildingName; + + /** + * 楼栋类型,这里存储字典编码就可以 + */ + private String type; + + /** + * 排序 + */ + private Integer sort; + + /** + * 总单元数 + */ + private Integer totalUnitNum; + + /** + * 总楼层总数 + */ + private Integer totalFloorNum; + + /** + * 总户数 + */ + private Integer totalHouseNum; + + /** + * 中心点位:经度 + */ + private String longitude; + + /** + * 中心点位:纬度 + */ + private String latitude; + + /** + * 坐标位置 + */ + private String coordinatePosition; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingUnitEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingUnitEntity.java new file mode 100644 index 0000000000..d7212ff143 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcBuildingUnitEntity.java @@ -0,0 +1,61 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_building_unit") +public class IcBuildingUnitEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 楼宇id + */ + private String buildingId; + + /** + * 单元号:1,2,3?? + */ + private String unitNum; + + /** + * 单元名 + */ + private String unitName; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcHouseEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcHouseEntity.java new file mode 100644 index 0000000000..4861c69271 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcHouseEntity.java @@ -0,0 +1,106 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_house") +public class IcHouseEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 片区id,neighbor_hood_part.id,可为空。 + */ + private String partId; + + /** + * 所属楼栋id + */ + private String buildingId; + + /** + * 所属单元id + */ + private String buildingUnitId; + + /** + * 房屋名字后台插入时生成 + */ + private String houseName; + + /** + * 门牌号 + */ + private String doorName; + + /** + * 房屋类型,这里存储字典value就可以 + */ + private String houseType; + + /** + * 存储字典value + */ + private String purpose; + + /** + * 1出租;0未出租 + */ + private Integer rentFlag; + + /** + * 房主姓名 + */ + private String ownerName; + + /** + * 房主电话 + */ + private String ownerPhone; + + /** + * 房主身份证号 + */ + private String ownerIdCard; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodEntity.java new file mode 100644 index 0000000000..62489898d2 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodEntity.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_neighbor_hood") +public class IcNeighborHoodEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区名称 + */ + private String neighborHoodName; + + /** + * 组织id + */ + private String agencyId; + + /** + * 上级组织id + */ + private String parentAgencyId; + + /** + * 组织的所有上级组织id + */ + private String agencyPids; + + /** + * 网格id + */ + private String gridId; + + /** + * 详细地址 + */ + private String address; + + /** + * 备注 + */ + private String remark; + + /** + * 中心点位:经度 + */ + private String longitude; + + /** + * 中心点位:纬度 + */ + private String latitude; + + /** + * 坐标区域 + */ + private String coordinates; + + /** + * 坐标位置 + */ + private String location; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPartEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPartEntity.java new file mode 100644 index 0000000000..5f9929c5f4 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPartEntity.java @@ -0,0 +1,56 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_neighbor_hood_part") +public class IcNeighborHoodPartEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 名称,比如北区,南区 + */ + private String name; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPropertyEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPropertyEntity.java new file mode 100644 index 0000000000..19827d15bf --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcNeighborHoodPropertyEntity.java @@ -0,0 +1,51 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_neighbor_hood_property") +public class IcNeighborHoodPropertyEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 物业id + */ + private String propertyId; + + /** + * 小区id + */ + private String neighborHoodId; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcPropertyManagementEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcPropertyManagementEntity.java new file mode 100644 index 0000000000..68dd3a349e --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcPropertyManagementEntity.java @@ -0,0 +1,46 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_property_management") +public class IcPropertyManagementEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 物业名称 + */ + private String name; + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java new file mode 100644 index 0000000000..afe8f11567 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcBuildingDTO; +import com.epmet.entity.IcBuildingEntity; + +import java.util.List; +import java.util.Map; + +/** + * 楼栋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcBuildingService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcBuildingDTO + * @author generator + * @date 2021-10-25 + */ + IcBuildingDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcBuildingDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcBuildingDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java new file mode 100644 index 0000000000..59b1546ed3 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcBuildingUnitDTO; +import com.epmet.entity.IcBuildingUnitEntity; + +import java.util.List; +import java.util.Map; + +/** + * 楼栋单元信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcBuildingUnitService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcBuildingUnitDTO + * @author generator + * @date 2021-10-25 + */ + IcBuildingUnitDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcBuildingUnitDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcBuildingUnitDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java new file mode 100644 index 0000000000..e59122f103 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcHouseDTO; +import com.epmet.entity.IcHouseEntity; + +import java.util.List; +import java.util.Map; + +/** + * 房屋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcHouseService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcHouseDTO + * @author generator + * @date 2021-10-25 + */ + IcHouseDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcHouseDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcHouseDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPartService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPartService.java new file mode 100644 index 0000000000..787f8a534a --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPartService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcNeighborHoodPartDTO; +import com.epmet.entity.IcNeighborHoodPartEntity; + +import java.util.List; +import java.util.Map; + +/** + * 小区-分区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcNeighborHoodPartService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcNeighborHoodPartDTO + * @author generator + * @date 2021-10-25 + */ + IcNeighborHoodPartDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcNeighborHoodPartDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcNeighborHoodPartDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPropertyService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPropertyService.java new file mode 100644 index 0000000000..e9df133f87 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodPropertyService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcNeighborHoodPropertyDTO; +import com.epmet.entity.IcNeighborHoodPropertyEntity; + +import java.util.List; +import java.util.Map; + +/** + * 小区物业关系表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcNeighborHoodPropertyService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcNeighborHoodPropertyDTO + * @author generator + * @date 2021-10-25 + */ + IcNeighborHoodPropertyDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcNeighborHoodPropertyDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcNeighborHoodPropertyDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java new file mode 100644 index 0000000000..15f4624cba --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcNeighborHoodDTO; +import com.epmet.entity.IcNeighborHoodEntity; + +import java.util.List; +import java.util.Map; + +/** + * 小区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcNeighborHoodService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcNeighborHoodDTO + * @author generator + * @date 2021-10-25 + */ + IcNeighborHoodDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcNeighborHoodDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcNeighborHoodDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcPropertyManagementService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcPropertyManagementService.java new file mode 100644 index 0000000000..bc808af034 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcPropertyManagementService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcPropertyManagementDTO; +import com.epmet.entity.IcPropertyManagementEntity; + +import java.util.List; +import java.util.Map; + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface IcPropertyManagementService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-25 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-25 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcPropertyManagementDTO + * @author generator + * @date 2021-10-25 + */ + IcPropertyManagementDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void save(IcPropertyManagementDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-25 + */ + void update(IcPropertyManagementDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-25 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java new file mode 100644 index 0000000000..5a4c3ae38c --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcBuildingDao; +import com.epmet.dto.IcBuildingDTO; +import com.epmet.entity.IcBuildingEntity; +import com.epmet.service.IcBuildingService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 楼栋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcBuildingServiceImpl extends BaseServiceImpl implements IcBuildingService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcBuildingDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcBuildingDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcBuildingDTO get(String id) { + IcBuildingEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcBuildingDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcBuildingDTO dto) { + IcBuildingEntity entity = ConvertUtils.sourceToTarget(dto, IcBuildingEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcBuildingDTO dto) { + IcBuildingEntity entity = ConvertUtils.sourceToTarget(dto, IcBuildingEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java new file mode 100644 index 0000000000..c5cc404638 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcBuildingUnitDao; +import com.epmet.dto.IcBuildingUnitDTO; +import com.epmet.entity.IcBuildingUnitEntity; +import com.epmet.service.IcBuildingUnitService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 楼栋单元信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcBuildingUnitServiceImpl extends BaseServiceImpl implements IcBuildingUnitService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcBuildingUnitDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcBuildingUnitDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcBuildingUnitDTO get(String id) { + IcBuildingUnitEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcBuildingUnitDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcBuildingUnitDTO dto) { + IcBuildingUnitEntity entity = ConvertUtils.sourceToTarget(dto, IcBuildingUnitEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcBuildingUnitDTO dto) { + IcBuildingUnitEntity entity = ConvertUtils.sourceToTarget(dto, IcBuildingUnitEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java new file mode 100644 index 0000000000..db80c7ee31 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcHouseDao; +import com.epmet.dto.IcHouseDTO; +import com.epmet.entity.IcHouseEntity; +import com.epmet.service.IcHouseService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 房屋信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcHouseServiceImpl extends BaseServiceImpl implements IcHouseService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcHouseDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcHouseDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcHouseDTO get(String id) { + IcHouseEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcHouseDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcHouseDTO dto) { + IcHouseEntity entity = ConvertUtils.sourceToTarget(dto, IcHouseEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcHouseDTO dto) { + IcHouseEntity entity = ConvertUtils.sourceToTarget(dto, IcHouseEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPartServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPartServiceImpl.java new file mode 100644 index 0000000000..b9b3fc4a24 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPartServiceImpl.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcNeighborHoodPartDao; +import com.epmet.dto.IcNeighborHoodPartDTO; +import com.epmet.entity.IcNeighborHoodPartEntity; +import com.epmet.service.IcNeighborHoodPartService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 小区-分区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcNeighborHoodPartServiceImpl extends BaseServiceImpl implements IcNeighborHoodPartService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcNeighborHoodPartDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcNeighborHoodPartDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcNeighborHoodPartDTO get(String id) { + IcNeighborHoodPartEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcNeighborHoodPartDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcNeighborHoodPartDTO dto) { + IcNeighborHoodPartEntity entity = ConvertUtils.sourceToTarget(dto, IcNeighborHoodPartEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcNeighborHoodPartDTO dto) { + IcNeighborHoodPartEntity entity = ConvertUtils.sourceToTarget(dto, IcNeighborHoodPartEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPropertyServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPropertyServiceImpl.java new file mode 100644 index 0000000000..d4f877114a --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodPropertyServiceImpl.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcNeighborHoodPropertyDao; +import com.epmet.dto.IcNeighborHoodPropertyDTO; +import com.epmet.entity.IcNeighborHoodPropertyEntity; +import com.epmet.service.IcNeighborHoodPropertyService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 小区物业关系表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcNeighborHoodPropertyServiceImpl extends BaseServiceImpl implements IcNeighborHoodPropertyService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcNeighborHoodPropertyDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcNeighborHoodPropertyDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcNeighborHoodPropertyDTO get(String id) { + IcNeighborHoodPropertyEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcNeighborHoodPropertyDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcNeighborHoodPropertyDTO dto) { + IcNeighborHoodPropertyEntity entity = ConvertUtils.sourceToTarget(dto, IcNeighborHoodPropertyEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcNeighborHoodPropertyDTO dto) { + IcNeighborHoodPropertyEntity entity = ConvertUtils.sourceToTarget(dto, IcNeighborHoodPropertyEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java new file mode 100644 index 0000000000..1585fe99e4 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcNeighborHoodDao; +import com.epmet.dto.IcNeighborHoodDTO; +import com.epmet.entity.IcNeighborHoodEntity; +import com.epmet.service.IcNeighborHoodService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 小区表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcNeighborHoodServiceImpl extends BaseServiceImpl implements IcNeighborHoodService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcNeighborHoodDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcNeighborHoodDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcNeighborHoodDTO get(String id) { + IcNeighborHoodEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcNeighborHoodDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcNeighborHoodDTO dto) { + IcNeighborHoodEntity entity = ConvertUtils.sourceToTarget(dto, IcNeighborHoodEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcNeighborHoodDTO dto) { + IcNeighborHoodEntity entity = ConvertUtils.sourceToTarget(dto, IcNeighborHoodEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcPropertyManagementServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcPropertyManagementServiceImpl.java new file mode 100644 index 0000000000..4296911e8d --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcPropertyManagementServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcPropertyManagementDao; +import com.epmet.dto.IcPropertyManagementDTO; +import com.epmet.entity.IcPropertyManagementEntity; +import com.epmet.service.IcPropertyManagementService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@Service +public class IcPropertyManagementServiceImpl extends BaseServiceImpl implements IcPropertyManagementService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcPropertyManagementDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcPropertyManagementDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcPropertyManagementDTO get(String id) { + IcPropertyManagementEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcPropertyManagementDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcPropertyManagementDTO dto) { + IcPropertyManagementEntity entity = ConvertUtils.sourceToTarget(dto, IcPropertyManagementEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcPropertyManagementDTO dto) { + IcPropertyManagementEntity entity = ConvertUtils.sourceToTarget(dto, IcPropertyManagementEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml new file mode 100644 index 0000000000..8d9249b655 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingUnitDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingUnitDao.xml new file mode 100644 index 0000000000..0ee38da368 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingUnitDao.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml new file mode 100644 index 0000000000..25df6ce4a6 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml new file mode 100644 index 0000000000..b76ab56c4b --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPartDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPartDao.xml new file mode 100644 index 0000000000..8dd1ab5097 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPartDao.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPropertyDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPropertyDao.xml new file mode 100644 index 0000000000..749861cc9a --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodPropertyDao.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml new file mode 100644 index 0000000000..b1b707f456 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file From 0ac45e280ef8ee2f03523e4856ac55097ab37c6a Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 25 Oct 2021 16:03:50 +0800 Subject: [PATCH 002/253] =?UTF-8?q?=E5=9C=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/constant/OrgInfoConstant.java | 4 + .../com/epmet/dto/form/MapAddAreaFormDTO.java | 31 ++++++ .../com/epmet/dto/form/MapDelAreaFormDTO.java | 28 ++++++ .../com/epmet/dto/form/MapOrgFormDTO.java | 27 ++++++ .../com/epmet/dto/result/MapOrgResultDTO.java | 71 ++++++++++++++ .../epmet/dto/result/MapSonOrgResultDTO.java | 64 ++++++++++++ .../epmet/controller/AgencyController.java | 43 +++++++- .../java/com/epmet/dao/CustomerAgencyDao.java | 28 ++++++ .../epmet/entity/CustomerAgencyEntity.java | 15 +++ .../com/epmet/entity/CustomerGridEntity.java | 5 + .../java/com/epmet/service/AgencyService.java | 30 +++++- .../epmet/service/impl/AgencyServiceImpl.java | 97 +++++++++++++++++++ .../db/migration/V0.0.8__add_coordinates.sql | 4 + .../resources/mapper/CustomerAgencyDao.xml | 80 +++++++++++++++ 14 files changed, 519 insertions(+), 8 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapAddAreaFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapDelAreaFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapOrgFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/db/migration/V0.0.8__add_coordinates.sql diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/OrgInfoConstant.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/OrgInfoConstant.java index c20cb98c6d..d8c8567800 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/OrgInfoConstant.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/OrgInfoConstant.java @@ -12,4 +12,8 @@ public interface OrgInfoConstant { String DEPT = "dept"; + String NEIGHBOR_HOOD = "neighborHood"; + + String COMMUNITY = "community"; + } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapAddAreaFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapAddAreaFormDTO.java new file mode 100644 index 0000000000..8fcf455279 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapAddAreaFormDTO.java @@ -0,0 +1,31 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/10/25 9:54 上午 + * @DESC + */ +@Data +public class MapAddAreaFormDTO implements Serializable { + + private static final long serialVersionUID = 2334704900459757549L; + + public interface MapAddAreaForm{} + + /** + * 类型,组织:agency,网格:grid,小区:neighborHood + */ + @NotBlank(message = "level不能为空",groups = MapAddAreaForm.class) + private String level; + + @NotBlank(message = "orgId不能为空",groups = MapAddAreaForm.class) + private String orgId; + + @NotBlank(message = "coordinates不能为空",groups = MapAddAreaForm.class) + private String coordinates; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapDelAreaFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapDelAreaFormDTO.java new file mode 100644 index 0000000000..efeaf5b0e2 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapDelAreaFormDTO.java @@ -0,0 +1,28 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/10/25 9:23 上午 + * @DESC + */ +@Data +public class MapDelAreaFormDTO implements Serializable { + + private static final long serialVersionUID = -539570523818788293L; + + public interface MapDelAreaForm{} + + /** + * 类型,组织:agency,网格:grid,小区:neighborHood + */ + @NotBlank(message = "level不能为空", groups = MapDelAreaForm.class) + private String level; + + @NotBlank(message = "orgId不能为空", groups = MapDelAreaForm.class) + private String orgId; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapOrgFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapOrgFormDTO.java new file mode 100644 index 0000000000..04ac916daa --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/MapOrgFormDTO.java @@ -0,0 +1,27 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/10/25 10:40 上午 + * @DESC + */ +@Data +public class MapOrgFormDTO implements Serializable { + + private static final long serialVersionUID = 2021388285115834510L; + + /** + * 类型,组织:agency,网格:grid,小区:neighborHood + */ + private String level; + + /** + * 组织ID,默认不填写 + */ + private String orgId; + +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java new file mode 100644 index 0000000000..7f92e3bdc1 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java @@ -0,0 +1,71 @@ +package com.epmet.dto.result; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author zxc + * @DateTime 2021/10/25 10:40 上午 + * @DESC + */ +@Data +public class MapOrgResultDTO implements Serializable { + + private static final long serialVersionUID = 7296300942981202725L; + + /** + * 经度 + */ + @JsonIgnore + private String longitudeOrigin; + + private BigDecimal longitude; + + /** + * 纬度 + */ + @JsonIgnore + private String latitudeOrigin; + + private BigDecimal latitude; + + /** + * 组织或网格ID + */ + private String id; + + /** + * 组织或网格名字 + */ + private String name; + + /** + * 类型,组织:agency,网格:grid,小区:neighborHood + */ + private String level; + + /** + * 坐标 + */ + private String coordinates; + + /** + * 下级结果集 + */ + private List children; + + public MapOrgResultDTO() { + this.longitudeOrigin = ""; + this.latitudeOrigin = ""; + this.id = ""; + this.name = ""; + this.level = ""; + this.coordinates = ""; + this.children = new ArrayList<>(); + } +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java new file mode 100644 index 0000000000..77cb78266c --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java @@ -0,0 +1,64 @@ +package com.epmet.dto.result; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @Author zxc + * @DateTime 2021/10/25 10:40 上午 + * @DESC + */ +@Data +public class MapSonOrgResultDTO implements Serializable { + + private static final long serialVersionUID = 7296300942981202725L; + + /** + * 经度 + */ + @JsonIgnore + private String longitudeOrigin; + + private BigDecimal longitude; + + /** + * 纬度 + */ + @JsonIgnore + private String latitudeOrigin; + + private BigDecimal latitude; + + /** + * 组织或网格ID + */ + private String id; + + /** + * 组织或网格名字 + */ + private String name; + + /** + * 类型,组织:agency,网格:grid,小区:neighborHood + */ + private String level; + + /** + * 坐标 + */ + private String coordinates; + + public MapSonOrgResultDTO() { + this.longitudeOrigin = ""; + this.latitudeOrigin = ""; + this.id = ""; + this.name = ""; + this.level = ""; + this.coordinates = ""; + } +} 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 112d6b8e35..5d3ecedfbe 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 @@ -27,10 +27,7 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.constant.CustomerAgencyConstant; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.form.*; -import com.epmet.dto.result.AddAgencyResultDTO; -import com.epmet.dto.result.AgencyListResultDTO; -import com.epmet.dto.result.AgencysResultDTO; -import com.epmet.dto.result.SubAgencyResultDTO; +import com.epmet.dto.result.*; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.service.AgencyService; import com.epmet.service.CustomerAgencyService; @@ -255,4 +252,42 @@ public class AgencyController { return new Result(); } + /** + * @Description 【地图配置】删除 + * @param formDTO + * @author zxc + * @date 2021/10/25 9:30 上午 + */ + @PostMapping("mapdelarea") + public Result mapDelArea(@RequestBody MapDelAreaFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, MapDelAreaFormDTO.MapDelAreaForm.class); + agencyService.mapDelArea(formDTO); + return new Result(); + } + + /** + * @Description 【地图配置】新增 + * @param formDTO + * @author zxc + * @date 2021/10/25 9:58 上午 + */ + @PostMapping("mapaddarea") + public Result mapAddArea(@RequestBody MapAddAreaFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, MapAddAreaFormDTO.MapAddAreaForm.class); + agencyService.mapAddArea(formDTO); + return new Result(); + } + + /** + * @Description 【地图配置】组织查询 + * @param formDTO + * @param tokenDto + * @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)); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java index 145178f50f..3f98a2f847 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java @@ -243,4 +243,32 @@ public interface CustomerAgencyDao extends BaseDao { AgencyTreeResultDTO getAllAgency(@Param("customerId") String customerId); List getSubAgencyList(@Param("pid") String pid); + + /** + * @Description 【地图配置】删除 + * @param orgId + * @param level + * @author zxc + * @date 2021/10/25 9:39 上午 + */ + void delMapArea(@Param("orgId") String orgId, @Param("level") String level); + + /** + * @Description 【地图配置】新增 + * @param orgId + * @param level + * @param coordinates + * @author zxc + * @date 2021/10/25 9:59 上午 + */ + void addMapArea(@Param("orgId") String orgId, @Param("level") String level,@Param("coordinates")String coordinates); + + /** + * @Description 地图查询下级组织 + * @param pid + * @param type + * @author zxc + * @date 2021/10/25 2:30 下午 + */ + List selectSonOrg(@Param("pid")String pid,@Param("type")String type); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerAgencyEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerAgencyEntity.java index ee327e421e..ff51b54c01 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerAgencyEntity.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerAgencyEntity.java @@ -108,4 +108,19 @@ public class CustomerAgencyEntity extends BaseEpmetEntity { * 【社区】名称0409 */ private String community; + + /** + * 坐标 + */ + private String coordinates; + + /** + * 中心位置经度 + */ + private String longitude; + + /** + * 中心位置纬度 + */ + private String latitude; } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerGridEntity.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerGridEntity.java index 26d0cd84af..75674491f7 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerGridEntity.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/CustomerGridEntity.java @@ -79,4 +79,9 @@ public class CustomerGridEntity extends BaseEpmetEntity { * 所有上级组织ID */ private String pids; + + /** + * 坐标 + */ + private String coordinates; } 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 381fb7256a..b0153239fd 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 @@ -17,13 +17,11 @@ package com.epmet.service; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.form.*; -import com.epmet.dto.result.AddAgencyResultDTO; -import com.epmet.dto.result.AgencyListResultDTO; -import com.epmet.dto.result.AgencysResultDTO; -import com.epmet.dto.result.SubAgencyResultDTO; +import com.epmet.dto.result.*; import com.epmet.entity.CustomerAgencyEntity; import java.util.List; @@ -117,4 +115,28 @@ public interface AgencyService { */ AddAgencyResultDTO addAgencyV2(AddAgencyV2FormDTO formDTO); + /** + * @Description 【地图配置】删除 + * @param formDTO + * @author zxc + * @date 2021/10/25 9:30 上午 + */ + void mapDelArea(MapDelAreaFormDTO formDTO); + + /** + * @Description 【地图配置】新增 + * @param formDTO + * @author zxc + * @date 2021/10/25 9:58 上午 + */ + void mapAddArea(MapAddAreaFormDTO formDTO); + + /** + * @Description 【地图配置】组织查询 + * @param formDTO + * @param tokenDto + * @author zxc + * @date 2021/10/25 10:50 上午 + */ + MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto); } \ No newline at end of file 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 aa070f2d90..9da41f2e2c 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 @@ -21,12 +21,16 @@ import com.alibaba.fastjson.JSON; import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.CustomerAgencyConstant; +import com.epmet.constant.OrgInfoConstant; import com.epmet.constant.RoleKeyConstants; import com.epmet.dao.CustomerAgencyDao; import com.epmet.dao.CustomerGridDao; @@ -35,6 +39,7 @@ import com.epmet.dto.GovStaffRoleDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.CustomerAgencyEntity; +import com.epmet.entity.CustomerGridEntity; import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; @@ -52,6 +57,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -530,6 +536,97 @@ public class AgencyServiceImpl implements AgencyService { return resultDTO; } + /** + * @Description 【地图配置】删除 + * @param formDTO + * @author zxc + * @date 2021/10/25 9:30 上午 + */ + @Override + public void mapDelArea(MapDelAreaFormDTO formDTO) { + customerAgencyDao.delMapArea(formDTO.getOrgId(),formDTO.getLevel()); + } + + /** + * @Description 【地图配置】新增 + * @param formDTO + * @author zxc + * @date 2021/10/25 9:58 上午 + */ + @Override + public void mapAddArea(MapAddAreaFormDTO formDTO) { + customerAgencyDao.addMapArea(formDTO.getOrgId(), formDTO.getLevel(), formDTO.getCoordinates()); + } + + /** + * @Description 【地图配置】组织查询 + * @param formDTO + * @param tokenDto + * @author zxc + * @date 2021/10/25 10:50 上午 + */ + @Override + public MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto) { + MapOrgResultDTO result = new MapOrgResultDTO(); + if (StringUtils.isBlank(formDTO.getOrgId())){ + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); + formDTO.setOrgId(staffInfo.getFromOrgId()); + formDTO.setLevel(staffInfo.getFromOrgType()); + } + if (formDTO.getLevel().equals(OrgInfoConstant.AGENCY)){ + CustomerAgencyEntity entity = customerAgencyDao.selectById(formDTO.getOrgId()); + result = ConvertUtils.sourceToTarget(entity,MapOrgResultDTO.class); + result.setName(entity.getOrganizationName()); + result.setLevel(formDTO.getLevel()); + result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? null : new BigDecimal(entity.getLatitude())); + result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? null : new BigDecimal(entity.getLongitude())); + if (entity.getLevel().equals(OrgInfoConstant.COMMUNITY)){ + List son = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.GRID); + if (CollectionUtils.isNotEmpty(son)){ + son.forEach(s -> { + s.setLatitude(StringUtils.isBlank(s.getLatitudeOrigin()) ? null : new BigDecimal(s.getLatitudeOrigin())); + s.setLongitude(StringUtils.isBlank(s.getLongitudeOrigin()) ? null : new BigDecimal(s.getLongitudeOrigin())); + }); + } + result.setChildren(CollectionUtils.isEmpty(son) ? new ArrayList<>() : son); + }else { + List dtoList = new ArrayList<>(); + List son = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.AGENCY); + if (CollectionUtils.isNotEmpty(son)){ + dtoList.addAll(son); + } + // 直属网格 + List directlySub = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.GRID); + if (CollectionUtils.isNotEmpty(directlySub)){ + dtoList.addAll(directlySub); + } + if (CollectionUtils.isNotEmpty(dtoList)){ + dtoList.forEach(d -> { + d.setLatitude(StringUtils.isBlank(d.getLatitudeOrigin()) ? null : new BigDecimal(d.getLatitudeOrigin())); + d.setLongitude(StringUtils.isBlank(d.getLongitudeOrigin()) ? null : new BigDecimal(d.getLongitudeOrigin())); + }); + } + result.setChildren(dtoList); + } + }else if (formDTO.getLevel().equals(OrgInfoConstant.GRID)){ + CustomerGridEntity entity = customerGridDao.selectById(formDTO.getOrgId()); + result = ConvertUtils.sourceToTarget(entity,MapOrgResultDTO.class); + result.setName(entity.getGridName()); + result.setLevel(formDTO.getLevel()); + result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? null : new BigDecimal(entity.getLatitude())); + result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? null : new BigDecimal(entity.getLongitude())); + List son = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.NEIGHBOR_HOOD); + if (CollectionUtils.isNotEmpty(son)){ + son.forEach(s -> { + s.setLatitude(StringUtils.isBlank(s.getLatitudeOrigin()) ? null : new BigDecimal(s.getLatitudeOrigin())); + s.setLongitude(StringUtils.isBlank(s.getLongitudeOrigin()) ? null : new BigDecimal(s.getLongitudeOrigin())); + }); + } + result.setChildren(CollectionUtils.isEmpty(son) ? new ArrayList<>() : son); + } + return result; + } + private CustomerAgencyEntity constructInsertEntity(AddAgencyV2FormDTO formDTO, CustomerAgencyDTO parent) { CustomerAgencyEntity insertEntity = ConvertUtils.sourceToTarget(formDTO, CustomerAgencyEntity.class); insertEntity.setOrganizationName(formDTO.getAgencyName()); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/db/migration/V0.0.8__add_coordinates.sql b/epmet-module/gov-org/gov-org-server/src/main/resources/db/migration/V0.0.8__add_coordinates.sql new file mode 100644 index 0000000000..51e687031c --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/db/migration/V0.0.8__add_coordinates.sql @@ -0,0 +1,4 @@ +alter table customer_agency add COLUMN LONGITUDE varchar(255) comment '经度' AFTER SYNC_FLAG; +alter table customer_agency add COLUMN LATITUDE varchar(255) comment '纬度' AFTER LONGITUDE; +alter table customer_agency add COLUMN COORDINATES text(0) comment '坐标区域' AFTER LATITUDE; +alter table customer_grid add COLUMN COORDINATES text(0) comment '坐标区域' AFTER LATITUDE; \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml index 89a5df87f4..3dcb3a472e 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml @@ -24,6 +24,44 @@ ca.updated_time AS "updatedtime" + + + UPDATE + + customer_agency + + + customer_grid + + + ic_neighbor_hood + + SET + COORDINATES = #{coordinates}, + UPDATED_TIME = NOW() + WHERE ID = #{orgId} + AND DEL_FLAG = '0' + + + + + UPDATE + + customer_agency + + + customer_grid + + + ic_neighbor_hood + + SET + COORDINATES = NULL, + UPDATED_TIME = NOW() + WHERE ID = #{orgId} + AND DEL_FLAG = '0' + + + + + \ No newline at end of file From cb118f48b3bda016ad227551dc5b7c399ff94b23 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 25 Oct 2021 16:33:42 +0800 Subject: [PATCH 003/253] bug --- .../main/java/com/epmet/service/impl/AgencyServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) 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 9da41f2e2c..48dfc5da3f 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 @@ -570,6 +570,9 @@ public class AgencyServiceImpl implements AgencyService { MapOrgResultDTO result = new MapOrgResultDTO(); if (StringUtils.isBlank(formDTO.getOrgId())){ CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); + if (null == staffInfo){ + return result; + } formDTO.setOrgId(staffInfo.getFromOrgId()); formDTO.setLevel(staffInfo.getFromOrgType()); } From f2778200ace6095e821f3e33d90e6a6027646f2b Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 25 Oct 2021 17:34:58 +0800 Subject: [PATCH 004/253] =?UTF-8?q?=E7=BB=8F=E7=BA=AC=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dto/CustomerAgencyDTO.java | 15 +++++++++++ .../epmet/service/impl/AgencyServiceImpl.java | 27 ++++++++++++------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/CustomerAgencyDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/CustomerAgencyDTO.java index 12f5488ac4..e7072c3cdb 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/CustomerAgencyDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/CustomerAgencyDTO.java @@ -142,4 +142,19 @@ public class CustomerAgencyDTO implements Serializable { * 社区 */ private String community; + + /** + * 坐标 + */ + private String coordinates; + + /** + * 中心位置经度 + */ + private String longitude; + + /** + * 中心位置纬度 + */ + private String latitude; } \ No newline at end of file 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 48dfc5da3f..4fc57c3ad9 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 @@ -18,6 +18,7 @@ package com.epmet.service.impl; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; @@ -568,6 +569,9 @@ public class AgencyServiceImpl implements AgencyService { @Override public MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto) { MapOrgResultDTO result = new MapOrgResultDTO(); + LambdaQueryWrapper qw = new LambdaQueryWrapper(); + qw.eq(CustomerAgencyEntity::getPid, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getDelFlag, NumConstant.ZERO_STR); + CustomerAgencyEntity customerAgencyEntity = customerAgencyDao.selectOne(qw); if (StringUtils.isBlank(formDTO.getOrgId())){ CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); if (null == staffInfo){ @@ -581,14 +585,15 @@ public class AgencyServiceImpl implements AgencyService { result = ConvertUtils.sourceToTarget(entity,MapOrgResultDTO.class); result.setName(entity.getOrganizationName()); result.setLevel(formDTO.getLevel()); - result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? null : new BigDecimal(entity.getLatitude())); - result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? null : new BigDecimal(entity.getLongitude())); + result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? new BigDecimal(customerAgencyEntity.getLatitude()) : new BigDecimal(entity.getLatitude())); + result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? new BigDecimal(customerAgencyEntity.getLongitude()) : new BigDecimal(entity.getLongitude())); if (entity.getLevel().equals(OrgInfoConstant.COMMUNITY)){ List son = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.GRID); if (CollectionUtils.isNotEmpty(son)){ + MapOrgResultDTO finalResult = result; son.forEach(s -> { - s.setLatitude(StringUtils.isBlank(s.getLatitudeOrigin()) ? null : new BigDecimal(s.getLatitudeOrigin())); - s.setLongitude(StringUtils.isBlank(s.getLongitudeOrigin()) ? null : new BigDecimal(s.getLongitudeOrigin())); + s.setLatitude(StringUtils.isBlank(s.getLatitudeOrigin()) ? finalResult.getLatitude() : new BigDecimal(s.getLatitudeOrigin())); + s.setLongitude(StringUtils.isBlank(s.getLongitudeOrigin()) ? finalResult.getLongitude() : new BigDecimal(s.getLongitudeOrigin())); }); } result.setChildren(CollectionUtils.isEmpty(son) ? new ArrayList<>() : son); @@ -604,9 +609,10 @@ public class AgencyServiceImpl implements AgencyService { dtoList.addAll(directlySub); } if (CollectionUtils.isNotEmpty(dtoList)){ + MapOrgResultDTO finalResult1 = result; dtoList.forEach(d -> { - d.setLatitude(StringUtils.isBlank(d.getLatitudeOrigin()) ? null : new BigDecimal(d.getLatitudeOrigin())); - d.setLongitude(StringUtils.isBlank(d.getLongitudeOrigin()) ? null : new BigDecimal(d.getLongitudeOrigin())); + d.setLatitude(StringUtils.isBlank(d.getLatitudeOrigin()) ? finalResult1.getLatitude() : new BigDecimal(d.getLatitudeOrigin())); + d.setLongitude(StringUtils.isBlank(d.getLongitudeOrigin()) ? finalResult1.getLongitude() : new BigDecimal(d.getLongitudeOrigin())); }); } result.setChildren(dtoList); @@ -616,13 +622,14 @@ public class AgencyServiceImpl implements AgencyService { result = ConvertUtils.sourceToTarget(entity,MapOrgResultDTO.class); result.setName(entity.getGridName()); result.setLevel(formDTO.getLevel()); - result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? null : new BigDecimal(entity.getLatitude())); - result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? null : new BigDecimal(entity.getLongitude())); + result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? new BigDecimal(customerAgencyEntity.getLatitude()) : new BigDecimal(entity.getLatitude())); + result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? new BigDecimal(customerAgencyEntity.getLongitude()) : new BigDecimal(entity.getLongitude())); List son = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.NEIGHBOR_HOOD); if (CollectionUtils.isNotEmpty(son)){ + MapOrgResultDTO finalResult2 = result; son.forEach(s -> { - s.setLatitude(StringUtils.isBlank(s.getLatitudeOrigin()) ? null : new BigDecimal(s.getLatitudeOrigin())); - s.setLongitude(StringUtils.isBlank(s.getLongitudeOrigin()) ? null : new BigDecimal(s.getLongitudeOrigin())); + s.setLatitude(StringUtils.isBlank(s.getLatitudeOrigin()) ? finalResult2.getLatitude() : new BigDecimal(s.getLatitudeOrigin())); + s.setLongitude(StringUtils.isBlank(s.getLongitudeOrigin()) ? finalResult2.getLongitude() : new BigDecimal(s.getLongitudeOrigin())); }); } result.setChildren(CollectionUtils.isEmpty(son) ? new ArrayList<>() : son); From b32854c76d6465302614650b3d2d45f9825e957f Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 25 Oct 2021 17:46:19 +0800 Subject: [PATCH 005/253] a --- .../src/main/java/com/epmet/service/impl/AgencyServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4fc57c3ad9..3b5464f498 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 @@ -570,7 +570,7 @@ public class AgencyServiceImpl implements AgencyService { public MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto) { MapOrgResultDTO result = new MapOrgResultDTO(); LambdaQueryWrapper qw = new LambdaQueryWrapper(); - qw.eq(CustomerAgencyEntity::getPid, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getDelFlag, NumConstant.ZERO_STR); + qw.eq(CustomerAgencyEntity::getPid, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getDelFlag, NumConstant.ZERO_STR).eq(CustomerAgencyEntity::getCustomerId,tokenDto.getCustomerId()); CustomerAgencyEntity customerAgencyEntity = customerAgencyDao.selectOne(qw); if (StringUtils.isBlank(formDTO.getOrgId())){ CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); From 437acd3e9031f3ab2bbe6c1105914a466378eca3 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Tue, 26 Oct 2021 13:51:53 +0800 Subject: [PATCH 006/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dto/IcFormDTO.java | 91 +++ .../java/com/epmet/dto/IcFormItemDTO.java | 171 ++++++ .../com/epmet/dto/IcFormItemGroupDTO.java | 111 ++++ .../com/epmet/dto/IcFormItemOptionsDTO.java | 106 ++++ .../main/java/com/epmet/dto/ItemTypeDTO.java | 81 +++ .../epmet/controller/IcFormController.java | 94 ++++ .../controller/IcFormItemController.java | 94 ++++ .../controller/IcFormItemGroupController.java | 94 ++++ .../IcFormItemOptionsController.java | 94 ++++ .../epmet/controller/ItemTypeController.java | 94 ++++ .../main/java/com/epmet/dao/IcFormDao.java | 33 ++ .../java/com/epmet/dao/IcFormItemDao.java | 33 ++ .../com/epmet/dao/IcFormItemGroupDao.java | 33 ++ .../com/epmet/dao/IcFormItemOptionsDao.java | 33 ++ .../main/java/com/epmet/dao/ItemTypeDao.java | 33 ++ .../java/com/epmet/entity/IcFormEntity.java | 61 ++ .../com/epmet/entity/IcFormItemEntity.java | 141 +++++ .../epmet/entity/IcFormItemGroupEntity.java | 81 +++ .../epmet/entity/IcFormItemOptionsEntity.java | 76 +++ .../java/com/epmet/entity/ItemTypeEntity.java | 51 ++ .../java/com/epmet/excel/IcFormExcel.java | 68 +++ .../java/com/epmet/excel/IcFormItemExcel.java | 116 ++++ .../com/epmet/excel/IcFormItemGroupExcel.java | 80 +++ .../epmet/excel/IcFormItemOptionsExcel.java | 77 +++ .../java/com/epmet/excel/ItemTypeExcel.java | 62 +++ .../epmet/service/IcFormItemGroupService.java | 95 ++++ .../service/IcFormItemOptionsService.java | 95 ++++ .../com/epmet/service/IcFormItemService.java | 95 ++++ .../java/com/epmet/service/IcFormService.java | 95 ++++ .../com/epmet/service/ItemTypeService.java | 95 ++++ .../impl/IcFormItemGroupServiceImpl.java | 100 ++++ .../impl/IcFormItemOptionsServiceImpl.java | 100 ++++ .../service/impl/IcFormItemServiceImpl.java | 100 ++++ .../epmet/service/impl/IcFormServiceImpl.java | 100 ++++ .../service/impl/ItemTypeServiceImpl.java | 100 ++++ .../src/main/resources/mapper/IcFormDao.xml | 7 + .../main/resources/mapper/IcFormItemDao.xml | 8 + .../resources/mapper/IcFormItemGroupDao.xml | 8 + .../resources/mapper/IcFormItemOptionsDao.xml | 8 + .../src/main/resources/mapper/ItemTypeDao.xml | 8 + .../java/com/epmet/dto/IcEnsureHouseDTO.java | 131 +++++ .../java/com/epmet/dto/IcOldPeopleDTO.java | 111 ++++ .../java/com/epmet/dto/IcPartyMemberDTO.java | 146 +++++ .../java/com/epmet/dto/IcResiDemandDTO.java | 131 +++++ .../java/com/epmet/dto/IcResiUserDTO.java | 526 ++++++++++++++++++ .../main/java/com/epmet/dto/IcSpecialDTO.java | 111 ++++ .../java/com/epmet/dto/IcUnemployedDTO.java | 151 +++++ .../java/com/epmet/dto/IcUnitedFrontDTO.java | 116 ++++ .../java/com/epmet/dto/IcVeteransDTO.java | 146 +++++ .../java/com/epmet/dto/IcVolunteerDTO.java | 116 ++++ .../controller/IcResiUserController.java | 94 ++++ .../java/com/epmet/dao/IcResiUserDao.java | 33 ++ .../com/epmet/entity/IcEnsureHouseEntity.java | 101 ++++ .../com/epmet/entity/IcOldPeopleEntity.java | 81 +++ .../com/epmet/entity/IcPartyMemberEntity.java | 116 ++++ .../com/epmet/entity/IcResiDemandEntity.java | 101 ++++ .../com/epmet/entity/IcResiUserEntity.java | 496 +++++++++++++++++ .../com/epmet/entity/IcSpecialEntity.java | 81 +++ .../com/epmet/entity/IcUnemployedEntity.java | 121 ++++ .../com/epmet/entity/IcUnitedFrontEntity.java | 86 +++ .../com/epmet/entity/IcVeteransEntity.java | 116 ++++ .../com/epmet/entity/IcVolunteerEntity.java | 86 +++ .../com/epmet/excel/IcEnsureHouseExcel.java | 92 +++ .../com/epmet/excel/IcOldPeopleExcel.java | 80 +++ .../com/epmet/excel/IcPartyMemberExcel.java | 101 ++++ .../com/epmet/excel/IcResiDemandExcel.java | 92 +++ .../java/com/epmet/excel/IcResiUserExcel.java | 329 +++++++++++ .../java/com/epmet/excel/IcSpecialExcel.java | 80 +++ .../com/epmet/excel/IcUnemployedExcel.java | 104 ++++ .../com/epmet/excel/IcUnitedFrontExcel.java | 83 +++ .../java/com/epmet/excel/IcVeteransExcel.java | 101 ++++ .../com/epmet/excel/IcVolunteerExcel.java | 83 +++ .../java/com/epmet/redis/IcResiUserRedis.java | 47 ++ .../com/epmet/service/IcResiUserService.java | 95 ++++ .../service/impl/IcResiUserServiceImpl.java | 104 ++++ .../main/resources/mapper/IcResiUserDao.xml | 8 + 76 files changed, 7618 insertions(+) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemOptionsDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/ItemTypeDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemGroupController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ItemTypeController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemGroupDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/ItemTypeDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemOptionsEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/ItemTypeEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemGroupExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemOptionsExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/ItemTypeExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemGroupService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ItemTypeService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemGroupServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ItemTypeServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemGroupDao.xml create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/ItemTypeDao.xml create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcOldPeopleDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSpecialDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnitedFrontDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVolunteerDTO.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcOldPeopleEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSpecialEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnitedFrontEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVolunteerEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcOldPeopleExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcSpecialExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnitedFrontExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVolunteerExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormDTO.java new file mode 100644 index 0000000000..ee14093ab1 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormDTO.java @@ -0,0 +1,91 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 配置表单 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * 表单CODE,从字典获取 + */ + private String formCode; + + /** + * 表单名称 + */ + private String formName; + + /** + * 地区码,有父级用父级 + */ + private String areaCode; + + /** + * 0未删除,1已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java new file mode 100644 index 0000000000..f670559b57 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java @@ -0,0 +1,171 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 表单项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormItemDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * + */ + private String areaCode; + + /** + * 表单ID + */ + private String formId; + + /** + * 表单CODE + */ + private String formCode; + + /** + * 父项ID + */ + private String parentItemId; + + /** + * 项标签 + */ + private String label; + + /** + * 控件类型,EG:INPUT;从字典获取 + */ + private String itemType; + + /** + * 分组ID,'默认,NONE' + */ + private String itemGroupId; + + /** + * 是否必填,1必填。0不必填 + */ + private Integer required; + + /** + * 手机号:mobile; 身份证:id_card + */ + private String validType; + + /** + * 默认值 + */ + private String defaultValue; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; + + /** + * 排序 + */ + private Integer sort; + + /** + * 占位提示语 + */ + private String placeholder; + + /** + * 是否查询显示,1展示。0不展示 + */ + private Integer searchDisplay; + + /** + * 是否列表显示,1展示,0不展示 + */ + private Integer listDisplay; + + /** + * 是否需要支持数据分析,1支持。0不支持 + */ + private Integer dataAnalyse; + + /** + * 列名 + */ + private String columnName; + + /** + * 列名序号,根据表递增 + */ + private Integer columnNum; + + /** + * 0未删除,1已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java new file mode 100644 index 0000000000..3c147dba78 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java @@ -0,0 +1,111 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 表单项分组 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormItemGroupDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 分组id + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * 表单ID + */ + private String formId; + + /** + * 表单编码 + */ + private String formCode; + + /** + * 对应的子表名称 + */ + private String tableName; + + /** + * 是否支持添加一行,1支持,默认0不支持 + */ + private Integer supportAdd; + + /** + * 名称 + */ + private String label; + + /** + * 排序 + */ + private Integer sort; + + /** + * 1展示,0不展示,默认1 + */ + private Integer display; + + /** + * 0未删除,1已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemOptionsDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemOptionsDTO.java new file mode 100644 index 0000000000..5505ef21dd --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemOptionsDTO.java @@ -0,0 +1,106 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 表单项的选项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormItemOptionsDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * 表单ID + */ + private String formId; + + /** + * 表单CODE + */ + private String formCode; + + /** + * 表单项ID + */ + private String itemId; + + /** + * 可选项标签名 + */ + private String optionLabel; + + /** + * 标签value值 + */ + private String optionValue; + + /** + * 排序 + */ + private Integer sort; + + /** + * 0未删除,1已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/ItemTypeDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/ItemTypeDTO.java new file mode 100644 index 0000000000..9db82e8d48 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/ItemTypeDTO.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 控件类型 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class ItemTypeDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 名称 + */ + private String name; + + /** + * CODE + */ + private String code; + + /** + * 0未删除,1已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java new file mode 100644 index 0000000000..4e9bf2d751 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcFormDTO; +import com.epmet.excel.IcFormExcel; +import com.epmet.service.IcFormService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 配置表单 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@RestController +@RequestMapping("icform") +public class IcFormController { + + @Autowired + private IcFormService icFormService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icFormService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcFormDTO data = icFormService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcFormDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icFormService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcFormDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icFormService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icFormService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icFormService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcFormExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java new file mode 100644 index 0000000000..3c6bbf4004 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcFormItemDTO; +import com.epmet.excel.IcFormItemExcel; +import com.epmet.service.IcFormItemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 表单项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@RestController +@RequestMapping("icformitem") +public class IcFormItemController { + + @Autowired + private IcFormItemService icFormItemService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icFormItemService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcFormItemDTO data = icFormItemService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcFormItemDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icFormItemService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcFormItemDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icFormItemService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icFormItemService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icFormItemService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcFormItemExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemGroupController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemGroupController.java new file mode 100644 index 0000000000..b4d0079637 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemGroupController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcFormItemGroupDTO; +import com.epmet.excel.IcFormItemGroupExcel; +import com.epmet.service.IcFormItemGroupService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 表单项分组 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@RestController +@RequestMapping("icformitemgroup") +public class IcFormItemGroupController { + + @Autowired + private IcFormItemGroupService icFormItemGroupService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icFormItemGroupService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcFormItemGroupDTO data = icFormItemGroupService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcFormItemGroupDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icFormItemGroupService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcFormItemGroupDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icFormItemGroupService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icFormItemGroupService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icFormItemGroupService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcFormItemGroupExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java new file mode 100644 index 0000000000..5d70a901d7 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcFormItemOptionsDTO; +import com.epmet.excel.IcFormItemOptionsExcel; +import com.epmet.service.IcFormItemOptionsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 表单项的选项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@RestController +@RequestMapping("icformitemoptions") +public class IcFormItemOptionsController { + + @Autowired + private IcFormItemOptionsService icFormItemOptionsService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icFormItemOptionsService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcFormItemOptionsDTO data = icFormItemOptionsService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcFormItemOptionsDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icFormItemOptionsService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcFormItemOptionsDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icFormItemOptionsService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icFormItemOptionsService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icFormItemOptionsService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcFormItemOptionsExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ItemTypeController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ItemTypeController.java new file mode 100644 index 0000000000..d5f5142c74 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ItemTypeController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.ItemTypeDTO; +import com.epmet.excel.ItemTypeExcel; +import com.epmet.service.ItemTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 控件类型 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@RestController +@RequestMapping("itemtype") +public class ItemTypeController { + + @Autowired + private ItemTypeService itemTypeService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = itemTypeService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + ItemTypeDTO data = itemTypeService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody ItemTypeDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + itemTypeService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody ItemTypeDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + itemTypeService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + itemTypeService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = itemTypeService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, ItemTypeExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java new file mode 100644 index 0000000000..fd40647a83 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcFormEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 配置表单 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Mapper +public interface IcFormDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java new file mode 100644 index 0000000000..44086df26f --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcFormItemEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 表单项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Mapper +public interface IcFormItemDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemGroupDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemGroupDao.java new file mode 100644 index 0000000000..d3b2322060 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemGroupDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcFormItemGroupEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 表单项分组 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Mapper +public interface IcFormItemGroupDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java new file mode 100644 index 0000000000..3609c41f9e --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcFormItemOptionsEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 表单项的选项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Mapper +public interface IcFormItemOptionsDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/ItemTypeDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/ItemTypeDao.java new file mode 100644 index 0000000000..ff4cb72d06 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/ItemTypeDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.ItemTypeEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 控件类型 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Mapper +public interface ItemTypeDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormEntity.java new file mode 100644 index 0000000000..4b53f0af6d --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormEntity.java @@ -0,0 +1,61 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_form") +public class IcFormEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户ID + */ + private String customerId; + + /** + * 表单CODE,从字典获取 + */ + private String formCode; + + /** + * 表单名称 + */ + private String formName; + + /** + * 地区码,有父级用父级 + */ + private String areaCode; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java new file mode 100644 index 0000000000..78e0934311 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java @@ -0,0 +1,141 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_form_item") +public class IcFormItemEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户ID + */ + private String customerId; + + /** + * + */ + private String areaCode; + + /** + * 表单ID + */ + private String formId; + + /** + * 表单CODE + */ + private String formCode; + + /** + * 父项ID + */ + private String parentItemId; + + /** + * 项标签 + */ + private String label; + + /** + * 控件类型,EG:INPUT;从字典获取 + */ + private String itemType; + + /** + * 分组ID,'默认,NONE' + */ + private String itemGroupId; + + /** + * 是否必填,1必填。0不必填 + */ + private Integer required; + + /** + * 手机号:mobile; 身份证:id_card + */ + private String validType; + + /** + * 默认值 + */ + private String defaultValue; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; + + /** + * 排序 + */ + private Integer sort; + + /** + * 占位提示语 + */ + private String placeholder; + + /** + * 是否查询显示,1展示。0不展示 + */ + private Integer searchDisplay; + + /** + * 是否列表显示,1展示,0不展示 + */ + private Integer listDisplay; + + /** + * 是否需要支持数据分析,1支持。0不支持 + */ + private Integer dataAnalyse; + + /** + * 列名 + */ + private String columnName; + + /** + * 列名序号,根据表递增 + */ + private Integer columnNum; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java new file mode 100644 index 0000000000..240f086180 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_form_item_group") +public class IcFormItemGroupEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户ID + */ + private String customerId; + + /** + * 表单ID + */ + private String formId; + + /** + * 表单编码 + */ + private String formCode; + + /** + * 对应的子表名称 + */ + private String tableName; + + /** + * 是否支持添加一行,1支持,默认0不支持 + */ + private Integer supportAdd; + + /** + * 名称 + */ + private String label; + + /** + * 排序 + */ + private Integer sort; + + /** + * 1展示,0不展示,默认1 + */ + private Integer display; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemOptionsEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemOptionsEntity.java new file mode 100644 index 0000000000..1ef8d360db --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemOptionsEntity.java @@ -0,0 +1,76 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_form_item_options") +public class IcFormItemOptionsEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户ID + */ + private String customerId; + + /** + * 表单ID + */ + private String formId; + + /** + * 表单CODE + */ + private String formCode; + + /** + * 表单项ID + */ + private String itemId; + + /** + * 可选项标签名 + */ + private String optionLabel; + + /** + * 标签value值 + */ + private String optionValue; + + /** + * 排序 + */ + private Integer sort; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/ItemTypeEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/ItemTypeEntity.java new file mode 100644 index 0000000000..8c552c2f75 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/ItemTypeEntity.java @@ -0,0 +1,51 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("item_type") +public class ItemTypeEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 名称 + */ + private String name; + + /** + * CODE + */ + private String code; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormExcel.java new file mode 100644 index 0000000000..7f70adddfc --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormExcel.java @@ -0,0 +1,68 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 配置表单 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormExcel { + + @Excel(name = "主键") + private String id; + + @Excel(name = "客户ID") + private String customerId; + + @Excel(name = "表单CODE,从字典获取") + private String formCode; + + @Excel(name = "表单名称") + private String formName; + + @Excel(name = "地区码,有父级用父级") + private String areaCode; + + @Excel(name = "0未删除,1已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemExcel.java new file mode 100644 index 0000000000..8e11613a01 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemExcel.java @@ -0,0 +1,116 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 表单项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormItemExcel { + + @Excel(name = "主键") + private String id; + + @Excel(name = "客户ID") + private String customerId; + + @Excel(name = "") + private String areaCode; + + @Excel(name = "表单ID") + private String formId; + + @Excel(name = "表单CODE") + private String formCode; + + @Excel(name = "父项ID") + private String parentItemId; + + @Excel(name = "项标签") + private String label; + + @Excel(name = "控件类型,EG:INPUT;从字典获取") + private String itemType; + + @Excel(name = "分组ID,'默认,NONE'") + private String itemGroupId; + + @Excel(name = "是否必填,1必填。0不必填") + private Integer required; + + @Excel(name = "手机号:mobile; 身份证:id_card") + private String validType; + + @Excel(name = "默认值") + private String defaultValue; + + @Excel(name = "选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取") + private String optionSourceType; + + @Excel(name = "来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取") + private String optionSourceValue; + + @Excel(name = "排序") + private Integer sort; + + @Excel(name = "占位提示语") + private String placeholder; + + @Excel(name = "是否查询显示,1展示。0不展示") + private Integer searchDisplay; + + @Excel(name = "是否列表显示,1展示,0不展示") + private Integer listDisplay; + + @Excel(name = "是否需要支持数据分析,1支持。0不支持") + private Integer dataAnalyse; + + @Excel(name = "列名") + private String columnName; + + @Excel(name = "列名序号,根据表递增") + private Integer columnNum; + + @Excel(name = "0未删除,1已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemGroupExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemGroupExcel.java new file mode 100644 index 0000000000..0d9cb8c7b9 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemGroupExcel.java @@ -0,0 +1,80 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 表单项分组 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormItemGroupExcel { + + @Excel(name = "分组id") + private String id; + + @Excel(name = "客户ID") + private String customerId; + + @Excel(name = "表单ID") + private String formId; + + @Excel(name = "表单编码") + private String formCode; + + @Excel(name = "对应的子表名称") + private String tableName; + + @Excel(name = "是否支持添加一行,1支持,默认0不支持") + private Integer supportAdd; + + @Excel(name = "名称") + private String label; + + @Excel(name = "排序") + private Integer sort; + + @Excel(name = "1展示,0不展示,默认1") + private Integer display; + + @Excel(name = "0未删除,1已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemOptionsExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemOptionsExcel.java new file mode 100644 index 0000000000..3f039890dc --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcFormItemOptionsExcel.java @@ -0,0 +1,77 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 表单项的选项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcFormItemOptionsExcel { + + @Excel(name = "主键") + private String id; + + @Excel(name = "客户ID") + private String customerId; + + @Excel(name = "表单ID") + private String formId; + + @Excel(name = "表单CODE") + private String formCode; + + @Excel(name = "表单项ID") + private String itemId; + + @Excel(name = "可选项标签名") + private String optionLabel; + + @Excel(name = "标签value值") + private String optionValue; + + @Excel(name = "排序") + private Integer sort; + + @Excel(name = "0未删除,1已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/ItemTypeExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/ItemTypeExcel.java new file mode 100644 index 0000000000..85db48a4c8 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/ItemTypeExcel.java @@ -0,0 +1,62 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 控件类型 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class ItemTypeExcel { + + @Excel(name = "ID") + private String id; + + @Excel(name = "名称") + private String name; + + @Excel(name = "CODE") + private String code; + + @Excel(name = "0未删除,1已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemGroupService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemGroupService.java new file mode 100644 index 0000000000..79402d6273 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemGroupService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcFormItemGroupDTO; +import com.epmet.entity.IcFormItemGroupEntity; + +import java.util.List; +import java.util.Map; + +/** + * 表单项分组 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface IcFormItemGroupService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-26 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-26 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcFormItemGroupDTO + * @author generator + * @date 2021-10-26 + */ + IcFormItemGroupDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void save(IcFormItemGroupDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void update(IcFormItemGroupDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java new file mode 100644 index 0000000000..0ffe8fa5ea --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcFormItemOptionsDTO; +import com.epmet.entity.IcFormItemOptionsEntity; + +import java.util.List; +import java.util.Map; + +/** + * 表单项的选项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface IcFormItemOptionsService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-26 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-26 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcFormItemOptionsDTO + * @author generator + * @date 2021-10-26 + */ + IcFormItemOptionsDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void save(IcFormItemOptionsDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void update(IcFormItemOptionsDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java new file mode 100644 index 0000000000..8a2aacd4bc --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcFormItemDTO; +import com.epmet.entity.IcFormItemEntity; + +import java.util.List; +import java.util.Map; + +/** + * 表单项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface IcFormItemService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-26 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-26 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcFormItemDTO + * @author generator + * @date 2021-10-26 + */ + IcFormItemDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void save(IcFormItemDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void update(IcFormItemDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java new file mode 100644 index 0000000000..176624a10e --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcFormDTO; +import com.epmet.entity.IcFormEntity; + +import java.util.List; +import java.util.Map; + +/** + * 配置表单 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface IcFormService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-26 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-26 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcFormDTO + * @author generator + * @date 2021-10-26 + */ + IcFormDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void save(IcFormDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void update(IcFormDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ItemTypeService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ItemTypeService.java new file mode 100644 index 0000000000..27f16dc45d --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ItemTypeService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.ItemTypeDTO; +import com.epmet.entity.ItemTypeEntity; + +import java.util.List; +import java.util.Map; + +/** + * 控件类型 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface ItemTypeService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-26 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-26 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return ItemTypeDTO + * @author generator + * @date 2021-10-26 + */ + ItemTypeDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void save(ItemTypeDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void update(ItemTypeDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemGroupServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemGroupServiceImpl.java new file mode 100644 index 0000000000..2de0adc908 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemGroupServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcFormItemGroupDao; +import com.epmet.dto.IcFormItemGroupDTO; +import com.epmet.entity.IcFormItemGroupEntity; +import com.epmet.service.IcFormItemGroupService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 表单项分组 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Service +public class IcFormItemGroupServiceImpl extends BaseServiceImpl implements IcFormItemGroupService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcFormItemGroupDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcFormItemGroupDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcFormItemGroupDTO get(String id) { + IcFormItemGroupEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcFormItemGroupDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcFormItemGroupDTO dto) { + IcFormItemGroupEntity entity = ConvertUtils.sourceToTarget(dto, IcFormItemGroupEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcFormItemGroupDTO dto) { + IcFormItemGroupEntity entity = ConvertUtils.sourceToTarget(dto, IcFormItemGroupEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java new file mode 100644 index 0000000000..c7ed24cd3d --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcFormItemOptionsDao; +import com.epmet.dto.IcFormItemOptionsDTO; +import com.epmet.entity.IcFormItemOptionsEntity; +import com.epmet.service.IcFormItemOptionsService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 表单项的选项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Service +public class IcFormItemOptionsServiceImpl extends BaseServiceImpl implements IcFormItemOptionsService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcFormItemOptionsDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcFormItemOptionsDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcFormItemOptionsDTO get(String id) { + IcFormItemOptionsEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcFormItemOptionsDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcFormItemOptionsDTO dto) { + IcFormItemOptionsEntity entity = ConvertUtils.sourceToTarget(dto, IcFormItemOptionsEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcFormItemOptionsDTO dto) { + IcFormItemOptionsEntity entity = ConvertUtils.sourceToTarget(dto, IcFormItemOptionsEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java new file mode 100644 index 0000000000..2c312272af --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcFormItemDao; +import com.epmet.dto.IcFormItemDTO; +import com.epmet.entity.IcFormItemEntity; +import com.epmet.service.IcFormItemService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 表单项 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Service +public class IcFormItemServiceImpl extends BaseServiceImpl implements IcFormItemService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcFormItemDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcFormItemDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcFormItemDTO get(String id) { + IcFormItemEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcFormItemDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcFormItemDTO dto) { + IcFormItemEntity entity = ConvertUtils.sourceToTarget(dto, IcFormItemEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcFormItemDTO dto) { + IcFormItemEntity entity = ConvertUtils.sourceToTarget(dto, IcFormItemEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java new file mode 100644 index 0000000000..e9691a9151 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcFormDao; +import com.epmet.dto.IcFormDTO; +import com.epmet.entity.IcFormEntity; +import com.epmet.service.IcFormService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 配置表单 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Service +public class IcFormServiceImpl extends BaseServiceImpl implements IcFormService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcFormDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcFormDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcFormDTO get(String id) { + IcFormEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcFormDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcFormDTO dto) { + IcFormEntity entity = ConvertUtils.sourceToTarget(dto, IcFormEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcFormDTO dto) { + IcFormEntity entity = ConvertUtils.sourceToTarget(dto, IcFormEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ItemTypeServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ItemTypeServiceImpl.java new file mode 100644 index 0000000000..cb73a5b85c --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ItemTypeServiceImpl.java @@ -0,0 +1,100 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.ItemTypeDao; +import com.epmet.dto.ItemTypeDTO; +import com.epmet.entity.ItemTypeEntity; +import com.epmet.service.ItemTypeService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 控件类型 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Service +public class ItemTypeServiceImpl extends BaseServiceImpl implements ItemTypeService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, ItemTypeDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, ItemTypeDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public ItemTypeDTO get(String id) { + ItemTypeEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, ItemTypeDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(ItemTypeDTO dto) { + ItemTypeEntity entity = ConvertUtils.sourceToTarget(dto, ItemTypeEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ItemTypeDTO dto) { + ItemTypeEntity entity = ConvertUtils.sourceToTarget(dto, ItemTypeEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml new file mode 100644 index 0000000000..8b0bb1f336 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml new file mode 100644 index 0000000000..0bb11f58bf --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemGroupDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemGroupDao.xml new file mode 100644 index 0000000000..ea697d8682 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemGroupDao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml new file mode 100644 index 0000000000..910d1f833f --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/ItemTypeDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/ItemTypeDao.xml new file mode 100644 index 0000000000..d488c4feab --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/ItemTypeDao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java new file mode 100644 index 0000000000..0868f00f51 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java @@ -0,0 +1,131 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 保障房 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcEnsureHouseDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 住房性质【字典表】 + */ + private String zfxz; + + /** + * 保障类型 + */ + private String bzlx; + + /** + * 发证日期 + */ + private Date fzrq; + + /** + * 补贴编号 + */ + private String btbh; + + /** + * 补贴金额 + */ + private String btje; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcOldPeopleDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcOldPeopleDTO.java new file mode 100644 index 0000000000..789e5ff1da --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcOldPeopleDTO.java @@ -0,0 +1,111 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 老年人 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcOldPeopleDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 高龄补助 + */ + private String glbz; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java new file mode 100644 index 0000000000..7dd3198144 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java @@ -0,0 +1,146 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 党员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcPartyMemberDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 入党时间 + */ + private Date rdsj; + + /** + * 转正时间 + */ + private Date zzsj; + + /** + * 所属支部 + */ + private String sszb; + + /** + * 是否流动党员 + */ + private String isLd; + + /** + * 流动党员活动证号 + */ + private String ldzh; + + /** + * 职务 + */ + private String partyZw; + + /** + * 是否退休 + */ + private String isTx; + + /** + * 是否党员中心户 + */ + private String isDyzxh; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java new file mode 100644 index 0000000000..c0d6370588 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java @@ -0,0 +1,131 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 居民需求 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcResiDemandDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 大类Id + */ + private Date bigClass; + + /** + * 大类名称 + */ + private Date bigClassName; + + /** + * 小类Id + */ + private String smallClass; + + /** + * 小类名称 + */ + private String smallClassName; + + /** + * 描述 + */ + private String remakes; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java new file mode 100644 index 0000000000..6a57281d10 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java @@ -0,0 +1,526 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcResiUserDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * + */ + private String agencyId; + + /** + * + */ + private String pids; + + /** + * 网格ID + */ + private String gridId; + + /** + * 所属小区ID + */ + private String villageId; + + /** + * 所属楼宇Id + */ + private String buildId; + + /** + * 所属家庭Id + */ + private String homeId; + + /** + * 是否本地户籍 + */ + private String isBdhj; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String mobile; + + /** + * 性别 + */ + private String gender; + + /** + * 身份证号 + */ + private String idCard; + + /** + * 出生日期 + */ + private String birthday; + + /** + * 备注 + */ + private String remarks; + + /** + * 联系人 + */ + private String contacts; + + /** + * 联系人电话 + */ + private String contactsMobile; + + /** + * 九小场所url + */ + private String ninePlace; + + /** + * 是否党员 + */ + private String isParty; + + /** + * 是否低保户 + */ + private String isDbh; + + /** + * 是否保障房 + */ + private String isEnsureHouse; + + /** + * 是否失业 + */ + private String isUnemployed; + + /** + * 是否育龄妇女 + */ + private String isYlfn; + + /** + * 是否退役军人 + */ + private String isVeterans; + + /** + * 是否统战人员 + */ + private String isUnitedFront; + + /** + * 是否信访人员 + */ + private String isXfry; + + /** + * 是否志愿者 + */ + private String isVolunteer; + + /** + * 是否老年人 + */ + private String isOldPeople; + + /** + * 是否空巢 + */ + private String isKc; + + /** + * 是否失独 + */ + private String isSd; + + /** + * 是否失能 + */ + private String isSn; + + /** + * 是否失智 + */ + private String isSz; + + /** + * 是否残疾 + */ + private String isCj; + + /** + * 是否大病 + */ + private String isDb; + + /** + * 是否慢病 + */ + private String isMb; + + /** + * 是否特殊人群 + */ + private String isSpecial; + + /** + * 文化程度【字典表】 + */ + private String culture; + + /** + * 文化程度备注 + */ + private String cultureRemakes; + + /** + * 特长【字典表】 + */ + private String specialSkill; + + /** + * 兴趣爱好 + */ + private String hobby; + + /** + * 兴趣爱好备注 + */ + private String hobbyRemakes; + + /** + * 宗教信仰 + */ + private String faith; + + /** + * 宗教信仰备注 + */ + private String faithRemakes; + + /** + * 残疾类别【字典表】 + */ + private String cjlb; + + /** + * 残疾登记(状况)【字典表】 + */ + private String cjzk; + + /** + * 残疾证号 + */ + private String cjzh; + + /** + * 残疾说明 + */ + private String cjsm; + + /** + * 有无监护人【yes no】 + */ + private String ynJdr; + + /** + * 有无技能特长【yes no】 + */ + private String ynJntc; + + /** + * 有无劳动能力 + */ + private String ynLdnl; + + /** + * 有无非义务教育阶段助学【yes no】 + */ + private String ynFywjyjdzx; + + /** + * 所患大病 + */ + private String shdb; + + /** + * 患大病时间 + */ + private Date dbsj; + + /** + * 所患慢性病 + */ + private String shmxb; + + /** + * 患慢性病时间 + */ + private Date mxbsj; + + /** + * 是否参保 + */ + private String isCb; + + /** + * 自付金额 + */ + private String zfje; + + /** + * 救助金额 + */ + private String jzje; + + /** + * 救助时间[yyyy-MM-dd] + */ + private Date jzsj; + + /** + * 享受救助明细序号 + */ + private String jzmxxh; + + /** + * 健康信息备注 + */ + private String healthRemakes; + + /** + * 工作单位 + */ + private String gzdw; + + /** + * 职业 + */ + private String zy; + + /** + * 离退休时间 + */ + private Date ltxsj; + + /** + * 工作信息备注 + */ + private String workRemake; + + /** + * 退休金额 + */ + private String txje; + + /** + * 月收入 + */ + private String ysr; + + /** + * 是否经济低保 + */ + private String isJjdb; + + /** + * 籍贯 + */ + private String jg; + + /** + * 户籍所在地 + */ + private String hjszd; + + /** + * 现居住地 + */ + private String xjzd; + + /** + * 人户情况 + */ + private String rhzk; + + /** + * 居住信息备注 + */ + private String jzxxRemakes; + + /** + * 民族【字典表】 + */ + private String mz; + + /** + * 与户主关系【字典表】 + */ + private String yhzgx; + + /** + * 居住情况【字典表】 + */ + private String jzqk; + + /** + * 婚姻状况【字典表】 + */ + private String hyzk; + + /** + * 配偶情况【字典表】 + */ + private String poqk; + + /** + * 有无赡养人 + */ + private String ynSyr; + + /** + * 与赡养人关系【字典表】 + */ + private String ysyrgx; + + /** + * 赡养人电话 + */ + private String syrMobile; + + /** + * 家庭信息备注 + */ + private String jtxxRemakes; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + + /** + * 预留字段6 + */ + private String field6; + + /** + * 预留字段7 + */ + private String field7; + + /** + * 预留字段8 + */ + private String field8; + + /** + * 预留字段9 + */ + private String field9; + + /** + * 预留字段10 + */ + private String field10; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSpecialDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSpecialDTO.java new file mode 100644 index 0000000000..bc9458b2d0 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcSpecialDTO.java @@ -0,0 +1,111 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 特殊人群 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcSpecialDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 人群类别【字典表】 + */ + private String specialRqlb; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java new file mode 100644 index 0000000000..930d40c706 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java @@ -0,0 +1,151 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 失业人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcUnemployedDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 原工作单位 + */ + private String ygzdw; + + /** + * 失业人员类别【字典表】 + */ + private String syrylb; + + /** + * 失业时间 + */ + private Date sysj; + + /** + * 失业证号 + */ + private String syzh; + + /** + * 再就业优惠证号 + */ + private String zjyyhzh; + + /** + * 技术特长 + */ + private String jstc; + + /** + * 失业原因【字典表】 + */ + private String syyy; + + /** + * 是否就业困难对象 + */ + private String isJykndx; + + /** + * 劳动能力就业愿望 + */ + private String jyyw; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnitedFrontDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnitedFrontDTO.java new file mode 100644 index 0000000000..c6be71bc6c --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnitedFrontDTO.java @@ -0,0 +1,116 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 统战人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcUnitedFrontDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 职务职业 + */ + private String zwzy; + + /** + * 探亲情况 + */ + private String tqqk; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java new file mode 100644 index 0000000000..9a0c6399aa --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java @@ -0,0 +1,146 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 退役军人 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcVeteransDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 入伍时间 + */ + private Date rwsj; + + /** + * 退伍时间 + */ + private Date twsj; + + /** + * 服役单位 + */ + private String fydw; + + /** + * 接收单位 + */ + private String jsdw; + + /** + * 待安置补助金 + */ + private String dazbzj; + + /** + * 培训状况 + */ + private String pxzk; + + /** + * 参战时间【年月日区间值yyyy-MM-dd~yyyy-MM-dd】 + */ + private Date czsj; + + /** + * 现就业情况 + */ + private String xjyqk; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVolunteerDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVolunteerDTO.java new file mode 100644 index 0000000000..4a49527d42 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVolunteerDTO.java @@ -0,0 +1,116 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 志愿者 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcVolunteerDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 类别【字典表】 + */ + private String volunteerCategory; + + /** + * 备注 + */ + private String volunteerRemark; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java new file mode 100644 index 0000000000..37d3bde4d5 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcResiUserDTO; +import com.epmet.excel.IcResiUserExcel; +import com.epmet.service.IcResiUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@RestController +@RequestMapping("icresiuser") +public class IcResiUserController { + + @Autowired + private IcResiUserService icResiUserService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icResiUserService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcResiUserDTO data = icResiUserService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcResiUserDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icResiUserService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcResiUserDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icResiUserService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icResiUserService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icResiUserService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcResiUserExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java new file mode 100644 index 0000000000..85ee8dc125 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcResiUserEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Mapper +public interface IcResiUserDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java new file mode 100644 index 0000000000..917382ceb9 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_ensure_house") +public class IcEnsureHouseEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 住房性质【字典表】 + */ + private String zfxz; + + /** + * 保障类型 + */ + private String bzlx; + + /** + * 发证日期 + */ + private Date fzrq; + + /** + * 补贴编号 + */ + private String btbh; + + /** + * 补贴金额 + */ + private String btje; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcOldPeopleEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcOldPeopleEntity.java new file mode 100644 index 0000000000..ba5835c5da --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcOldPeopleEntity.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_old_people") +public class IcOldPeopleEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 高龄补助 + */ + private String glbz; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java new file mode 100644 index 0000000000..90b543dd6e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java @@ -0,0 +1,116 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_party_member") +public class IcPartyMemberEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 入党时间 + */ + private Date rdsj; + + /** + * 转正时间 + */ + private Date zzsj; + + /** + * 所属支部 + */ + private String sszb; + + /** + * 是否流动党员 + */ + private String isLd; + + /** + * 流动党员活动证号 + */ + private String ldzh; + + /** + * 职务 + */ + private String partyZw; + + /** + * 是否退休 + */ + private String isTx; + + /** + * 是否党员中心户 + */ + private String isDyzxh; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java new file mode 100644 index 0000000000..6e2b9ac670 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_resi_demand") +public class IcResiDemandEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 大类Id + */ + private Date bigClass; + + /** + * 大类名称 + */ + private Date bigClassName; + + /** + * 小类Id + */ + private String smallClass; + + /** + * 小类名称 + */ + private String smallClassName; + + /** + * 描述 + */ + private String remakes; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java new file mode 100644 index 0000000000..0129c18843 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java @@ -0,0 +1,496 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_resi_user") +public class IcResiUserEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * + */ + private String agencyId; + + /** + * + */ + private String pids; + + /** + * 网格ID + */ + private String gridId; + + /** + * 所属小区ID + */ + private String villageId; + + /** + * 所属楼宇Id + */ + private String buildId; + + /** + * 所属家庭Id + */ + private String homeId; + + /** + * 是否本地户籍 + */ + private String isBdhj; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String mobile; + + /** + * 性别 + */ + private String gender; + + /** + * 身份证号 + */ + private String idCard; + + /** + * 出生日期 + */ + private String birthday; + + /** + * 备注 + */ + private String remarks; + + /** + * 联系人 + */ + private String contacts; + + /** + * 联系人电话 + */ + private String contactsMobile; + + /** + * 九小场所url + */ + private String ninePlace; + + /** + * 是否党员 + */ + private String isParty; + + /** + * 是否低保户 + */ + private String isDbh; + + /** + * 是否保障房 + */ + private String isEnsureHouse; + + /** + * 是否失业 + */ + private String isUnemployed; + + /** + * 是否育龄妇女 + */ + private String isYlfn; + + /** + * 是否退役军人 + */ + private String isVeterans; + + /** + * 是否统战人员 + */ + private String isUnitedFront; + + /** + * 是否信访人员 + */ + private String isXfry; + + /** + * 是否志愿者 + */ + private String isVolunteer; + + /** + * 是否老年人 + */ + private String isOldPeople; + + /** + * 是否空巢 + */ + private String isKc; + + /** + * 是否失独 + */ + private String isSd; + + /** + * 是否失能 + */ + private String isSn; + + /** + * 是否失智 + */ + private String isSz; + + /** + * 是否残疾 + */ + private String isCj; + + /** + * 是否大病 + */ + private String isDb; + + /** + * 是否慢病 + */ + private String isMb; + + /** + * 是否特殊人群 + */ + private String isSpecial; + + /** + * 文化程度【字典表】 + */ + private String culture; + + /** + * 文化程度备注 + */ + private String cultureRemakes; + + /** + * 特长【字典表】 + */ + private String specialSkill; + + /** + * 兴趣爱好 + */ + private String hobby; + + /** + * 兴趣爱好备注 + */ + private String hobbyRemakes; + + /** + * 宗教信仰 + */ + private String faith; + + /** + * 宗教信仰备注 + */ + private String faithRemakes; + + /** + * 残疾类别【字典表】 + */ + private String cjlb; + + /** + * 残疾登记(状况)【字典表】 + */ + private String cjzk; + + /** + * 残疾证号 + */ + private String cjzh; + + /** + * 残疾说明 + */ + private String cjsm; + + /** + * 有无监护人【yes no】 + */ + private String ynJdr; + + /** + * 有无技能特长【yes no】 + */ + private String ynJntc; + + /** + * 有无劳动能力 + */ + private String ynLdnl; + + /** + * 有无非义务教育阶段助学【yes no】 + */ + private String ynFywjyjdzx; + + /** + * 所患大病 + */ + private String shdb; + + /** + * 患大病时间 + */ + private Date dbsj; + + /** + * 所患慢性病 + */ + private String shmxb; + + /** + * 患慢性病时间 + */ + private Date mxbsj; + + /** + * 是否参保 + */ + private String isCb; + + /** + * 自付金额 + */ + private String zfje; + + /** + * 救助金额 + */ + private String jzje; + + /** + * 救助时间[yyyy-MM-dd] + */ + private Date jzsj; + + /** + * 享受救助明细序号 + */ + private String jzmxxh; + + /** + * 健康信息备注 + */ + private String healthRemakes; + + /** + * 工作单位 + */ + private String gzdw; + + /** + * 职业 + */ + private String zy; + + /** + * 离退休时间 + */ + private Date ltxsj; + + /** + * 工作信息备注 + */ + private String workRemake; + + /** + * 退休金额 + */ + private String txje; + + /** + * 月收入 + */ + private String ysr; + + /** + * 是否经济低保 + */ + private String isJjdb; + + /** + * 籍贯 + */ + private String jg; + + /** + * 户籍所在地 + */ + private String hjszd; + + /** + * 现居住地 + */ + private String xjzd; + + /** + * 人户情况 + */ + private String rhzk; + + /** + * 居住信息备注 + */ + private String jzxxRemakes; + + /** + * 民族【字典表】 + */ + private String mz; + + /** + * 与户主关系【字典表】 + */ + private String yhzgx; + + /** + * 居住情况【字典表】 + */ + private String jzqk; + + /** + * 婚姻状况【字典表】 + */ + private String hyzk; + + /** + * 配偶情况【字典表】 + */ + private String poqk; + + /** + * 有无赡养人 + */ + private String ynSyr; + + /** + * 与赡养人关系【字典表】 + */ + private String ysyrgx; + + /** + * 赡养人电话 + */ + private String syrMobile; + + /** + * 家庭信息备注 + */ + private String jtxxRemakes; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + + /** + * 预留字段6 + */ + private String field6; + + /** + * 预留字段7 + */ + private String field7; + + /** + * 预留字段8 + */ + private String field8; + + /** + * 预留字段9 + */ + private String field9; + + /** + * 预留字段10 + */ + private String field10; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSpecialEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSpecialEntity.java new file mode 100644 index 0000000000..4a63f28cf5 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSpecialEntity.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_special") +public class IcSpecialEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 人群类别【字典表】 + */ + private String specialRqlb; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java new file mode 100644 index 0000000000..c81f359e09 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java @@ -0,0 +1,121 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_unemployed") +public class IcUnemployedEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 原工作单位 + */ + private String ygzdw; + + /** + * 失业人员类别【字典表】 + */ + private String syrylb; + + /** + * 失业时间 + */ + private Date sysj; + + /** + * 失业证号 + */ + private String syzh; + + /** + * 再就业优惠证号 + */ + private String zjyyhzh; + + /** + * 技术特长 + */ + private String jstc; + + /** + * 失业原因【字典表】 + */ + private String syyy; + + /** + * 是否就业困难对象 + */ + private String isJykndx; + + /** + * 劳动能力就业愿望 + */ + private String jyyw; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnitedFrontEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnitedFrontEntity.java new file mode 100644 index 0000000000..71b0939e67 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnitedFrontEntity.java @@ -0,0 +1,86 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_united_front") +public class IcUnitedFrontEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 职务职业 + */ + private String zwzy; + + /** + * 探亲情况 + */ + private String tqqk; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java new file mode 100644 index 0000000000..68720a6be5 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java @@ -0,0 +1,116 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_veterans") +public class IcVeteransEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 入伍时间 + */ + private Date rwsj; + + /** + * 退伍时间 + */ + private Date twsj; + + /** + * 服役单位 + */ + private String fydw; + + /** + * 接收单位 + */ + private String jsdw; + + /** + * 待安置补助金 + */ + private String dazbzj; + + /** + * 培训状况 + */ + private String pxzk; + + /** + * 参战时间【年月日区间值yyyy-MM-dd~yyyy-MM-dd】 + */ + private Date czsj; + + /** + * 现就业情况 + */ + private String xjyqk; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVolunteerEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVolunteerEntity.java new file mode 100644 index 0000000000..b5693d7e7f --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVolunteerEntity.java @@ -0,0 +1,86 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-10-26 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_volunteer") +public class IcVolunteerEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 主表Id + */ + private String icResiUser; + + /** + * 类别【字典表】 + */ + private String volunteerCategory; + + /** + * 备注 + */ + private String volunteerRemark; + + /** + * 预留字段1 + */ + private String field1; + + /** + * 预留字段2 + */ + private String field2; + + /** + * 预留字段3 + */ + private String field3; + + /** + * 预留字段4 + */ + private String field4; + + /** + * 预留字段5 + */ + private String field5; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java new file mode 100644 index 0000000000..ea5f69f3d3 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java @@ -0,0 +1,92 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 保障房 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcEnsureHouseExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "住房性质【字典表】") + private String zfxz; + + @Excel(name = "保障类型") + private String bzlx; + + @Excel(name = "发证日期") + private Date fzrq; + + @Excel(name = "补贴编号") + private String btbh; + + @Excel(name = "补贴金额") + private String btje; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcOldPeopleExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcOldPeopleExcel.java new file mode 100644 index 0000000000..42294485ea --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcOldPeopleExcel.java @@ -0,0 +1,80 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 老年人 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcOldPeopleExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "高龄补助") + private String glbz; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java new file mode 100644 index 0000000000..71e3ed92a9 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 党员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcPartyMemberExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "入党时间") + private Date rdsj; + + @Excel(name = "转正时间") + private Date zzsj; + + @Excel(name = "所属支部") + private String sszb; + + @Excel(name = "是否流动党员") + private String isLd; + + @Excel(name = "流动党员活动证号") + private String ldzh; + + @Excel(name = "职务") + private String partyZw; + + @Excel(name = "是否退休") + private String isTx; + + @Excel(name = "是否党员中心户") + private String isDyzxh; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java new file mode 100644 index 0000000000..8f257a3264 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java @@ -0,0 +1,92 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 居民需求 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcResiDemandExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "大类Id") + private Date bigClass; + + @Excel(name = "大类名称") + private Date bigClassName; + + @Excel(name = "小类Id") + private String smallClass; + + @Excel(name = "小类名称") + private String smallClassName; + + @Excel(name = "描述") + private String remakes; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java new file mode 100644 index 0000000000..a3abac4d57 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java @@ -0,0 +1,329 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcResiUserExcel { + + @Excel(name = "主键") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "") + private String agencyId; + + @Excel(name = "") + private String pids; + + @Excel(name = "网格ID") + private String gridId; + + @Excel(name = "所属小区ID") + private String villageId; + + @Excel(name = "所属楼宇Id") + private String buildId; + + @Excel(name = "所属家庭Id") + private String homeId; + + @Excel(name = "是否本地户籍") + private String isBdhj; + + @Excel(name = "姓名") + private String name; + + @Excel(name = "手机号") + private String mobile; + + @Excel(name = "性别") + private String gender; + + @Excel(name = "身份证号") + private String idCard; + + @Excel(name = "出生日期") + private String birthday; + + @Excel(name = "备注") + private String remarks; + + @Excel(name = "联系人") + private String contacts; + + @Excel(name = "联系人电话") + private String contactsMobile; + + @Excel(name = "九小场所url") + private String ninePlace; + + @Excel(name = "是否党员") + private String isParty; + + @Excel(name = "是否低保户") + private String isDbh; + + @Excel(name = "是否保障房") + private String isEnsureHouse; + + @Excel(name = "是否失业") + private String isUnemployed; + + @Excel(name = "是否育龄妇女") + private String isYlfn; + + @Excel(name = "是否退役军人") + private String isVeterans; + + @Excel(name = "是否统战人员") + private String isUnitedFront; + + @Excel(name = "是否信访人员") + private String isXfry; + + @Excel(name = "是否志愿者") + private String isVolunteer; + + @Excel(name = "是否老年人") + private String isOldPeople; + + @Excel(name = "是否空巢") + private String isKc; + + @Excel(name = "是否失独") + private String isSd; + + @Excel(name = "是否失能") + private String isSn; + + @Excel(name = "是否失智") + private String isSz; + + @Excel(name = "是否残疾") + private String isCj; + + @Excel(name = "是否大病") + private String isDb; + + @Excel(name = "是否慢病") + private String isMb; + + @Excel(name = "是否特殊人群") + private String isSpecial; + + @Excel(name = "文化程度【字典表】") + private String culture; + + @Excel(name = "文化程度备注") + private String cultureRemakes; + + @Excel(name = "特长【字典表】") + private String specialSkill; + + @Excel(name = "兴趣爱好") + private String hobby; + + @Excel(name = "兴趣爱好备注") + private String hobbyRemakes; + + @Excel(name = "宗教信仰") + private String faith; + + @Excel(name = "宗教信仰备注") + private String faithRemakes; + + @Excel(name = "残疾类别【字典表】") + private String cjlb; + + @Excel(name = "残疾登记(状况)【字典表】") + private String cjzk; + + @Excel(name = "残疾证号") + private String cjzh; + + @Excel(name = "残疾说明") + private String cjsm; + + @Excel(name = "有无监护人【yes no】") + private String ynJdr; + + @Excel(name = "有无技能特长【yes no】") + private String ynJntc; + + @Excel(name = "有无劳动能力") + private String ynLdnl; + + @Excel(name = "有无非义务教育阶段助学【yes no】") + private String ynFywjyjdzx; + + @Excel(name = "所患大病") + private String shdb; + + @Excel(name = "患大病时间") + private Date dbsj; + + @Excel(name = "所患慢性病") + private String shmxb; + + @Excel(name = "患慢性病时间") + private Date mxbsj; + + @Excel(name = "是否参保") + private String isCb; + + @Excel(name = "自付金额") + private String zfje; + + @Excel(name = "救助金额") + private String jzje; + + @Excel(name = "救助时间[yyyy-MM-dd]") + private Date jzsj; + + @Excel(name = "享受救助明细序号") + private String jzmxxh; + + @Excel(name = "健康信息备注") + private String healthRemakes; + + @Excel(name = "工作单位") + private String gzdw; + + @Excel(name = "职业") + private String zy; + + @Excel(name = "离退休时间") + private Date ltxsj; + + @Excel(name = "工作信息备注") + private String workRemake; + + @Excel(name = "退休金额") + private String txje; + + @Excel(name = "月收入") + private String ysr; + + @Excel(name = "是否经济低保") + private String isJjdb; + + @Excel(name = "籍贯") + private String jg; + + @Excel(name = "户籍所在地") + private String hjszd; + + @Excel(name = "现居住地") + private String xjzd; + + @Excel(name = "人户情况") + private String rhzk; + + @Excel(name = "居住信息备注") + private String jzxxRemakes; + + @Excel(name = "民族【字典表】") + private String mz; + + @Excel(name = "与户主关系【字典表】") + private String yhzgx; + + @Excel(name = "居住情况【字典表】") + private String jzqk; + + @Excel(name = "婚姻状况【字典表】") + private String hyzk; + + @Excel(name = "配偶情况【字典表】") + private String poqk; + + @Excel(name = "有无赡养人") + private String ynSyr; + + @Excel(name = "与赡养人关系【字典表】") + private String ysyrgx; + + @Excel(name = "赡养人电话") + private String syrMobile; + + @Excel(name = "家庭信息备注") + private String jtxxRemakes; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + @Excel(name = "预留字段6") + private String field6; + + @Excel(name = "预留字段7") + private String field7; + + @Excel(name = "预留字段8") + private String field8; + + @Excel(name = "预留字段9") + private String field9; + + @Excel(name = "预留字段10") + private String field10; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcSpecialExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcSpecialExcel.java new file mode 100644 index 0000000000..fb62227dff --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcSpecialExcel.java @@ -0,0 +1,80 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 特殊人群 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcSpecialExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "人群类别【字典表】") + private String specialRqlb; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java new file mode 100644 index 0000000000..9c1b4d7e00 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java @@ -0,0 +1,104 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 失业人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcUnemployedExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "原工作单位") + private String ygzdw; + + @Excel(name = "失业人员类别【字典表】") + private String syrylb; + + @Excel(name = "失业时间") + private Date sysj; + + @Excel(name = "失业证号") + private String syzh; + + @Excel(name = "再就业优惠证号") + private String zjyyhzh; + + @Excel(name = "技术特长") + private String jstc; + + @Excel(name = "失业原因【字典表】") + private String syyy; + + @Excel(name = "是否就业困难对象") + private String isJykndx; + + @Excel(name = "劳动能力就业愿望") + private String jyyw; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnitedFrontExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnitedFrontExcel.java new file mode 100644 index 0000000000..ee65b95670 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnitedFrontExcel.java @@ -0,0 +1,83 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 统战人员 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcUnitedFrontExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "职务职业") + private String zwzy; + + @Excel(name = "探亲情况") + private String tqqk; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java new file mode 100644 index 0000000000..8a290d5b3e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java @@ -0,0 +1,101 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 退役军人 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcVeteransExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "入伍时间") + private Date rwsj; + + @Excel(name = "退伍时间") + private Date twsj; + + @Excel(name = "服役单位") + private String fydw; + + @Excel(name = "接收单位") + private String jsdw; + + @Excel(name = "待安置补助金") + private String dazbzj; + + @Excel(name = "培训状况") + private String pxzk; + + @Excel(name = "参战时间【年月日区间值yyyy-MM-dd~yyyy-MM-dd】") + private Date czsj; + + @Excel(name = "现就业情况") + private String xjyqk; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVolunteerExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVolunteerExcel.java new file mode 100644 index 0000000000..98c3f56002 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVolunteerExcel.java @@ -0,0 +1,83 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 志愿者 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Data +public class IcVolunteerExcel { + + @Excel(name = "唯一标识") + private String id; + + @Excel(name = "客户Id customer.id") + private String customerId; + + @Excel(name = "主表Id") + private String icResiUser; + + @Excel(name = "类别【字典表】") + private String volunteerCategory; + + @Excel(name = "备注") + private String volunteerRemark; + + @Excel(name = "删除标识 0.未删除 1.已删除") + private Integer delFlag; + + @Excel(name = "乐观锁") + private Integer revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private Date createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + @Excel(name = "预留字段1") + private String field1; + + @Excel(name = "预留字段2") + private String field2; + + @Excel(name = "预留字段3") + private String field3; + + @Excel(name = "预留字段4") + private String field4; + + @Excel(name = "预留字段5") + private String field5; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java new file mode 100644 index 0000000000..1986418b32 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java @@ -0,0 +1,47 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.redis; + +import com.epmet.commons.tools.redis.RedisUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Component +public class IcResiUserRedis { + @Autowired + private RedisUtils redisUtils; + + public void delete(Object[] ids) { + + } + + public void set(){ + + } + + public String get(String id){ + return null; + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java new file mode 100644 index 0000000000..5f66ecb881 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcResiUserDTO; +import com.epmet.entity.IcResiUserEntity; + +import java.util.List; +import java.util.Map; + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface IcResiUserService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-26 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-26 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcResiUserDTO + * @author generator + * @date 2021-10-26 + */ + IcResiUserDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void save(IcResiUserDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-26 + */ + void update(IcResiUserDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java new file mode 100644 index 0000000000..002d3b248f --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -0,0 +1,104 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcResiUserDao; +import com.epmet.dto.IcResiUserDTO; +import com.epmet.entity.IcResiUserEntity; +import com.epmet.redis.IcResiUserRedis; +import com.epmet.service.IcResiUserService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Service +public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService { + + @Autowired + private IcResiUserRedis icResiUserRedis; + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcResiUserDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcResiUserDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcResiUserDTO get(String id) { + IcResiUserEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcResiUserDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcResiUserDTO dto) { + IcResiUserEntity entity = ConvertUtils.sourceToTarget(dto, IcResiUserEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcResiUserDTO dto) { + IcResiUserEntity entity = ConvertUtils.sourceToTarget(dto, IcResiUserEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml new file mode 100644 index 0000000000..135f7b6635 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From 254676cbcde8597153a8a32d5f0767209d17bc07 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Tue, 26 Oct 2021 14:09:04 +0800 Subject: [PATCH 007/253] =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/form/IcResiUserFormDTO.java | 25 +++++++++++++++++++ .../controller/IcResiUserController.java | 24 ++++++++++++++++++ .../com/epmet/service/IcResiUserService.java | 14 +++++++++++ .../service/impl/IcResiUserServiceImpl.java | 19 ++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java new file mode 100644 index 0000000000..29ea3fa9b3 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java @@ -0,0 +1,25 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 居民注册信息查询入参DTO + * @Author yinzuomei + * @Date 2020/3/30 10:26 + */ +@Data +public class IcResiUserFormDTO implements Serializable { + private static final long serialVersionUID = 9156247659994638103L; + @NotBlank(message = "徽章id不能为空", groups = {ManageGroup.class}) + private String badgeId; + /** + * 网格Id + */ + @NotBlank(message = "网格id不能为空", groups = {AuditGroup.class}) + private String gridId; + public interface ManageGroup {} + public interface AuditGroup {} +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 37d3bde4d5..5dca820caf 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -17,7 +17,9 @@ package com.epmet.controller; +import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -26,6 +28,8 @@ import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.UserResiInfoDTO; +import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.excel.IcResiUserExcel; import com.epmet.service.IcResiUserService; import org.springframework.beans.factory.annotation.Autowired; @@ -91,4 +95,24 @@ public class IcResiUserController { ExcelUtils.exportExcelToTarget(response, null, list, IcResiUserExcel.class); } + /** + * @Author sun + * @Description 党建互联平台--保存居民信息 + **/ + @PostMapping("add") + public Result add(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserFormDTO formDTO) { + icResiUserService.add(formDTO); + return new Result(); + } + + /** + * @Author sun + * @Description 党建互联平台--修改居民信息 + **/ + @PostMapping("edit") + public Result edit(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserFormDTO formDTO) { + icResiUserService.edit(formDTO); + return new Result(); + } + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 5f66ecb881..507e214ef5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -19,7 +19,9 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.Result; import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.entity.IcResiUserEntity; import java.util.List; @@ -92,4 +94,16 @@ public interface IcResiUserService extends BaseService { * @date 2021-10-26 */ void delete(String[] ids); + + /** + * @Author sun + * @Description 党建互联平台--保存居民信息 + **/ + void add(IcResiUserFormDTO formDTO); + + /** + * @Author sun + * @Description 党建互联平台--修改居民信息 + **/ + void edit(IcResiUserFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 002d3b248f..3a8c2b195a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -25,6 +25,7 @@ import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.entity.IcResiUserEntity; import com.epmet.redis.IcResiUserRedis; import com.epmet.service.IcResiUserService; @@ -101,4 +102,22 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Tue, 26 Oct 2021 14:33:10 +0800 Subject: [PATCH 008/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E7=BA=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dto/result/MapOrgResultDTO.java | 6 ++++++ .../main/java/com/epmet/dto/result/MapSonOrgResultDTO.java | 6 ++++++ .../java/com/epmet/service/impl/AgencyServiceImpl.java | 7 +++++++ .../src/main/resources/mapper/CustomerAgencyDao.xml | 3 +++ 4 files changed, 22 insertions(+) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java index 7f92e3bdc1..5ad5436d9a 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapOrgResultDTO.java @@ -54,6 +54,11 @@ public class MapOrgResultDTO implements Serializable { */ private String coordinates; + /** + * 组织级别 + */ + private String agencyLevel; + /** * 下级结果集 */ @@ -67,5 +72,6 @@ public class MapOrgResultDTO implements Serializable { this.level = ""; this.coordinates = ""; this.children = new ArrayList<>(); + this.agencyLevel = ""; } } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java index 77cb78266c..86b1a95c14 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/MapSonOrgResultDTO.java @@ -53,6 +53,11 @@ public class MapSonOrgResultDTO implements Serializable { */ private String coordinates; + /** + * 组织级别 + */ + private String agencyLevel; + public MapSonOrgResultDTO() { this.longitudeOrigin = ""; this.latitudeOrigin = ""; @@ -60,5 +65,6 @@ public class MapSonOrgResultDTO implements Serializable { this.name = ""; this.level = ""; this.coordinates = ""; + this.agencyLevel = ""; } } 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 3b5464f498..9de97fafbb 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 @@ -561,6 +561,11 @@ public class AgencyServiceImpl implements AgencyService { /** * @Description 【地图配置】组织查询 + * 根据level查询去查询不同的表,类型,组织:agency,网格:grid,小区:neighborHood + * 组织类型去查 customer_agency,看本级是不是 community,是,下级组织就是网格,查询customer_grid,不是,继续查customer_agency + * 网格类型去查 查询customer_grid,下级去查 ic_neighbor_hood, + * 当前组织没有经纬度的话,直接赋值根组织的经纬度, + * 下级组织经纬度为空的话,直接赋值上级的经纬度 * @param formDTO * @param tokenDto * @author zxc @@ -585,6 +590,7 @@ public class AgencyServiceImpl implements AgencyService { result = ConvertUtils.sourceToTarget(entity,MapOrgResultDTO.class); result.setName(entity.getOrganizationName()); result.setLevel(formDTO.getLevel()); + result.setAgencyLevel(entity.getLevel()); result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? new BigDecimal(customerAgencyEntity.getLatitude()) : new BigDecimal(entity.getLatitude())); result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? new BigDecimal(customerAgencyEntity.getLongitude()) : new BigDecimal(entity.getLongitude())); if (entity.getLevel().equals(OrgInfoConstant.COMMUNITY)){ @@ -622,6 +628,7 @@ public class AgencyServiceImpl implements AgencyService { result = ConvertUtils.sourceToTarget(entity,MapOrgResultDTO.class); result.setName(entity.getGridName()); result.setLevel(formDTO.getLevel()); + result.setAgencyLevel(OrgInfoConstant.GRID); result.setLatitude(StringUtils.isBlank(entity.getLatitude()) ? new BigDecimal(customerAgencyEntity.getLatitude()) : new BigDecimal(entity.getLatitude())); result.setLongitude(StringUtils.isBlank(entity.getLongitude()) ? new BigDecimal(customerAgencyEntity.getLongitude()) : new BigDecimal(entity.getLongitude())); List son = customerAgencyDao.selectSonOrg(formDTO.getOrgId(), OrgInfoConstant.NEIGHBOR_HOOD); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml index 3dcb3a472e..81696777f2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml @@ -584,14 +584,17 @@ organization_name AS name, 'agency' AS level, + LEVEL AS agencyLevel, grid_name AS name, 'grid' AS level, + 'grid' AS agencyLevel, neighbor_hood_name AS name, 'neighborHood' AS level, + 'neighborHood' AS agencyLevel, IFNULL(longitude,'') AS longitudeOrigin, IFNULL(latitude,'') AS latitudeOrigin, From 6964d4cae9aee794e038a2cbc0d2419777f618de Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 26 Oct 2021 14:42:58 +0800 Subject: [PATCH 009/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/IcFormItemGroupDTO.java | 7 +- .../epmet/dto/form/CustomerFormQueryDTO.java | 19 +++ .../dto/result/CustomerFormResultDTO.java | 37 ++++++ .../com/epmet/dto/result/FormGroupDTO.java | 47 ++++++++ .../java/com/epmet/dto/result/FormItem.java | 114 ++++++++++++++++++ .../java/com/epmet/dto/result/OptionDTO.java | 17 +++ .../epmet/controller/IcFormController.java | 19 ++- .../epmet/entity/IcFormItemGroupEntity.java | 7 +- .../java/com/epmet/service/IcFormService.java | 12 ++ .../epmet/service/impl/IcFormServiceImpl.java | 16 +++ 10 files changed, 286 insertions(+), 9 deletions(-) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/OptionDTO.java diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java index 3c147dba78..5fe8d5de36 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemGroupDTO.java @@ -17,9 +17,10 @@ package com.epmet.dto; +import lombok.Data; + import java.io.Serializable; import java.util.Date; -import lombok.Data; /** @@ -61,7 +62,7 @@ public class IcFormItemGroupDTO implements Serializable { /** * 是否支持添加一行,1支持,默认0不支持 */ - private Integer supportAdd; + private Boolean supportAdd; /** * 名称 @@ -76,7 +77,7 @@ public class IcFormItemGroupDTO implements Serializable { /** * 1展示,0不展示,默认1 */ - private Integer display; + private Boolean display; /** * 0未删除,1已删除 diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java new file mode 100644 index 0000000000..2e66799c15 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 居民信息,点击新增,获取当前客户下的表单 + * @Author yinzuomei + * @Date 2021/10/26 1:59 下午 + */ +@Data +public class CustomerFormQueryDTO implements Serializable { + public interface AddUserInternalGroup {} + @NotBlank(message = "formCode不能为空,居民信息默认传:resi_base_info",groups =AddUserInternalGroup.class ) + private String formCode; +} + diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java new file mode 100644 index 0000000000..e5afdeddc2 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java @@ -0,0 +1,37 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 居民信息,点击新增,返回当前客户下的表单 + * @Author yinzuomei + * @Date 2021/10/26 2:13 下午 + */ +@Data +public class CustomerFormResultDTO implements Serializable { + private static final long serialVersionUID = -6541805255520766366L; + + /** + * 表单id + */ + private String formId; + + /** + * 表单左上角的名字 + */ + private String formName; + + /** + * 表单项 + */ + private List itemList; + + /** + * 表单分组 + */ + private List groupList; +} + diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java new file mode 100644 index 0000000000..ae71a9c160 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java @@ -0,0 +1,47 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 下面的的分组 + * @Author yinzuomei + * @Date 2021/10/26 2:16 下午 + */ +@Data +public class FormGroupDTO implements Serializable { + private static final long serialVersionUID = -6209767832999902538L; + /** + * 分组id + */ + private String groupId; + + /** + * 分组的名字,例如:教育信息、家庭信息 + */ + private String label; + + /** + * 排序 + */ + private Integer sort; + + + /** + * 是否支持添加一行,1支持,默认0不支持 + */ + private Boolean supportAdd; + + /** + * 目前这些分组,没有拆开子表,所以默认:ic_resi_user + */ + private String tableName; + + /** + * 分组里面的组件 + */ + private List itemList; +} + diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java new file mode 100644 index 0000000000..2059997cc8 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java @@ -0,0 +1,114 @@ +package com.epmet.dto.result; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 表单项 + * @Author yinzuomei + * @Date 2021/10/26 2:15 下午 + */ +@Data +public class FormItem implements Serializable { + private static final long serialVersionUID = 7443085469505238040L; + + /** + * 父项ID + */ + private String itemId; + + /** + * 默认:ic_resi_user + */ + private String tableName; + + /** + * 父项ID + */ + private String parentItemId; + + /** + * 项标签 + */ + private String label; + + /** + * 控件类型,EG:INPUT;从字典获取 + */ + private String itemType; + + /** + * 分组ID,'默认,NONE' + */ + private String itemGroupId; + + /** + * 是否必填,1必填。0不必填 + */ + private Integer required; + + /** + * 手机号:mobile; 身份证:id_card + */ + private String validType; + + /** + * 默认值 + */ + private String defaultValue; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; + + /** + * 排序 + */ + private Integer sort; + + /** + * 占位提示语 + */ + private String placeholder; + + /** + * 是否查询显示,1展示。0不展示 + */ + @JsonIgnore + private Integer searchDisplay; + + /** + * 是否列表显示,1展示,0不展示 + */ + @JsonIgnore + private Integer listDisplay; + + /** + * 是否需要支持数据分析,1支持。0不支持 + */ + @JsonIgnore + private Integer dataAnalyse; + + /** + * 列名 + */ + private String columnName; + + private List options; + + + /** + * 当前组件,要追加分组 + */ + private FormGroupDTO childGroup; +} + diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/OptionDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/OptionDTO.java new file mode 100644 index 0000000000..890b2c054b --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/OptionDTO.java @@ -0,0 +1,17 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description 下拉框、单选框的值 + * @Author yinzuomei + * @Date 2021/10/26 2:32 下午 + */ +@Data +public class OptionDTO implements Serializable { + private String label; + private String value; +} + diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 4e9bf2d751..bb876ffa7a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -23,9 +23,11 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; -import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcFormDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.excel.IcFormExcel; import com.epmet.service.IcFormService; import org.springframework.beans.factory.annotation.Autowired; @@ -91,4 +93,19 @@ public class IcFormController { ExcelUtils.exportExcelToTarget(response, null, list, IcFormExcel.class); } + + /** + * 获取居民信息表单 + * + * @param formDto + * @return com.epmet.commons.tools.utils.Result + * @author yinzuomei + * @date 2021/10/26 2:40 下午 + */ + @PostMapping("getcustomerform") + public Result getCustomerForm(@RequestBody CustomerFormQueryDTO formDto){ + ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); + return new Result().ok(icFormService.getCustomerForm(formDto)); + + } } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java index 240f086180..29e5cec078 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemGroupEntity.java @@ -18,13 +18,10 @@ 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; - /** * 表单项分组 * @@ -61,7 +58,7 @@ public class IcFormItemGroupEntity extends BaseEpmetEntity { /** * 是否支持添加一行,1支持,默认0不支持 */ - private Integer supportAdd; + private Boolean supportAdd; /** * 名称 @@ -76,6 +73,6 @@ public class IcFormItemGroupEntity extends BaseEpmetEntity { /** * 1展示,0不展示,默认1 */ - private Integer display; + private Boolean display; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java index 176624a10e..08ae71841b 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java @@ -20,6 +20,8 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.entity.IcFormEntity; import java.util.List; @@ -92,4 +94,14 @@ public interface IcFormService extends BaseService { * @date 2021-10-26 */ void delete(String[] ids); + + /** + * 获取居民信息表单 + * + * @param formDto + * @return com.epmet.dto.result.CustomerFormResultDTO + * @author yinzuomei + * @date 2021/10/26 2:41 下午 + */ + CustomerFormResultDTO getCustomerForm(CustomerFormQueryDTO formDto); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index e9691a9151..7c476eddd8 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -25,6 +25,8 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcFormDao; import com.epmet.dto.IcFormDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.entity.IcFormEntity; import com.epmet.service.IcFormService; import org.apache.commons.lang3.StringUtils; @@ -97,4 +99,18 @@ public class IcFormServiceImpl extends BaseServiceImpl baseDao.deleteBatchIds(Arrays.asList(ids)); } + /** + * 获取居民信息表单 + * + * @param formDto + * @return com.epmet.dto.result.CustomerFormResultDTO + * @author yinzuomei + * @date 2021/10/26 2:41 下午 + */ + @Override + public CustomerFormResultDTO getCustomerForm(CustomerFormQueryDTO formDto) { + //todo + return null; + } + } \ No newline at end of file From f8ce7eb67ae24f90c9d56176bc3f0f807514a3a5 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 26 Oct 2021 15:15:09 +0800 Subject: [PATCH 010/253] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=201.?= =?UTF-8?q?=E3=80=90ic=E5=9F=BA=E5=B1=82=E6=B2=BB=E7=90=86=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E3=80=91=E7=99=BB=E5=BD=95=E7=9B=B8=E5=85=B3=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/controller/IcLoinController.java | 170 ++++++++++++++++ .../com/epmet/controller/LoginController.java | 24 +++ .../dto/form/LoginByPassWordFormDTO.java | 32 ++- .../java/com/epmet/redis/CaptchaRedis.java | 25 +++ .../epmet/redis/IcLoginTicketCacheBean.java | 9 + .../com/epmet/service/CaptchaService.java | 10 + .../com/epmet/service/IcLoginService.java | 9 + .../service/impl/CaptchaServiceImpl.java | 12 ++ .../service/impl/IcLoginServiceImpl.java | 183 ++++++++++++++++++ .../tools/constant/AppClientConstant.java | 6 + .../tools/exception/EpmetErrorCode.java | 1 + .../epmet/commons/tools/redis/RedisKeys.java | 20 ++ .../tools/security/dto/IcTokenDto.java | 81 ++++++++ .../dto/form/RootOrgListByStaffIdFormDTO.java | 19 ++ .../epmet/feign/GovOrgOpenFeignClient.java | 11 ++ .../GovOrgOpenFeignClientFallback.java | 5 + .../controller/CustomerAgencyController.java | 18 ++ .../java/com/epmet/dao/CustomerAgencyDao.java | 2 + .../epmet/service/CustomerAgencyService.java | 2 + .../impl/CustomerAgencyServiceImpl.java | 4 + .../resources/mapper/CustomerAgencyDao.xml | 11 ++ .../mapper/CustomerAgencyDao.xml.rej | 18 ++ .../form/StaffBasicInfoByMobileFromDTO.java | 23 +++ 23 files changed, 692 insertions(+), 3 deletions(-) create mode 100644 epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java create mode 100644 epmet-auth/src/main/java/com/epmet/redis/IcLoginTicketCacheBean.java create mode 100644 epmet-auth/src/main/java/com/epmet/service/IcLoginService.java create mode 100644 epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/dto/IcTokenDto.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RootOrgListByStaffIdFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml.rej create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StaffBasicInfoByMobileFromDTO.java diff --git a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java new file mode 100644 index 0000000000..79b4521243 --- /dev/null +++ b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java @@ -0,0 +1,170 @@ +package com.epmet.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.epmet.commons.tools.constant.AppClientConstant; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.commons.tools.security.password.PasswordUtils; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.CustomerStaffDTO; +import com.epmet.dto.form.LoginByPassWordFormDTO; +import com.epmet.dto.form.RootOrgListByStaffIdFormDTO; +import com.epmet.dto.form.StaffBasicInfoByMobileFromDTO; +import com.epmet.dto.result.BasicInfoResultDTO; +import com.epmet.dto.result.StaffOrgsResultDTO; +import com.epmet.dto.result.UserTokenResultDTO; +import com.epmet.feign.EpmetUserFeignClient; +import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.redis.CaptchaRedis; +import com.epmet.redis.IcLoginTicketCacheBean; +import com.epmet.service.IcLoginService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotBlank; +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +@RestController +@RequestMapping("ic") +public class IcLoinController implements ResultDataResolver { + + public static final long IC_LOGIN_TICKET_EXPIRE_SECONDS = 2 * 60l; + + @Autowired + private EpmetUserFeignClient epmetUserFeignClient; + + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; + + @Autowired + private CaptchaRedis captchaRedis; + + @Autowired + private IcLoginService icLoginService; + + @Autowired + private RedisUtils redisUtils; + + /** + * @description 基层治理赋能平台-根据手机号密码获取组织列表 + * + * @param input + * @return + * @author wxz + * @date 2021.10.25 09:56:33 + */ + @PostMapping("getmyorgsbypassword") + public Result> getMyOrgsByPassword(@RequestBody LoginByPassWordFormDTO input) { + ValidatorUtils.validateEntity(input, LoginByPassWordFormDTO.IcGetOrgsByPwdGroup.class); + String captcha = input.getCaptcha(); + String mobile = input.getMobile(); + String password = input.getPassword(); + String uuid = input.getUuid(); + + // 图片验证码 + String captchaInCache = captchaRedis.getIcLoginCaptcha(uuid); + if (StringUtils.isBlank(captchaInCache) || !captcha.equals(captchaInCache)) { + throw new RenException(EpmetErrorCode.ERR10019.getCode()); + } + + // 获取用户信息 + Result> staffResult = epmetUserFeignClient.checkCustomerStaff(mobile); + List staffList = getResultDataOrThrowsException(staffResult, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【基层治理平台登录】获取用户信息失败"); + if (CollectionUtils.isEmpty(staffList)) { + throw new RenException(EpmetErrorCode.ERR10003.getCode()); + } + + CustomerStaffDTO staffInfo = staffList.get(0); + + if (!PasswordUtils.matches(password, staffInfo.getPassword())) { + throw new RenException(EpmetErrorCode.ERR10004.getCode()); + } + + String staffId = staffInfo.getUserId(); + + // 查询跟组织列表 + RootOrgListByStaffIdFormDTO orgListForm = new RootOrgListByStaffIdFormDTO(); + orgListForm.setStaffId(staffId); + Result> orgListResult = govOrgOpenFeignClient.getStaffOrgListByStaffId(orgListForm); + List orgs = getResultDataOrThrowsException(orgListResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【基层治理平台登录】根据staffId查询所属客户跟组织列表失败"); + + // 生成登录票据 + String ticket = UUID.randomUUID().toString().replace("-", ""); + IcLoginTicketCacheBean ticketCacheBean = new IcLoginTicketCacheBean(); + ticketCacheBean.setMobile(mobile); + ticketCacheBean.setStaffId(staffId); + cacheTicket(ticket, ticketCacheBean); + + HashMap resultMap = new HashMap<>(); + resultMap.put("staffId", staffId); + resultMap.put("ticket", ticket); + resultMap.put("orgs", orgs); + + return new Result>().ok(resultMap); + } + + /** + * @description IC登录 + * + * @param input + * @return + * @author wxz + * @date 2021.10.25 21:14:22 + */ + @PostMapping("login") + public Result login(@RequestBody LoginByPassWordFormDTO input) { + ValidatorUtils.validateEntity(input, LoginByPassWordFormDTO.IcLoginGroup.class); + String ticket = input.getTicket(); + String orgId = input.getOrgId(); + String staffId = input.getStaffId(); + + // ticket校验 + IcLoginTicketCacheBean ticketCache = getTicketCache(ticket); + if (ticketCache == null || !ticketCache.getStaffId().equals(staffId)) { + // ticket&userId不对应 + throw new RenException(EpmetErrorCode.ERR10008.getCode()); + } + + UserTokenResultDTO tokenInfo = icLoginService.login(staffId, orgId); + return new Result().ok(tokenInfo); + } + + private void cacheTicket(String ticket, IcLoginTicketCacheBean cacheBean) { + Map stringObjectMap = BeanUtil.beanToMap(cacheBean, false, true); + redisUtils.hMSet(RedisKeys.loginTicket(AppClientConstant.APP_IC, ticket), stringObjectMap, IC_LOGIN_TICKET_EXPIRE_SECONDS); + } + + /** + * @description 从缓存中取出ticket,并删除 + * + * @param ticket + * @return + * @author wxz + * @date 2021.10.26 08:58:27 + */ + private IcLoginTicketCacheBean getTicketCache(String ticket) { + String key = RedisKeys.loginTicket(AppClientConstant.APP_IC, ticket); + Map map = redisUtils.hGetAll(key); + if (CollectionUtils.sizeIsEmpty(map)) { + return null; + } + redisUtils.expire(key, 0); + return BeanUtil.mapToBean(map, IcLoginTicketCacheBean.class, false); + } + +} diff --git a/epmet-auth/src/main/java/com/epmet/controller/LoginController.java b/epmet-auth/src/main/java/com/epmet/controller/LoginController.java index f70495eb51..03a3139df2 100644 --- a/epmet-auth/src/main/java/com/epmet/controller/LoginController.java +++ b/epmet-auth/src/main/java/com/epmet/controller/LoginController.java @@ -65,6 +65,30 @@ public class LoginController { } } + /** + * @description 基层治理平台登录验证码 + * + * @param response + * @return + * @author wxz + * @date 2021.10.25 14:19:40 + */ + @GetMapping("ic-login-captcha") + public void icLoginCaptcha(HttpServletResponse response, String uuid) throws IOException { + try { + //生成图片验证码 + BufferedImage image = captchaService.createIcLoginCaptcha(uuid); + response.reset(); + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + ServletOutputStream out = response.getOutputStream(); + ImageIO.write(image, "jpg", out); + out.close(); + } catch (IOException e) { + log.error("获取登陆验证码异常", e); + } + } + /** * @param formDTO * @return com.epmet.commons.tools.utils.Result diff --git a/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java b/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java index 0e05cb7787..d225430d30 100644 --- a/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java +++ b/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java @@ -14,27 +14,53 @@ import java.io.Serializable; public class LoginByPassWordFormDTO extends LoginCommonFormDTO implements Serializable { private static final long serialVersionUID = -7507437651048051183L; + // 基层治理平台账号密码获取组织列表分组 + public interface IcGetOrgsByPwdGroup {} + // 基层治理平台登录分组 + public interface IcLoginGroup {} + /** * 手机号 */ @NotBlank(message = "手机号不能为空",groups = {AddUserShowGroup.class}) private String phone; + @NotBlank(message = "手机号不能为空",groups = {IcGetOrgsByPwdGroup.class}) + private String mobile; + /** * 密码 */ - @NotBlank(message = "密码不能为空",groups = {AddUserShowGroup.class}) + @NotBlank(message = "密码不能为空",groups = {AddUserShowGroup.class, IcGetOrgsByPwdGroup.class}) private String password; /** * 验证码 */ - @NotBlank(message="验证码不能为空",groups = {AddUserShowGroup.class}) + @NotBlank(message="验证码不能为空",groups = {AddUserShowGroup.class, IcGetOrgsByPwdGroup.class}) private String captcha; /** * 唯一标识 */ - @NotBlank(message="唯一标识不能为空",groups = {AddUserInternalGroup.class}) + @NotBlank(message="唯一标识不能为空",groups = {AddUserInternalGroup.class, IcGetOrgsByPwdGroup.class}) private String uuid; + + /** + * 登录票据,目前ic基层治理平台用到了 + */ + @NotBlank(message="登录票据ticket不能为空", groups = {IcLoginGroup.class}) + private String ticket; + + /** + * 所选的要登录的组织id + */ + @NotBlank(message = "要登录的orgId不能为空", groups = { IcLoginGroup.class }) + private String orgId; + + /** + * 工作人员id + */ + @NotBlank(message = "人员Id不能为空", groups = { IcLoginGroup.class }) + private String staffId; } diff --git a/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java b/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java index 50433bdaf0..1544c9d07f 100644 --- a/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java +++ b/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java @@ -45,6 +45,12 @@ public class CaptchaRedis { redisUtils.set(key, captcha, EXPIRE); } + public void setIcLoginCaptcha(String uuid, String captcha) { + String key = RedisKeys.getIcLoginCaptchaKey(uuid); + logger.info("保存验证码key=["+key+"]"); + redisUtils.set(key, captcha, EXPIRE); + } + public String get(String uuid){ String key = RedisKeys.getLoginCaptchaKey(uuid); String captcha = (String)redisUtils.get(key); @@ -57,6 +63,25 @@ public class CaptchaRedis { return captcha; } + /** + * @description 基层治理平台登录验证码查询 + * + * @param uuid + * @return + * @author wxz + * @date 2021.10.25 14:28:28 + */ + public String getIcLoginCaptcha(String uuid) { + String key = RedisKeys.getIcLoginCaptchaKey(uuid); + String captcha = (String)redisUtils.get(key); + //删除验证码 + if(captcha != null){ + redisUtils.delete(key); + } + + return captcha; + } + /** * @param sendSmsCodeFormDTO app、client、phone * @param smsCode 验证码 diff --git a/epmet-auth/src/main/java/com/epmet/redis/IcLoginTicketCacheBean.java b/epmet-auth/src/main/java/com/epmet/redis/IcLoginTicketCacheBean.java new file mode 100644 index 0000000000..4e483be294 --- /dev/null +++ b/epmet-auth/src/main/java/com/epmet/redis/IcLoginTicketCacheBean.java @@ -0,0 +1,9 @@ +package com.epmet.redis; + +import lombok.Data; + +@Data +public class IcLoginTicketCacheBean { + private String staffId; + private String mobile; +} diff --git a/epmet-auth/src/main/java/com/epmet/service/CaptchaService.java b/epmet-auth/src/main/java/com/epmet/service/CaptchaService.java index d6f8573e65..812a586dcb 100644 --- a/epmet-auth/src/main/java/com/epmet/service/CaptchaService.java +++ b/epmet-auth/src/main/java/com/epmet/service/CaptchaService.java @@ -23,6 +23,16 @@ public interface CaptchaService { */ BufferedImage create(String uuid); + /** + * @description 基层治理平台登录验证码 + * + * @param + * @return + * @author wxz + * @date 2021.10.25 14:15:30 + */ + BufferedImage createIcLoginCaptcha(String uuid); + /** * 验证码效验 * @param uuid uuid diff --git a/epmet-auth/src/main/java/com/epmet/service/IcLoginService.java b/epmet-auth/src/main/java/com/epmet/service/IcLoginService.java new file mode 100644 index 0000000000..d473f58a7f --- /dev/null +++ b/epmet-auth/src/main/java/com/epmet/service/IcLoginService.java @@ -0,0 +1,9 @@ +package com.epmet.service; + +import com.epmet.dto.result.UserTokenResultDTO; + +public interface IcLoginService { + + + UserTokenResultDTO login(String staffId, String orgId); +} diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java index 835c9aab3a..cbb68142ee 100644 --- a/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java +++ b/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.awt.image.BufferedImage; +import java.util.UUID; /** * 验证码 @@ -43,6 +44,17 @@ public class CaptchaServiceImpl implements CaptchaService { return producer.createImage(captcha); } + @Override + public BufferedImage createIcLoginCaptcha(String uuid) { + //生成验证码 + String captchaText = producer.createText(); + //logger.info("uuid:"+uuid+",生成的验证码:"+captcha); + //保存验证码 + captchaRedis.setIcLoginCaptcha(uuid, captchaText); + + return producer.createImage(captchaText); + } + @Override public boolean validate(String uuid, String code) { String captcha = captchaRedis.get(uuid); diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java new file mode 100644 index 0000000000..66bdad7068 --- /dev/null +++ b/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java @@ -0,0 +1,183 @@ +package com.epmet.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.epmet.auth.constants.AuthOperationConstants; +import com.epmet.common.token.constant.LoginConstant; +import com.epmet.commons.rocketmq.messages.LoginMQMsg; +import com.epmet.commons.tools.constant.AppClientConstant; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.commons.tools.security.dto.IcTokenDto; +import com.epmet.commons.tools.utils.CpUserDetailRedis; +import com.epmet.commons.tools.utils.IpUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.form.SystemMsgFormDTO; +import com.epmet.dto.result.DepartmentListResultDTO; +import com.epmet.dto.result.GridByStaffResultDTO; +import com.epmet.dto.result.UserTokenResultDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.jwt.JwtTokenProperties; +import com.epmet.jwt.JwtTokenUtils; +import com.epmet.service.IcLoginService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class IcLoginServiceImpl implements IcLoginService, ResultDataResolver { + + @Autowired + private JwtTokenUtils jwtTokenUtils; + + @Autowired + private RedisUtils redisUtils; + + @Autowired + private CpUserDetailRedis cpUserDetailRedis; + + @Autowired + private JwtTokenProperties jwtTokenProperties; + + @Autowired + private EpmetMessageOpenFeignClient messageOpenFeignClient; + + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; + + @Autowired + private ThirdLoginServiceImpl thirdLoginService; + + @Override + public UserTokenResultDTO login(String staffId, String orgId) { + String app = AppClientConstant.APP_IC; + String client = AppClientConstant.CLIENT_WEB; + + // 1.获取用户token + String token = this.generateIcToken(staffId, app, client); + + Result agencyResult = govOrgOpenFeignClient.getAgencyById(orgId); + CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(agencyResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【IC平台登录】获取组织信息失败"); + + // 2.缓存token + cacheToken(app, client, staffId, token, orgId, agencyInfo.getCustomerId()); + + UserTokenResultDTO userTokenResultDTO = new UserTokenResultDTO(); + userTokenResultDTO.setToken(token); + userTokenResultDTO.setCustomerId(agencyInfo.getCustomerId()); + + //7.发送登录事件 + try { + sendLoginEvent(staffId, app, client); + } catch (RenException e) { + log.error(e.getInternalMsg()); + } catch (Exception e) { + log.error("【工作端workLogin登录】发送登录事件失败,程序继续执行。"); + } + + return userTokenResultDTO; + } + + /** + * @param staffId + * @return + * @description 生成Ic平台的Token + * @author wxz + * @date 2021.10.26 13:42:36 + */ + private String generateIcToken(String staffId, String app, String client) { + Map map = new HashMap<>(); + map.put("app", app); + map.put("client", client); + map.put("userId", staffId); + String token = jwtTokenUtils.createToken(map); + return token; + } + + /** + * @param userId + * @param fromApp + * @param fromClient + * @return + * @description 发布登录时间 + * @author wxz + * @date 2021.10.26 13:45:59 + */ + private void sendLoginEvent(String userId, String fromApp, String fromClient) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + + LoginMQMsg loginMQMsg = new LoginMQMsg(); + loginMQMsg.setUserId(userId); + loginMQMsg.setLoginTime(new Date()); + loginMQMsg.setIp(IpUtils.getIpAddr(request)); + loginMQMsg.setFromApp(fromApp); + loginMQMsg.setFromClient(fromClient); + + SystemMsgFormDTO form = new SystemMsgFormDTO(); + form.setMessageType(AuthOperationConstants.LOGIN); + form.setContent(loginMQMsg); + messageOpenFeignClient.sendSystemMsgByMQ(form); + } + + /** + * @description 缓存token到redis + * + * @param app + * @param client + * @param userId + * @param token + * @param rootAgencyId + * @return + * @author wxz + * @date 2021.10.26 14:19:07 + */ + private void cacheToken(String app, + String client, + String userId, + String token, + String rootAgencyId, + String customerId) { + + IcTokenDto tokenDto = new IcTokenDto(); + int expire = jwtTokenProperties.getExpire(); + long expireTime = jwtTokenUtils.getExpiration(token).getTime(); + + tokenDto.setApp(app); + tokenDto.setClient(client); + tokenDto.setUserId(userId); + tokenDto.setToken(token); + tokenDto.setExpireTime(expireTime); + tokenDto.setRootAgencyId(rootAgencyId); + tokenDto.setCustomerId(customerId); + + //设置部门,网格,角色列表 + tokenDto.setDeptIdList(thirdLoginService.getDeptartmentIdList(userId)); + tokenDto.setGridIdList(thirdLoginService.getGridIdList(userId)); + CustomerAgencyDTO agency = thirdLoginService.getAgencyByStaffId(userId); + if (agency != null) { + tokenDto.setAgencyId(agency.getId()); + tokenDto.setRoleList(thirdLoginService.queryGovStaffRoles(userId, agency.getId())); + } + tokenDto.setOrgIdPath(thirdLoginService.getOrgIdPath(userId)); + + String key = RedisKeys.getCpUserKey(app, client, userId); + Map map = BeanUtil.beanToMap(tokenDto, false, true); + redisUtils.hMSet(key, map, expire); + } + + +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java index 7b08e851d5..0b42461f6e 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java @@ -17,6 +17,12 @@ public interface AppClientConstant { * app类型-运营端 */ String APP_OPER = "oper"; + + /** + * 基层治理平台端 + */ + String APP_IC = "ic"; + /** * PC端:web */ diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index f078bd4bb6..b2a0beebe9 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -19,6 +19,7 @@ public enum EpmetErrorCode { ERR10005(10005, "token不能为空"), ERR10006(10006, "登录超时,请重新登录"), ERR10007(10007, "当前帐号已在别处登录"), + ERR10008(10008, "Ticket错误"), ERR10019(10019, "验证码不正确"), SYSTEM_MQ_MSG_SEND_FAIL(10020, "MQ消息发送失败"), ERR401(401, "未授权"), diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 388927ce5a..fe293c5288 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -38,6 +38,13 @@ public class RedisKeys { return rootPrefix.concat("sys:captcha:").concat(uuid); } + /** + * 登录验证码Key + */ + public static String getIcLoginCaptchaKey(String uuid) { + return rootPrefix.concat("sys:captcha:iclogin:").concat(uuid); + } + /** * 登录用户Key */ @@ -559,4 +566,17 @@ public class RedisKeys { public static String blockedMqMsgKey(String blockedMsgLabel) { return rootPrefix.concat("message:mq:blocked:").concat(blockedMsgLabel); } + + /** + * @description 登录票据。目前只有IC基层治理平台用到 + * + * @param app + * @param ticket + * @return + * @author wxz + * @date 2021.10.25 17:49:43 + */ + public static String loginTicket(String app, String ticket) { + return rootPrefix.concat("sys:security:ticket:").concat(app).concat(":").concat(ticket); + } } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/dto/IcTokenDto.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/dto/IcTokenDto.java new file mode 100644 index 0000000000..de61615504 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/dto/IcTokenDto.java @@ -0,0 +1,81 @@ +package com.epmet.commons.tools.security.dto; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +/** + * @Description ic平台token + * @author wxz + * @date 2021.10.26 13:58:03 +*/ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class IcTokenDto extends BaseTokenDto { + + /** + * 当前登录的组织id(顶级) + */ + private String rootAgencyId; + + /** + * 当前用户所属的机关单位id + */ + private String agencyId; + + /** + * 当前网格对应的组织结构id的全路径用:隔开 + */ + private String orgIdPath; + + /** + * 当前所在网格id + */ + private String gridId; + + /*** + * 所在网格列表 + */ + private Set gridIdList; + + /** + * 部门id列表 + */ + private Set deptIdList; + + /** + * 功能权限列表,实际上是gov_staff => staff_role => role_operation查询到的operationKey + */ + private Set permissions; + + /** + * 角色ID列表 + */ + private List roleList; + + /** + * 过期时间戳 + */ + private Long expireTime; + + @Data + public static class Role { + + private String id; + private String roleKey; + private String roleName; + + public Role() { + } + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RootOrgListByStaffIdFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RootOrgListByStaffIdFormDTO.java new file mode 100644 index 0000000000..ca4e3153f3 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RootOrgListByStaffIdFormDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto.form; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Description 客户id查询跟组织列表 + * @author wxz + * @date 2021.10.25 14:53:09 +*/ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RootOrgListByStaffIdFormDTO { + + private String staffId; + +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index 39d15fb9a5..dbf264940b 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -187,6 +187,17 @@ public interface GovOrgOpenFeignClient { @PostMapping(value = "/gov/org/customeragency/getStaffOrgList",consumes = MediaType.APPLICATION_JSON_VALUE) Result> getStaffOrgList(StaffOrgFormDTO staffOrgFormDTO); + /** + * @description 通过staffId查询跟组织列表 + * + * @param input + * @return + * @author wxz + * @date 2021.10.25 14:53:53 + */ + @PostMapping("/gov/org/customeragency/root-orglist-by-staffid") + Result> getStaffOrgListByStaffId(@RequestBody RootOrgListByStaffIdFormDTO input); + /** * @Description 查询一个网格下的所有工作人员 * @param gridIdFormDTO diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 306ea49022..8c66ac8787 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -113,6 +113,11 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getStaffOrgList", staffOrgFormDTO); } + @Override + public Result> getStaffOrgListByStaffId(RootOrgListByStaffIdFormDTO input) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getStaffOrgListByStaffId", input); + } + @Override public Result> getGridStaffs(CommonGridIdFormDTO gridIdFormDTO) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getGridStaffs", gridIdFormDTO); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerAgencyController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerAgencyController.java index c3937127ba..065c819c82 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerAgencyController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerAgencyController.java @@ -339,4 +339,22 @@ public class CustomerAgencyController { return new Result().ok(customerAgencyService.getAgencyList(formDTO)); } + /** + * @description 通过staffId查询跟组织列表 + * + * @param input + * @return + * @author wxz + * @date 2021.10.25 14:53:53 + */ + @PostMapping("root-orglist-by-staffid") + public Result> getStaffOrgListByStaffId(@RequestBody RootOrgListByStaffIdFormDTO input) { + + ValidatorUtils.validateEntity(input); + String staffId = input.getStaffId(); + + List orgList = customerAgencyService.getStaffOrgListByStaffId(staffId); + return new Result>().ok(orgList); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java index 3f98a2f847..187a964973 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerAgencyDao.java @@ -244,6 +244,8 @@ public interface CustomerAgencyDao extends BaseDao { List getSubAgencyList(@Param("pid") String pid); + List getStaffOrgListByStaffId(@Param("staffId") String staffId); + /** * @Description 【地图配置】删除 * @param orgId diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerAgencyService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerAgencyService.java index b13bae23e7..3eb6585c03 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerAgencyService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerAgencyService.java @@ -255,4 +255,6 @@ public interface CustomerAgencyService extends BaseService * @Date 2021/9/8 15:21 */ AgencyTreeResultDTO getAgencyList(GetAgencyListFormDTO formDTO); + + List getStaffOrgListByStaffId(String staffId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerAgencyServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerAgencyServiceImpl.java index fc9f181a20..836bbbb355 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerAgencyServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerAgencyServiceImpl.java @@ -1124,4 +1124,8 @@ public class CustomerAgencyServiceImpl extends BaseServiceImpl getStaffOrgListByStaffId(String staffId) { + return baseDao.getStaffOrgListByStaffId(staffId); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml index 81696777f2..be6423e487 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerAgencyDao.xml @@ -577,6 +577,17 @@ AND CUSTOMER_ID = #{customerId} + + + ++ ++ + +\ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StaffBasicInfoByMobileFromDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StaffBasicInfoByMobileFromDTO.java new file mode 100644 index 0000000000..116310f61b --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StaffBasicInfoByMobileFromDTO.java @@ -0,0 +1,23 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description + * @author wxz + * @date 2021.10.25 14:00:11 +*/ +@Data +public class StaffBasicInfoByMobileFromDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @NotBlank(message = "缺少手机号码信息") + private String mobile; + + @NotBlank(message = "缺少密码") + private String password; + +} From e53c459c2674bca1678944e36a21d376f8a98105 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 26 Oct 2021 15:16:28 +0800 Subject: [PATCH 011/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E6=97=A0=E6=95=88=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcLoinController.java | 8 -------- .../java/com/epmet/service/impl/IcLoginServiceImpl.java | 6 ------ 2 files changed, 14 deletions(-) diff --git a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java index 79b4521243..a90ef6ce31 100644 --- a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java +++ b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java @@ -9,34 +9,26 @@ import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.security.password.PasswordUtils; -import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.CustomerStaffDTO; import com.epmet.dto.form.LoginByPassWordFormDTO; import com.epmet.dto.form.RootOrgListByStaffIdFormDTO; -import com.epmet.dto.form.StaffBasicInfoByMobileFromDTO; -import com.epmet.dto.result.BasicInfoResultDTO; import com.epmet.dto.result.StaffOrgsResultDTO; import com.epmet.dto.result.UserTokenResultDTO; import com.epmet.feign.EpmetUserFeignClient; -import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.redis.CaptchaRedis; import com.epmet.redis.IcLoginTicketCacheBean; import com.epmet.service.IcLoginService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.validation.constraints.NotBlank; -import java.beans.IntrospectionException; -import java.lang.reflect.InvocationTargetException; import java.util.*; @RestController diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java index 66bdad7068..d14db75885 100644 --- a/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java +++ b/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java @@ -2,12 +2,10 @@ package com.epmet.service.impl; import cn.hutool.core.bean.BeanUtil; import com.epmet.auth.constants.AuthOperationConstants; -import com.epmet.common.token.constant.LoginConstant; import com.epmet.commons.rocketmq.messages.LoginMQMsg; import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; -import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.redis.RedisKeys; @@ -18,8 +16,6 @@ import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.form.SystemMsgFormDTO; -import com.epmet.dto.result.DepartmentListResultDTO; -import com.epmet.dto.result.GridByStaffResultDTO; import com.epmet.dto.result.UserTokenResultDTO; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; @@ -29,13 +25,11 @@ import com.epmet.service.IcLoginService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.*; -import java.util.stream.Collectors; @Service @Slf4j From 74ae76b26c31d9421bee2239b289ab3e0c14eba1 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Tue, 26 Oct 2021 15:34:40 +0800 Subject: [PATCH 012/253] =?UTF-8?q?=E7=BD=91=E6=A0=BC=E5=B0=8F=E5=8C=BA?= =?UTF-8?q?=E6=A5=BC=E6=A0=8B=E6=88=BF=E5=B1=8B=E4=B8=8B=E6=8B=89=E6=A1=86?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/dto/result/OptionResultDTO.java | 19 ++++++ .../com/epmet/dto/form/AgencyIdFormDTO.java | 2 + .../java/com/epmet/dto/form/HouseFormDTO.java | 17 +++++ .../com/epmet/dto/result/BuildingDTO.java | 19 ++++++ .../epmet/dto/result/GridTreeResultDTO.java | 19 ++++++ .../com/epmet/dto/result/HouseResultDTO.java | 17 +++++ .../com/epmet/dto/result/NeighborHoodDTO.java | 19 ++++++ .../java/com/epmet/dto/result/UnitDTO.java | 18 ++++++ .../controller/CustomerGridController.java | 14 +++++ .../com/epmet/controller/GridController.java | 6 ++ .../controller/IcBuildingController.java | 14 ++++- .../controller/IcBuildingUnitController.java | 17 +++-- .../epmet/controller/IcHouseController.java | 8 ++- .../controller/IcNeighborHoodController.java | 17 ++++- .../java/com/epmet/dao/CustomerGridDao.java | 36 +++++++++++ .../epmet/service/CustomerGridService.java | 19 ++++++ .../com/epmet/service/IcBuildingService.java | 10 +++ .../epmet/service/IcBuildingUnitService.java | 10 +++ .../com/epmet/service/IcHouseService.java | 11 ++++ .../epmet/service/IcNeighborHoodService.java | 10 +++ .../service/impl/CustomerGridServiceImpl.java | 41 ++++++++++++ .../service/impl/IcBuildingServiceImpl.java | 36 ++++++++++- .../impl/IcBuildingUnitServiceImpl.java | 36 ++++++++++- .../service/impl/IcHouseServiceImpl.java | 35 +++++++++++ .../impl/IcNeighborHoodServiceImpl.java | 36 ++++++++++- .../main/resources/mapper/CustomerGridDao.xml | 63 +++++++++++++++++++ 26 files changed, 534 insertions(+), 15 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/OptionResultDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/HouseFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/GridTreeResultDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseResultDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/NeighborHoodDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/UnitDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/OptionResultDTO.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/OptionResultDTO.java new file mode 100644 index 0000000000..30c786a539 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/OptionResultDTO.java @@ -0,0 +1,19 @@ +package com.epmet.commons.tools.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/26 13:53 + */ +@Data +public class OptionResultDTO implements Serializable { + private static final long serialVersionUID = 8618231166600518980L; + private String label; + private String value; + private List children; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java index 44777f5886..cd0b55bbc8 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java @@ -2,6 +2,7 @@ package com.epmet.dto.form; import lombok.Data; +import javax.validation.constraints.NotBlank; import java.io.Serializable; /** @@ -16,5 +17,6 @@ public class AgencyIdFormDTO implements Serializable { /** * 部门Id */ + @NotBlank(message = "组织机构ID不能为空") private String agencyId; } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/HouseFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/HouseFormDTO.java new file mode 100644 index 0000000000..304bce36b9 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/HouseFormDTO.java @@ -0,0 +1,17 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 17:03 + */ +@Data +public class HouseFormDTO implements Serializable { + private static final long serialVersionUID = 2636608477324780974L; + private String buildingId; + private String unitId; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingDTO.java new file mode 100644 index 0000000000..a076376543 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 15:03 + */ +@Data +public class BuildingDTO implements Serializable { + private static final long serialVersionUID = -2129418426919785999L; + private String buildingId; + private String buildingName; + private List unitList; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/GridTreeResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/GridTreeResultDTO.java new file mode 100644 index 0000000000..608b9428e5 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/GridTreeResultDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 15:08 + */ +@Data +public class GridTreeResultDTO implements Serializable { + private static final long serialVersionUID = -6506457371074529990L; + private String gridId; + private String gridName; + private List neighborHoodList; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseResultDTO.java new file mode 100644 index 0000000000..58a07c8bbc --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseResultDTO.java @@ -0,0 +1,17 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 16:58 + */ +@Data +public class HouseResultDTO implements Serializable { + private static final long serialVersionUID = 8054109017922254586L; + private String houseId; + private String houseName; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/NeighborHoodDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/NeighborHoodDTO.java new file mode 100644 index 0000000000..6a561c6e8e --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/NeighborHoodDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 15:06 + */ +@Data +public class NeighborHoodDTO implements Serializable { + private static final long serialVersionUID = 1644088283259175745L; + private String neighborHoodId; + private String neighborHoodName; + private List buildingList; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/UnitDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/UnitDTO.java new file mode 100644 index 0000000000..77b51dfca0 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/UnitDTO.java @@ -0,0 +1,18 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 15:04 + */ +@Data +public class UnitDTO implements Serializable { + private static final long serialVersionUID = -919268879670510057L; + private String unitId; + private String unitName; +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java index c765a58962..eccbc2860f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java @@ -17,6 +17,7 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; @@ -286,4 +287,17 @@ public class CustomerGridController { return new Result>().ok(customerGridService.selectOrgsByUserId(userId)); } + /** + * @Description 获取组织下网格选项 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:02 + */ + @PostMapping("gridoption") + public Result> getGridOption(@RequestBody AgencyIdFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO); + return new Result>().ok(customerGridService.getGridOption(formDTO.getAgencyId())); + } + } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java index f9cc5c1b54..737c378af3 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java @@ -184,4 +184,10 @@ public class GridController { CustomerGridDTO gridInfo = customerGridService.getBaseInfo(customerGridFormDTO); return new Result().ok(gridInfo); } + + @PostMapping("gridtree") + public Result> getGridTree(@RequestBody AgencyIdFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO); + return new Result>().ok(customerGridService.getGridTree(formDTO)); + } } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java index aae2c36569..565b66c23f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java @@ -17,6 +17,7 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -29,6 +30,7 @@ import com.epmet.service.IcBuildingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @@ -81,5 +83,15 @@ public class IcBuildingController { return new Result(); } - + /** + * @Description 获取小区内的楼栋 + * @Param dto + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:46 + */ + @PostMapping("buildingoption") + public Result> getBuildingOptions(IcBuildingDTO dto) { + return new Result>().ok(icBuildingService.getBuildingOptions(dto.getNeighborHoodId())); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java index 93e3f11314..6d0a832a3c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java @@ -17,20 +17,19 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; -import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcBuildingUnitDTO; import com.epmet.service.IcBuildingUnitService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -83,5 +82,15 @@ public class IcBuildingUnitController { icBuildingUnitService.delete(ids); return new Result(); } - + /** + * @Description 获取楼栋内单元 + * @Param dto + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:46 + */ + @PostMapping("unitoption") + public Result> getUnitOptions(IcBuildingUnitDTO dto) { + return new Result>().ok(icBuildingUnitService.getUnitOptions(dto.getBuildingId())); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java index 5d649ce45b..982bf33835 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java @@ -17,6 +17,7 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -25,10 +26,12 @@ 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.IcHouseDTO; +import com.epmet.dto.form.HouseFormDTO; import com.epmet.service.IcHouseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @@ -80,6 +83,9 @@ public class IcHouseController { icHouseService.delete(ids); return new Result(); } - + @PostMapping("houseoption") + public Result> getHouseOption(@RequestBody HouseFormDTO formDTO){ + return new Result>().ok(icHouseService.getHouseOption(formDTO)); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java index 0cf22c6da7..69b1775641 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -17,20 +17,19 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; -import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.service.IcNeighborHoodService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -84,4 +83,16 @@ public class IcNeighborHoodController { return new Result(); } + /** + * @Description 获取网格下小区列表 + * @Param dto + * @Return {@link Result< List< OptionResultDTO>>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:38 + */ + @PostMapping("neighborhoodoption") + public Result> getNeighborHoodOptions(IcNeighborHoodDTO dto) { + return new Result>().ok(icNeighborHoodService.getNeighborHoodOptions(dto.getGridId())); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java index fae6640a7d..34534391c3 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java @@ -300,4 +300,40 @@ public interface CustomerGridDao extends BaseDao { * @date 2021/8/5 10:08 上午 */ List selectOrgsByUserId(@Param("userId") String userId); + + /** + * @Description 查询组织下的网格及网格下的小区、单元、楼栋 + * @Param agencyId + * @Return {@link List< GridTreeResultDTO>} + * @Author zhaoqifeng + * @Date 2021/10/25 15:19 + */ + List selectGridTree(@Param("agencyId") String agencyId); + + /** + * @Description 网格下小区列表 + * @Param gridId + * @Return {@link List< NeighborHoodDTO>} + * @Author zhaoqifeng + * @Date 2021/10/25 16:04 + */ + List selectNeighborHoodList(@Param("gridId") String gridId); + + /** + * @Description 小区下楼栋列表 + * @Param neighborHoodId + * @Return {@link List< BuildingDTO>} + * @Author zhaoqifeng + * @Date 2021/10/25 16:04 + */ + List selectBuildingList(@Param("neighborHoodId") String neighborHoodId); + + /** + * @Description 楼栋下单元列表 + * @Param buildingId + * @Return {@link List< UnitDTO>} + * @Author zhaoqifeng + * @Date 2021/10/25 16:04 + */ + List selectUnitList(@Param("buildingId") String buildingId); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java index 91525436ba..453c81f256 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java @@ -18,6 +18,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; @@ -319,4 +320,22 @@ public interface CustomerGridService extends BaseService { * @date 2021/8/5 10:08 上午 */ List selectOrgsByUserId(String userId); + + /** + * @Description 获取组织下网格树 + * @Param formDTO + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/25 16:28 + */ + List getGridTree(AgencyIdFormDTO formDTO); + + /** + * @Description 获取组织下网格选项 + * @Param agencyId + * @Return {@link List< OptionResultDTO>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:01 + */ + List getGridOption(String agencyId); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java index afe8f11567..5b5ff7d05d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingService.java @@ -18,6 +18,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcBuildingDTO; import com.epmet.entity.IcBuildingEntity; @@ -92,4 +93,13 @@ public interface IcBuildingService extends BaseService { * @date 2021-10-25 */ void delete(String[] ids); + + /** + * @Description 获取小区内的楼栋 + * @Param neighborHoodId + * @Return {@link List< OptionResultDTO>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:43 + */ + List getBuildingOptions(String neighborHoodId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java index 59b1546ed3..40045f2b75 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcBuildingUnitService.java @@ -18,6 +18,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcBuildingUnitDTO; import com.epmet.entity.IcBuildingUnitEntity; @@ -92,4 +93,13 @@ public interface IcBuildingUnitService extends BaseService * @date 2021-10-25 */ void delete(String[] ids); + + /** + * @Description 获取楼栋内单元 + * @Param buildingId + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 14:49 + */ + List getUnitOptions(String buildingId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java index e59122f103..471007a582 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java @@ -18,8 +18,10 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcHouseDTO; +import com.epmet.dto.form.HouseFormDTO; import com.epmet.entity.IcHouseEntity; import java.util.List; @@ -92,4 +94,13 @@ public interface IcHouseService extends BaseService { * @date 2021-10-25 */ void delete(String[] ids); + + /** + * @Description 获取楼栋房屋列表 + * @Param formDTO + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/25 17:04 + */ + List getHouseOption(HouseFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java index 15f4624cba..1ef5c981fc 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java @@ -18,6 +18,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.entity.IcNeighborHoodEntity; @@ -92,4 +93,13 @@ public interface IcNeighborHoodService extends BaseService * @date 2021-10-25 */ void delete(String[] ids); + + /** + * @Description 获取网格下小区列表 + * @Param gridId + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 14:32 + */ + List getNeighborHoodOptions(String gridId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java index d5497b8a08..43a73d3b46 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java @@ -18,6 +18,7 @@ package com.epmet.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; @@ -25,6 +26,7 @@ import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; @@ -50,6 +52,7 @@ import com.epmet.service.CustomerAgencyService; import com.epmet.service.CustomerGridService; import com.epmet.util.ModuleConstant; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -818,4 +821,42 @@ public class CustomerGridServiceImpl extends BaseServiceImpl selectOrgsByUserId(String userId) { return baseDao.selectOrgsByUserId(userId); } + + /** + * @param formDTO + * @Description 获取组织下网格树 + * @Param formDTO + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/25 16:28 + */ + @Override + public List getGridTree(AgencyIdFormDTO formDTO) { + return baseDao.selectGridTree(formDTO.getAgencyId()); + } + + /** + * @param agencyId + * @Description 获取组织下网格选项 + * @Param agencyId + * @Return {@link List< OptionResultDTO >} + * @Author zhaoqifeng + * @Date 2021/10/26 14:01 + */ + @Override + public List getGridOption(String agencyId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CustomerGridEntity::getPid, agencyId); + wrapper.last("ORDER BY CONVERT ( GRID_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setLabel(item.getGridName()); + dto.setValue(item.getId()); + return dto; + }).collect(Collectors.toList()); + } } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java index 5a4c3ae38c..a5bdf574c8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java @@ -17,24 +17,28 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.dao.IcBuildingDao; import com.epmet.dto.IcBuildingDTO; import com.epmet.entity.IcBuildingEntity; import com.epmet.service.IcBuildingService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 楼栋信息 @@ -98,4 +102,32 @@ public class IcBuildingServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/26 14:43 + */ + @Override + public List getBuildingOptions(String neighborHoodId) { + if (StringUtils.isBlank(neighborHoodId)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcBuildingEntity::getNeighborHoodId, neighborHoodId); + wrapper.last("ORDER BY CONVERT ( BUILDING_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if(CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getId()); + dto.setLabel(item.getBuildingName()); + return dto; + }).collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java index c5cc404638..c192edad70 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java @@ -17,24 +17,28 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dto.IcBuildingUnitDTO; import com.epmet.entity.IcBuildingUnitEntity; import com.epmet.service.IcBuildingUnitService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 楼栋单元信息 @@ -98,4 +102,32 @@ public class IcBuildingUnitServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/26 14:49 + */ + @Override + public List getUnitOptions(String buildingId) { + if (StringUtils.isBlank(buildingId)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcBuildingUnitEntity::getBuildingId, buildingId); + wrapper.last("ORDER BY CONVERT ( UNIT_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if(CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getId()); + dto.setLabel(item.getUnitName()); + return dto; + }).collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index db80c7ee31..83400c63ab 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -17,23 +17,29 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcHouseDao; import com.epmet.dto.IcHouseDTO; +import com.epmet.dto.form.HouseFormDTO; import com.epmet.entity.IcHouseEntity; import com.epmet.service.IcHouseService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 房屋信息 @@ -97,4 +103,33 @@ public class IcHouseServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/25 17:04 + */ + @Override + public List getHouseOption(HouseFormDTO formDTO) { + if (StringUtils.isBlank(formDTO.getBuildingId()) && StringUtils.isBlank(formDTO.getUnitId())) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(formDTO.getBuildingId()), IcHouseEntity::getBuildingId, formDTO.getBuildingId()); + wrapper.eq(StringUtils.isNotBlank(formDTO.getUnitId()), IcHouseEntity::getBuildingUnitId, formDTO.getUnitId()); + wrapper.last("ORDER BY CONVERT ( HOUSE_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if(CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getId()); + dto.setLabel(item.getHouseName()); + return dto; + }).collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java index 1585fe99e4..5723490984 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java @@ -17,24 +17,28 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.dao.IcNeighborHoodDao; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.service.IcNeighborHoodService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 小区表 @@ -98,4 +102,32 @@ public class IcNeighborHoodServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/26 14:32 + */ + @Override + public List getNeighborHoodOptions(String gridId) { + if (StringUtils.isBlank(gridId)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcNeighborHoodEntity::getGridId, gridId); + wrapper.last("ORDER BY CONVERT ( NEIGHBOR_HOOD_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if(CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getId()); + dto.setLabel(item.getNeighborHoodName()); + return dto; + }).collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml index 0667d009c4..a3aba7122e 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml @@ -618,4 +618,67 @@ union ALL SELECT agency_id AS orgId FROM customer_staff_agency WHERE del_flag = '0' and USER_ID = #{userId} + + + + + + + + + + + + + + + + + + + + + + + + + From 9e135eda0ada1b5661b5cea608c81cf36279f65d Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 26 Oct 2021 15:37:24 +0800 Subject: [PATCH 013/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=99=BB=E5=BD=95dto=E5=AD=97=E6=AE=B5=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/controller/IcLoinController.java | 2 +- .../main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java index a90ef6ce31..cd3c5543e6 100644 --- a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java +++ b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java @@ -122,7 +122,7 @@ public class IcLoinController implements ResultDataResolver { public Result login(@RequestBody LoginByPassWordFormDTO input) { ValidatorUtils.validateEntity(input, LoginByPassWordFormDTO.IcLoginGroup.class); String ticket = input.getTicket(); - String orgId = input.getOrgId(); + String orgId = input.getRootAgencyId(); String staffId = input.getStaffId(); // ticket校验 diff --git a/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java b/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java index d225430d30..8a603012ac 100644 --- a/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java +++ b/epmet-auth/src/main/java/com/epmet/dto/form/LoginByPassWordFormDTO.java @@ -56,7 +56,7 @@ public class LoginByPassWordFormDTO extends LoginCommonFormDTO implements Serial * 所选的要登录的组织id */ @NotBlank(message = "要登录的orgId不能为空", groups = { IcLoginGroup.class }) - private String orgId; + private String rootAgencyId; /** * 工作人员id From 15f268db2578cacb42f9751bfb655e9b4c28114b Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 26 Oct 2021 15:51:45 +0800 Subject: [PATCH 014/253] zancun --- .../tools/exception/EpmetErrorCode.java | 1 + .../epmet/dto/form/CustomerFormQueryDTO.java | 4 + .../java/com/epmet/dto/result/FormItem.java | 5 + .../epmet/controller/IcFormController.java | 5 +- .../main/java/com/epmet/dao/IcFormDao.java | 25 +++- .../epmet/service/impl/IcFormServiceImpl.java | 15 +- .../src/main/resources/mapper/IcFormDao.xml | 138 ++++++++++++++++++ 7 files changed, 190 insertions(+), 3 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index f078bd4bb6..77818b2916 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -76,6 +76,7 @@ public enum EpmetErrorCode { SET_PARENT_AREA_CODE(8210,"请先设置上级组织区划"), HAVE_GUIDE_CANNOT_DEL(8211,"当前分类已经存在办事指南,不允许删除"), GUIDE_CATEGORY_NAME_EXITS(8212,"分类已存在"), + CUSTOMER_FORM_NOT_EXITS(8213,"客户未配置表单"), REQUIRE_PERMISSION(8301, "您没有足够的操作权限"), THIRD_PLAT_REQUEST_ERROR(8302, "请求第三方平台错误"), diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java index 2e66799c15..e2bafc12df 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java @@ -15,5 +15,9 @@ public class CustomerFormQueryDTO implements Serializable { public interface AddUserInternalGroup {} @NotBlank(message = "formCode不能为空,居民信息默认传:resi_base_info",groups =AddUserInternalGroup.class ) private String formCode; + + + @NotBlank(message = "tokenDto获取customerId不能为空",groups =AddUserInternalGroup.class ) + private String customerId; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java index 2059997cc8..9a65bb0b16 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java @@ -103,6 +103,11 @@ public class FormItem implements Serializable { */ private String columnName; + /** + * 列名序号,根据表递增 + */ + private Integer columnNum; + private List options; diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index bb876ffa7a..d89f303291 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -17,7 +17,9 @@ package com.epmet.controller; +import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -103,7 +105,8 @@ public class IcFormController { * @date 2021/10/26 2:40 下午 */ @PostMapping("getcustomerform") - public Result getCustomerForm(@RequestBody CustomerFormQueryDTO formDto){ + public Result getCustomerForm(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto){ + formDto.setCustomerId(tokenDto.getCustomerId()); ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result().ok(icFormService.getCustomerForm(formDto)); diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java index fd40647a83..1b2ffe357c 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java @@ -18,8 +18,15 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.FormGroupDTO; +import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.OptionDTO; import com.epmet.entity.IcFormEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 配置表单 @@ -29,5 +36,21 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface IcFormDao extends BaseDao { - + /** + * 查询表单 + * + * @param customerId + * @param formCode + * @return com.epmet.dto.result.CustomerFormResultDTO + * @author yinzuomei + * @date 2021/10/26 2:48 下午 + */ + CustomerFormResultDTO selectByCode(@Param("customerId") String customerId, @Param("formCode") String formCode); + + List selectItemList(String formId); + + List selectItemListByGroupId(String groupId); + List selectListOption(String itemId); + + List selectListGroup(String formId); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index 7c476eddd8..03b03ffaf8 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -21,12 +21,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcFormDao; import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.FormGroupDTO; +import com.epmet.dto.result.FormItem; import com.epmet.entity.IcFormEntity; import com.epmet.service.IcFormService; import org.apache.commons.lang3.StringUtils; @@ -110,7 +114,16 @@ public class IcFormServiceImpl extends BaseServiceImpl @Override public CustomerFormResultDTO getCustomerForm(CustomerFormQueryDTO formDto) { //todo - return null; + CustomerFormResultDTO resultDTO=baseDao.selectByCode(formDto.getCustomerId(),formDto.getFormCode()); + if (null == resultDTO) { + throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); + } + List itemList=baseDao.selectItemList(resultDTO.getFormId()); + List groupList=baseDao.selectListGroup(resultDTO.getFormId()); + + resultDTO.setItemList(itemList); + resultDTO.setGroupList(groupList); + return resultDTO; } } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 8b0bb1f336..8c872f115d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -3,5 +3,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From fc2a3b930ba6ea623c864f515115eb4fe39423c0 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 26 Oct 2021 16:39:02 +0800 Subject: [PATCH 015/253] zancun --- .../com/epmet/dto/result/FormGroupDTO.java | 2 +- .../java/com/epmet/dto/result/FormItem2.java | 112 ++++++++++++++++++ .../main/java/com/epmet/dao/IcFormDao.java | 2 + .../src/main/resources/mapper/IcFormDao.xml | 86 +++++++++++--- 4 files changed, 185 insertions(+), 17 deletions(-) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java index ae71a9c160..dbb3f60e70 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java @@ -42,6 +42,6 @@ public class FormGroupDTO implements Serializable { /** * 分组里面的组件 */ - private List itemList; + private List itemList; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java new file mode 100644 index 0000000000..41f46c55d0 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java @@ -0,0 +1,112 @@ +package com.epmet.dto.result; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 分组里面的组件 + * @Author yinzuomei + * @Date 2021/10/26 4:29 下午 + */ +@Data +public class FormItem2 implements Serializable { + private static final long serialVersionUID = -7571266621687396261L; + /** + * 父项ID + */ + private String itemId; + + /** + * 默认:ic_resi_user + */ + private String tableName; + + /** + * 父项ID + */ + private String parentItemId; + + /** + * 项标签 + */ + private String label; + + /** + * 控件类型,EG:INPUT;从字典获取 + */ + private String itemType; + + /** + * 分组ID,'默认,NONE' + */ + private String itemGroupId; + + /** + * 是否必填,1必填。0不必填 + */ + private Integer required; + + /** + * 手机号:mobile; 身份证:id_card + */ + private String validType; + + /** + * 默认值 + */ + private String defaultValue; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; + + /** + * 排序 + */ + private Integer sort; + + /** + * 占位提示语 + */ + private String placeholder; + + /** + * 是否查询显示,1展示。0不展示 + */ + @JsonIgnore + private Integer searchDisplay; + + /** + * 是否列表显示,1展示,0不展示 + */ + @JsonIgnore + private Integer listDisplay; + + /** + * 是否需要支持数据分析,1支持。0不支持 + */ + @JsonIgnore + private Integer dataAnalyse; + + /** + * 列名 + */ + private String columnName; + + /** + * 列名序号,根据表递增 + */ + private Integer columnNum; + + private List options; +} + diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java index 1b2ffe357c..bed3566120 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java @@ -53,4 +53,6 @@ public interface IcFormDao extends BaseDao { List selectListOption(String itemId); List selectListGroup(String formId); + + FormGroupDTO selectChildGroup(String itemId); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 8c872f115d..b3c51eaf84 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -17,7 +17,7 @@ - + @@ -41,6 +41,9 @@ + + - + SELECT + g.id AS group_id, + g.LABEL, + g.sort, + g.SUPPORT_ADD, + g.TABLE_NAME AS TABLE_NAME + FROM + ic_form_item_group g + WHERE + g.DEL_FLAG = '0' + AND g.id =( + SELECT DISTINCT + i.ITEM_GROUP_ID + FROM + ic_form_item i + WHERE + i.DEL_FLAG = '0' + AND i.PARENT_ITEM_ID = #{itemId} + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + a.id as neighborHoodId, + a.NEIGHBOR_HOOD_NAME as neighborHoodName, + a.ADDRESS as address, + a.REMARK as remark, + + b.ORGANIZATION_NAME as orgName, + c.GRID_NAME as gridName + from ic_neighbor_hood a + + left join customer_agency b on a.AGENCY_ID = b.ID + + left join customer_grid c on a.GRID_ID = c.ID + ${ew.customSqlSegment} + + \ No newline at end of file From a8ef3848b67cac3390dfe96b66c8a09957aec4fa Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Tue, 26 Oct 2021 18:02:16 +0800 Subject: [PATCH 017/253] =?UTF-8?q?=E4=B9=9D=E5=B0=8F=E5=9C=BA=E6=89=80=20?= =?UTF-8?q?=E6=96=87=E5=8C=96=E7=A8=8B=E5=BA=A6=20=E6=B0=91=E6=97=8F=20?= =?UTF-8?q?=E4=B8=8E=E6=88=B7=E4=B8=BB=E5=85=B3=E7=B3=BB=20=E4=B8=8E?= =?UTF-8?q?=E8=B5=A1=E5=85=BB=E4=BA=BA=E5=85=B3=E7=B3=BB=20=E4=BD=8F?= =?UTF-8?q?=E6=88=BF=E6=80=A7=E8=B4=A8=20=E5=AD=97=E5=85=B8=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SysDictDataController.java | 68 ++++++++++- .../com/epmet/service/SysDictDataService.java | 47 +++++++- .../service/impl/SysDictDataServiceImpl.java | 114 ++++++++++++++++++ 3 files changed, 225 insertions(+), 4 deletions(-) diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java index 8b26c48efd..af65d4fd90 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java @@ -8,18 +8,19 @@ package com.epmet.controller; -import com.epmet.dto.SysDictDataDTO; -import com.epmet.service.SysDictDataService; -import com.epmet.commons.tools.constant.Constant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; 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.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.dto.SysDictDataDTO; +import com.epmet.service.SysDictDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; /** @@ -78,4 +79,65 @@ public class SysDictDataController { return new Result(); } + /** + * @Description 九小场所 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("ninesmallplaces") + public Result> getNineSmallPlacesOption() { + return new Result>().ok(sysDictDataService.getNineSmallPlacesOption()); + } + + /** + * @Description 文化程度 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("education") + public Result> getEducationOption() { + return new Result>().ok(sysDictDataService.getEducationOption()); + } + + /** + * @Description 民族 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("nation") + public Result> getNationOption() { + return new Result>().ok(sysDictDataService.getNationOption()); + } + + /** + * @Description 人员关系 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("relationship") + public Result> getRelationshipOption() { + return new Result>().ok(sysDictDataService.getRelationshipOption()); + } + + /** + * @Description 住房性质 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("house") + public Result> getHouseOption() { + return new Result>().ok(sysDictDataService.getHouseOption()); + } + + } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java index 2e01f49d91..bcc3bd3953 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java @@ -8,11 +8,13 @@ package com.epmet.service; -import com.epmet.dto.SysDictDataDTO; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.SysDictDataDTO; import com.epmet.entity.SysDictDataEntity; +import java.util.List; import java.util.Map; /** @@ -31,5 +33,48 @@ public interface SysDictDataService extends BaseService { void update(SysDictDataDTO dto); void delete(Long[] ids); + /** + * 九小场所 + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:11 + */ + List getNineSmallPlacesOption(); + + /** + * 文化程度 + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + List getEducationOption(); + + /** + * 民族 + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + List getNationOption(); + + /** + * 人员关系 + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + List getRelationshipOption(); + /** + * 住房性质 + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + List getHouseOption(); } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java index 8a13891ab9..e1c5e266f3 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java @@ -8,9 +8,11 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.SysDictDataDao; @@ -22,7 +24,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 字典类型 @@ -85,4 +89,114 @@ public class SysDictDataServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/26 17:11 + */ + @Override + public List getNineSmallPlacesOption() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysDictDataEntity::getDictTypeId, 1000000000000000001L); + wrapper.orderByAsc(SysDictDataEntity::getSort); + List list = baseDao.selectList(wrapper); + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getDictValue()); + dto.setLabel(item.getDictLabel()); + return dto; + }).collect(Collectors.toList()); + } + + /** + * 文化程度 + * + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + @Override + public List getEducationOption() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysDictDataEntity::getDictTypeId, 1000000000000000002L); + wrapper.orderByAsc(SysDictDataEntity::getSort); + List list = baseDao.selectList(wrapper); + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getDictValue()); + dto.setLabel(item.getDictLabel()); + return dto; + }).collect(Collectors.toList()); + } + + /** + * 民族 + * + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + @Override + public List getNationOption() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysDictDataEntity::getDictTypeId, 1000000000000000003L); + wrapper.orderByAsc(SysDictDataEntity::getSort); + List list = baseDao.selectList(wrapper); + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getDictValue()); + dto.setLabel(item.getDictLabel()); + return dto; + }).collect(Collectors.toList()); + } + + /** + * 人员关系 + * + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + @Override + public List getRelationshipOption() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysDictDataEntity::getDictTypeId, 1000000000000000004L); + wrapper.orderByAsc(SysDictDataEntity::getSort); + List list = baseDao.selectList(wrapper); + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getDictValue()); + dto.setLabel(item.getDictLabel()); + return dto; + }).collect(Collectors.toList()); + } + + /** + * 住房性质 + * + * @Param + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/26 17:12 + */ + @Override + public List getHouseOption() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysDictDataEntity::getDictTypeId, 1000000000000000005L); + wrapper.orderByAsc(SysDictDataEntity::getSort); + List list = baseDao.selectList(wrapper); + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getDictValue()); + dto.setLabel(item.getDictLabel()); + return dto; + }).collect(Collectors.toList()); + } + } From 604c82c46ccc7ae29b1a153461b5678133c5a418 Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 26 Oct 2021 18:27:49 +0800 Subject: [PATCH 018/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/OperCustomizeOpenFeignClient.java | 16 +++-- .../OperCustomizeOpenFeignClientFallback.java | 7 ++- epmet-user/epmet-user-server/pom.xml | 6 ++ .../controller/IcResiUserController.java | 58 +++++++++++++++++-- 4 files changed, 74 insertions(+), 13 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index fd56957265..1a2279055b 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -5,15 +5,11 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; -import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; -import org.springframework.cloud.openfeign.FeignClient; - -import com.epmet.commons.tools.constant.ServiceConstant; -import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.CustomerFunctionListFormDTO; import com.epmet.dto.result.CheckFloatFootBarResultDTO; import com.epmet.dto.result.DefaultFunctionListResultDTO; -import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallback; +import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; @@ -47,4 +43,12 @@ public interface OperCustomizeOpenFeignClient { */ @PostMapping(value = "/oper/customize/customerfootbar/checkfloatfootbar", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) Result checkFloatFootBar(@RequestBody CheckFloatFootBarFormDTO checkFloatFootBarFormDTO); + + /** + * desc: 获取表单填写项 + * @param formDto + * @return + */ + @PostMapping(value = "/oper/customize/icform/getcustomerform", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + Result getCustomerForm(@RequestBody CustomerFormQueryDTO formDto); } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 2fe50e5c9f..44faffb975 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -6,11 +6,11 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.CustomerFunctionListFormDTO; import com.epmet.dto.result.CheckFloatFootBarResultDTO; import com.epmet.dto.result.DefaultFunctionListResultDTO; import com.epmet.feign.OperCustomizeOpenFeignClient; -import org.springframework.stereotype.Component; import java.util.List; @@ -49,4 +49,9 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result checkFloatFootBar(CheckFloatFootBarFormDTO checkFloatFootBarFormDTO) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "checkFloatFootBar", checkFloatFootBarFormDTO); } + + @Override + public Result getCustomerForm(CustomerFormQueryDTO formDto) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getCustomerForm", formDto); + } } diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index 79c3f816af..a70950c101 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -118,6 +118,12 @@ epmet-commons-rocketmq 2.0.0 + + com.epmet + oper-customize-client + 2.0.0 + compile + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 5dca820caf..dd053bd395 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -17,7 +17,12 @@ package com.epmet.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; @@ -25,19 +30,22 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; -import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcResiUserDTO; -import com.epmet.dto.UserResiInfoDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.IcResiUserFormDTO; +import com.epmet.dto.result.CheckFloatFootBarResultDTO; import com.epmet.excel.IcResiUserExcel; +import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; -import java.util.List; -import java.util.Map; +import java.io.FileOutputStream; +import java.util.*; /** @@ -49,7 +57,9 @@ import java.util.Map; @RestController @RequestMapping("icresiuser") public class IcResiUserController { - + + @Autowired + private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @Autowired private IcResiUserService icResiUserService; @@ -115,4 +125,40 @@ public class IcResiUserController { return new Result(); } -} \ No newline at end of file + @GetMapping("download/template") + public void downloadTemplate(@RequestParam String customerId) throws Exception { + CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); + queryDTO.setFormCode("resi_base_info"); + queryDTO.setCustomerId(customerId); + + Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); + if (resultForm == null || !resultForm.success()) ||resultForm.getData() == null){ + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } + List colList = new ArrayList<>(); + + ExcelExportEntity desginGroup = new ExcelExportEntity("表头名称","键"); + desginGroup.setNeedMerge(true); + List paramCols = new ArrayList<>(); + List headerList = Arrays.asList("头1","头2","头3"); + headerList.forEach(e->{ + paramCols.add(new ExcelExportEntity(e,e,30)); + }); + + desginGroup.setList(paramCols); + colList.add(desginGroup); + List> dataList =new ArrayList<>(); + Map dataMap = new HashMap<>(); + dataMap.put("头1","1"); + dataMap.put("头2","2"); + dataMap.put("头3","3"); + dataList.add(dataMap); + ExportParams entity = new ExportParams(); + Workbook workbook = ExcelExportUtil.exportExcel(entity, colList, dataList); + //ExcelExportUtil.exportExcel + FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); + workbook.write(fos); + fos.close(); + } + +} From d01b48b68ab04e56497a9599a177d1fc12973103 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 09:02:37 +0800 Subject: [PATCH 019/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcResiUserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index dd053bd395..c24cc5f309 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -132,7 +132,7 @@ public class IcResiUserController { queryDTO.setCustomerId(customerId); Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); - if (resultForm == null || !resultForm.success()) ||resultForm.getData() == null){ + if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); } List colList = new ArrayList<>(); From 36958749d1a421a3720819ff1d286becb655dbdb Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 09:29:12 +0800 Subject: [PATCH 020/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2form=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/IcFormController.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index d89f303291..2e07a6cf79 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -17,9 +17,7 @@ package com.epmet.controller; -import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -32,6 +30,7 @@ import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.excel.IcFormExcel; import com.epmet.service.IcFormService; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -49,7 +48,7 @@ import java.util.Map; @RestController @RequestMapping("icform") public class IcFormController { - + @Autowired private IcFormService icFormService; @@ -100,15 +99,17 @@ public class IcFormController { * 获取居民信息表单 * * @param formDto - * @return com.epmet.commons.tools.utils.Result - * @author yinzuomei + * @return com.epmet.commons.tools.utils.Result + * @author yinzuomei * @date 2021/10/26 2:40 下午 */ @PostMapping("getcustomerform") - public Result getCustomerForm(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto){ - formDto.setCustomerId(tokenDto.getCustomerId()); + public Result getCustomerForm(@RequestHeader String customerId, @RequestBody CustomerFormQueryDTO formDto){ + if (StringUtils.isBlank(formDto.getCustomerId())){ + formDto.setCustomerId(customerId); + } ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result().ok(icFormService.getCustomerForm(formDto)); } -} \ No newline at end of file +} From 0153d30f2993182e1496a0e54f29b3aaa40745a9 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 10:08:03 +0800 Subject: [PATCH 021/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2form=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/controller/IcFormController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 2e07a6cf79..b45fd6137d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -104,7 +104,7 @@ public class IcFormController { * @date 2021/10/26 2:40 下午 */ @PostMapping("getcustomerform") - public Result getCustomerForm(@RequestHeader String customerId, @RequestBody CustomerFormQueryDTO formDto){ + public Result getCustomerForm(@RequestHeader(required = false) String customerId, @RequestBody CustomerFormQueryDTO formDto){ if (StringUtils.isBlank(formDto.getCustomerId())){ formDto.setCustomerId(customerId); } From 9d47bccac58a9f4e938a548b0300502783457fd7 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 10:20:34 +0800 Subject: [PATCH 022/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2form=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/feign/OperCustomizeOpenFeignClient.java | 3 ++- .../feign/fallback/OperCustomizeOpenFeignClientFallback.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 1a2279055b..3bfeb03e14 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -8,6 +8,7 @@ import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.CustomerFunctionListFormDTO; import com.epmet.dto.result.CheckFloatFootBarResultDTO; +import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.DefaultFunctionListResultDTO; import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; @@ -50,5 +51,5 @@ public interface OperCustomizeOpenFeignClient { * @return */ @PostMapping(value = "/oper/customize/icform/getcustomerform", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - Result getCustomerForm(@RequestBody CustomerFormQueryDTO formDto); + Result getCustomerForm(@RequestBody CustomerFormQueryDTO formDto); } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 44faffb975..8b8bda2a13 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -9,6 +9,7 @@ import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.CustomerFunctionListFormDTO; import com.epmet.dto.result.CheckFloatFootBarResultDTO; +import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.DefaultFunctionListResultDTO; import com.epmet.feign.OperCustomizeOpenFeignClient; @@ -51,7 +52,7 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe } @Override - public Result getCustomerForm(CustomerFormQueryDTO formDto) { + public Result getCustomerForm(CustomerFormQueryDTO formDto) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getCustomerForm", formDto); } } From 75693df9b54a9ad0b8e0cb11ea14003b78895a04 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 27 Oct 2021 10:33:21 +0800 Subject: [PATCH 023/253] =?UTF-8?q?chaxun=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dto/IcFormItemDTO.java | 5 +- .../epmet/dto/result/ConditionResultDTO.java | 88 +++++++++++++++++++ .../epmet/controller/IcFormController.java | 20 +++++ .../java/com/epmet/dao/IcFormItemDao.java | 7 +- .../com/epmet/entity/IcFormItemEntity.java | 5 +- .../com/epmet/service/IcFormItemService.java | 12 +++ .../service/impl/IcFormItemServiceImpl.java | 16 ++++ .../main/resources/mapper/IcFormItemDao.xml | 46 ++++++++++ 8 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java index f670559b57..35133d48b6 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcFormItemDTO.java @@ -17,9 +17,10 @@ package com.epmet.dto; +import lombok.Data; + import java.io.Serializable; import java.util.Date; -import lombok.Data; /** @@ -74,7 +75,7 @@ public class IcFormItemDTO implements Serializable { private String itemType; /** - * 分组ID,'默认,NONE' + * 分组ID,'默认,0' */ private String itemGroupId; diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java new file mode 100644 index 0000000000..f88bdf2144 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java @@ -0,0 +1,88 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 查询条件 + * @Author yinzuomei + * @Date 2021/10/27 9:09 上午 + */ +@Data +public class ConditionResultDTO implements Serializable { + private static final long serialVersionUID = -2021200288758478252L; + /** + * 父项ID + */ + private String itemId; + + /** + * 默认:ic_resi_user + */ + private String tableName; + + /** + * 父项ID + */ + private String parentItemId; + + /** + * 项标签 + */ + private String label; + + /** + * 控件类型,EG:INPUT;从字典获取 + */ + private String itemType; + + /** + * 分组ID,'默认,NONE' + */ + private String itemGroupId; + + /** + * 是否必填,1必填。0不必填 + */ + private Integer required; + + /** + * 手机号:mobile; 身份证:id_card + */ + private String validType; + + /** + * 默认值 + */ + private String defaultValue; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; + + /** + * 排序 + */ + private Integer sort; + + /** + * 占位提示语 + */ + private String placeholder; + + /** + * 列名 + */ + private String columnName; + + private List options; +} + diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index d89f303291..b66f95f083 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -29,8 +29,10 @@ import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.ConditionResultDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.excel.IcFormExcel; +import com.epmet.service.IcFormItemService; import com.epmet.service.IcFormService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -52,6 +54,8 @@ public class IcFormController { @Autowired private IcFormService icFormService; + @Autowired + private IcFormItemService icFormItemService; @GetMapping("page") public Result> page(@RequestParam Map params){ @@ -109,6 +113,22 @@ public class IcFormController { formDto.setCustomerId(tokenDto.getCustomerId()); ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result().ok(icFormService.getCustomerForm(formDto)); + } + + /** + * 获取居民信息的查询条件,组件列表 + * + * @param tokenDto + * @param formDto + * @return com.epmet.commons.tools.utils.Result> + * @author yinzuomei + * @date 2021/10/27 9:18 上午 + */ + @PostMapping("conditionlist") + public Result> queryConditionList(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto){ + formDto.setCustomerId(tokenDto.getCustomerId()); + ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); + return new Result>().ok(icFormItemService.queryConditionList(formDto)); } } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java index 44086df26f..ce99cb4927 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java @@ -18,8 +18,12 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.result.ConditionResultDTO; import com.epmet.entity.IcFormItemEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 表单项 @@ -29,5 +33,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface IcFormItemDao extends BaseDao { - + + List selectConditionList(@Param("customerId") String customerId, @Param("formCode") String formCode); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java index 78e0934311..c5c509ea25 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcFormItemEntity.java @@ -18,13 +18,10 @@ 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; - /** * 表单项 * @@ -74,7 +71,7 @@ public class IcFormItemEntity extends BaseEpmetEntity { private String itemType; /** - * 分组ID,'默认,NONE' + * 分组ID,'默认,0' */ private String itemGroupId; diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java index 8a2aacd4bc..5fd14e3ef5 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java @@ -20,6 +20,8 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormItemDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.ConditionResultDTO; import com.epmet.entity.IcFormItemEntity; import java.util.List; @@ -92,4 +94,14 @@ public interface IcFormItemService extends BaseService { * @date 2021-10-26 */ void delete(String[] ids); + + /** + * 获取居民信息的查询条件,组件列表 + * + * @param formDto + * @return java.util.List + * @author yinzuomei + * @date 2021/10/27 9:19 上午 + */ + List queryConditionList(CustomerFormQueryDTO formDto); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java index 2c312272af..40bec48d08 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java @@ -25,6 +25,8 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcFormItemDao; import com.epmet.dto.IcFormItemDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.ConditionResultDTO; import com.epmet.entity.IcFormItemEntity; import com.epmet.service.IcFormItemService; import org.apache.commons.lang3.StringUtils; @@ -97,4 +99,18 @@ public class IcFormItemServiceImpl extends BaseServiceImpl + * @author yinzuomei + * @date 2021/10/27 9:19 上午 + */ + @Override + public List queryConditionList(CustomerFormQueryDTO formDto) { + List list=baseDao.selectConditionList(formDto.getCustomerId(),formDto.getFormCode()); + return list; + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index 0bb11f58bf..5c1a6ab869 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -4,5 +4,51 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 16095c56af5df76864468f784330b048c8f86e42 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 27 Oct 2021 10:39:00 +0800 Subject: [PATCH 024/253] none --- .../src/main/java/com/epmet/controller/IcFormController.java | 2 ++ .../src/main/resources/mapper/IcFormDao.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 6dabcc62bf..f6e0d66c98 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -17,7 +17,9 @@ package com.epmet.controller; +import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index b3c51eaf84..536fe55472 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -106,7 +106,7 @@ WHERE fi.DEL_FLAG = '0' AND fi.FORM_ID = #{formId} - AND fi.ITEM_GROUP_ID = 'none' + AND fi.ITEM_GROUP_ID = '0' ORDER BY fi.SORT ASC From 75aaf9e7315eeee39e24945bf8940bd265b50f17 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 27 Oct 2021 10:46:19 +0800 Subject: [PATCH 025/253] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/form/IcResiUserEditFormDTO.java | 27 ++++++++++ .../com/epmet/dto/form/IcResiUserFormDTO.java | 22 ++++---- .../controller/IcResiUserController.java | 4 +- .../java/com/epmet/dao/IcResiUserDao.java | 6 ++- .../com/epmet/service/IcResiUserService.java | 4 +- .../service/impl/IcResiUserServiceImpl.java | 53 +++++++++++++++++-- .../main/resources/mapper/IcResiUserDao.xml | 21 ++++++++ 7 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserEditFormDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserEditFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserEditFormDTO.java new file mode 100644 index 0000000000..dad16bda6b --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserEditFormDTO.java @@ -0,0 +1,27 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description 党建互联平台--保存/修改居民信息 + * @Author sun + */ +@Data +public class IcResiUserEditFormDTO implements Serializable { + private static final long serialVersionUID = 9156247659994638103L; + + /** + * 字段对应表名 + */ + private String tableName; + /** + * 字段key值 + */ + private String columnName; + /** + * 字段值 + */ + private String columnValue; +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java index 29ea3fa9b3..d359492bae 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java @@ -2,24 +2,24 @@ package com.epmet.dto.form; import lombok.Data; -import javax.validation.constraints.NotBlank; import java.io.Serializable; +import java.util.List; +import java.util.Map; /** - * @Description 居民注册信息查询入参DTO - * @Author yinzuomei - * @Date 2020/3/30 10:26 + * @Description 党建互联平台--保存/修改居民信息 + * @Author sun */ @Data public class IcResiUserFormDTO implements Serializable { private static final long serialVersionUID = 9156247659994638103L; - @NotBlank(message = "徽章id不能为空", groups = {ManageGroup.class}) - private String badgeId; + + /** + * 字段对应表名 + */ + private String tableName; /** - * 网格Id + * 表对应的字段及值 */ - @NotBlank(message = "网格id不能为空", groups = {AuditGroup.class}) - private String gridId; - public interface ManageGroup {} - public interface AuditGroup {} + private List> list; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index c24cc5f309..5db6c930a4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -110,8 +110,8 @@ public class IcResiUserController { * @Description 党建互联平台--保存居民信息 **/ @PostMapping("add") - public Result add(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserFormDTO formDTO) { - icResiUserService.add(formDTO); + public Result add(@LoginUser TokenDto tokenDto, @RequestBody List formDTO) { + icResiUserService.add(tokenDto, formDTO); return new Result(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 85ee8dc125..7b45e51552 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -20,6 +20,9 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.entity.IcResiUserEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Map; /** * 用户基础信息 @@ -29,5 +32,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface IcResiUserDao extends BaseDao { - + + void add(@Param("tableName") String tableName, @Param("map") Map map); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 507e214ef5..f4bc23b00f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -19,7 +19,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.entity.IcResiUserEntity; @@ -99,7 +99,7 @@ public interface IcResiUserService extends BaseService { * @Author sun * @Description 党建互联平台--保存居民信息 **/ - void add(IcResiUserFormDTO formDTO); + void add(TokenDto tokenDto, List formDTO); /** * @Author sun diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 3a8c2b195a..2bc1390f19 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -20,16 +20,23 @@ package com.epmet.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.utils.Result; import com.epmet.dao.IcResiUserDao; +import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.entity.IcResiUserEntity; +import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.redis.IcResiUserRedis; import com.epmet.service.IcResiUserService; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.UUID; /** * 用户基础信息 @@ -46,9 +54,11 @@ import java.util.Map; */ @Service public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService { - + private Logger logger = LogManager.getLogger(IcResiUserServiceImpl.class); @Autowired private IcResiUserRedis icResiUserRedis; + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; @Override public PageData page(Map params) { @@ -107,7 +117,44 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { + //循环自动拼接sql语句,往多个表新增数据 + //1.先往主表新增数据 + //主表Id + String resiUserId = UUID.randomUUID().toString().replaceAll("-", ""); + formDTO.forEach(d -> { + if ("ic_resi_user".equals(d.getTableName())) { + Map map = d.getList().get(0); + map.put("id", resiUserId); + map.put("customer_id", tokenDto.getCustomerId()); + map.put("created_by", tokenDto.getUserId()); + map.put("updated_by", tokenDto.getUserId()); + //查询组织信息 + String agencyId = (null == map.get("AGENCY_ID") ? map.get("agency_id") : map.get("AGENCY_ID")); + Result result = govOrgOpenFeignClient.getAgencyById(agencyId); + if (result.success() && null != result.getData()) { + map.put("pids", result.getData().getPids()); + } else { + throw new RenException(String.format("新增居民信息-根据agencyId查询组织信息失败,agencyId->%s", agencyId)); + } + //新增主表数据 + baseDao.add(d.getTableName(), map); + } + }); + //2.循环字表新增数据 + formDTO.forEach(d -> { + if (!"ic_resi_user".equals(d.getTableName())) { + d.getList().forEach(map -> { + map.put("id", UUID.randomUUID().toString().replaceAll("-", "")); + map.put("ic_resi_user", resiUserId); + map.put("customer_id", tokenDto.getCustomerId()); + map.put("created_by", tokenDto.getUserId()); + map.put("updated_by", tokenDto.getUserId()); + //字表新增数据 + baseDao.add(d.getTableName(), map); + }); + } + }); } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 135f7b6635..2631d213fd 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -3,6 +3,27 @@ + + insert into ${tableName} + ( + + ${key} + + ,DEL_FLAG + ,REVISION + ,CREATED_TIME + ,UPDATED_TIME + ) values + ( + + #{value} + + ,'0' + ,'0' + ,NOW() + ,NOW() + ) + \ No newline at end of file From 1e935277315e129b057388d91e6e4f6a0a6bf411 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 27 Oct 2021 10:50:12 +0800 Subject: [PATCH 026/253] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=BF=94=E5=9B=9Eque?= =?UTF-8?q?ryType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dto/result/ConditionResultDTO.java | 5 +++++ .../src/main/resources/mapper/IcFormItemDao.xml | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java index f88bdf2144..07953ef95c 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ConditionResultDTO.java @@ -83,6 +83,11 @@ public class ConditionResultDTO implements Serializable { */ private String columnName; + /** + * 查询类型: equal, like,daterange.... + */ + private String queryType; + private List options; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index 5c1a6ab869..5a929a1b3d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -41,7 +41,8 @@ IFNULL(i.OPTION_SOURCE_VALUE,'') as OPTION_SOURCE_VALUE, b.SORT, IFNULL(i.PLACEHOLDER,'') as PLACEHOLDER, - IFNULL(i.COLUMN_NAME,'')as COLUMN_NAME + IFNULL(i.COLUMN_NAME,'')as COLUMN_NAME, + b.QUERY_TYPE FROM ic_form_query_builder b inner join ic_form_item i on(i.id=b.FORM_ITEM_ID and i.DEL_FLAG='0') LEFT JOIN ic_form_item_group g ON ( i.ITEM_GROUP_ID = g.id ) From a61269a287413374e54f7c59aaf6a03fd00acdb2 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 10:51:41 +0800 Subject: [PATCH 027/253] zancun --- .../epmet/controller/IcResiUserController.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index c24cc5f309..5f2525ece6 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -20,6 +20,7 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; @@ -35,7 +36,7 @@ import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.IcResiUserFormDTO; -import com.epmet.dto.result.CheckFloatFootBarResultDTO; +import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; @@ -131,12 +132,22 @@ public class IcResiUserController { queryDTO.setFormCode("resi_base_info"); queryDTO.setCustomerId(customerId); - Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); + Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); } + System.out.println(JSON.toJSONString(resultForm.getData())); List colList = new ArrayList<>(); + + resultForm.getData().getItemList().forEach(item->{ + + }); + + + + + ExcelExportEntity desginGroup = new ExcelExportEntity("表头名称","键"); desginGroup.setNeedMerge(true); List paramCols = new ArrayList<>(); From 00d66e9b5a92c627c0e74f5422a090a9c775b62b Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 27 Oct 2021 14:24:48 +0800 Subject: [PATCH 028/253] =?UTF-8?q?=E8=A1=A8=E6=96=B0=E5=A2=9E=E5=8D=95?= =?UTF-8?q?=E5=85=83Id=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/dto/IcResiUserDTO.java | 5 +++++ .../src/main/java/com/epmet/entity/IcResiUserEntity.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java index 6a57281d10..12990d491f 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java @@ -68,6 +68,11 @@ public class IcResiUserDTO implements Serializable { */ private String buildId; + /** + * 单元id + */ + private String unitId; + /** * 所属家庭Id */ diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java index 0129c18843..603b530781 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java @@ -68,6 +68,11 @@ public class IcResiUserEntity extends BaseEpmetEntity { */ private String buildId; + /** + * 单元id + */ + private String unitId; + /** * 所属家庭Id */ From 52d804f7539c81295677199284e02b982692b84b Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Wed, 27 Oct 2021 14:28:50 +0800 Subject: [PATCH 029/253] =?UTF-8?q?=E5=85=9A=E6=94=AF=E9=83=A8=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomerPartyBranchController.java | 13 +++++++ .../controller/IcNeighborHoodController.java | 2 +- .../service/CustomerPartyBranchService.java | 10 +++++ .../epmet/service/IcNeighborHoodService.java | 3 +- .../impl/CustomerPartyBranchServiceImpl.java | 37 +++++++++++++++++++ .../service/impl/IcBuildingServiceImpl.java | 3 ++ .../impl/IcBuildingUnitServiceImpl.java | 3 ++ .../service/impl/IcHouseServiceImpl.java | 3 ++ .../impl/IcNeighborHoodServiceImpl.java | 12 ++++-- 9 files changed, 80 insertions(+), 6 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerPartyBranchController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerPartyBranchController.java index 04ebd8e0a0..c950793f86 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerPartyBranchController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerPartyBranchController.java @@ -17,6 +17,7 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; @@ -129,4 +130,16 @@ public class CustomerPartyBranchController { customerPartyBranchService.decrPartyBranchMember(partyBranchId); return new Result(); } + + /** + * 获取网格下支部小组 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/27 9:58 + */ + @PostMapping("branchoption") + public Result> getBranchOption(@RequestBody CustomerPartyBranchDTO formDTO){ + return new Result>().ok(customerPartyBranchService.getBranchOption(formDTO.getGridId())); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java index 69b1775641..cdddab91c8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -92,7 +92,7 @@ public class IcNeighborHoodController { */ @PostMapping("neighborhoodoption") public Result> getNeighborHoodOptions(IcNeighborHoodDTO dto) { - return new Result>().ok(icNeighborHoodService.getNeighborHoodOptions(dto.getGridId())); + return new Result>().ok(icNeighborHoodService.getNeighborHoodOptions(dto.getAgencyId(), dto.getGridId())); } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerPartyBranchService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerPartyBranchService.java index e373bcb0f1..9cd6efe4b9 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerPartyBranchService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerPartyBranchService.java @@ -18,6 +18,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.CustomerPartyBranchDTO; import com.epmet.dto.form.ListPartyBranchFormDTO; @@ -112,4 +113,13 @@ public interface CustomerPartyBranchService extends BaseService} + * @Author zhaoqifeng + * @Date 2021/10/27 9:57 + */ + List getBranchOption(String gridId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java index 1ef5c981fc..d069185056 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java @@ -96,10 +96,11 @@ public interface IcNeighborHoodService extends BaseService /** * @Description 获取网格下小区列表 + * @Param agencyId * @Param gridId * @Return {@link List} * @Author zhaoqifeng * @Date 2021/10/26 14:32 */ - List getNeighborHoodOptions(String gridId); + List getNeighborHoodOptions(String agencyId, String gridId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerPartyBranchServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerPartyBranchServiceImpl.java index 5ec7c27668..e542c017ad 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerPartyBranchServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerPartyBranchServiceImpl.java @@ -17,10 +17,12 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.CustomerPartyBranchDao; @@ -34,14 +36,18 @@ import com.epmet.redis.CustomerPartyBranchRedis; import com.epmet.service.CustomerAgencyService; import com.epmet.service.CustomerGridService; import com.epmet.service.CustomerPartyBranchService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 党支部信息 @@ -49,6 +55,7 @@ import java.util.Map; * @author yinzuomei yinzuomei@elink-cn.com * @since v1.0.0 2020-06-17 */ +@Slf4j @Service public class CustomerPartyBranchServiceImpl extends BaseServiceImpl implements CustomerPartyBranchService { @@ -134,4 +141,34 @@ public class CustomerPartyBranchServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/27 9:57 + */ + @Override + public List getBranchOption(String gridId) { + if (StringUtils.isBlank(gridId)) { + log.error("网格ID为空"); + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CustomerPartyBranchEntity::getGridId, gridId); + wrapper.last("ORDER BY CONVERT ( PARTY_BRANCH_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if(CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + OptionResultDTO dto = new OptionResultDTO(); + dto.setValue(item.getId()); + dto.setLabel(item.getPartyBranchName()); + return dto; + }).collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java index a5bdf574c8..c1d5c440e3 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingServiceImpl.java @@ -29,6 +29,7 @@ import com.epmet.dao.IcBuildingDao; import com.epmet.dto.IcBuildingDTO; import com.epmet.entity.IcBuildingEntity; import com.epmet.service.IcBuildingService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -46,6 +47,7 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-25 */ +@Slf4j @Service public class IcBuildingServiceImpl extends BaseServiceImpl implements IcBuildingService { @@ -113,6 +115,7 @@ public class IcBuildingServiceImpl extends BaseServiceImpl getBuildingOptions(String neighborHoodId) { if (StringUtils.isBlank(neighborHoodId)) { + log.error("小区ID为空"); return Collections.emptyList(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java index c192edad70..2a4a325856 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcBuildingUnitServiceImpl.java @@ -29,6 +29,7 @@ import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dto.IcBuildingUnitDTO; import com.epmet.entity.IcBuildingUnitEntity; import com.epmet.service.IcBuildingUnitService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -46,6 +47,7 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-25 */ +@Slf4j @Service public class IcBuildingUnitServiceImpl extends BaseServiceImpl implements IcBuildingUnitService { @@ -113,6 +115,7 @@ public class IcBuildingUnitServiceImpl extends BaseServiceImpl getUnitOptions(String buildingId) { if (StringUtils.isBlank(buildingId)) { + log.error("楼栋ID为空"); return Collections.emptyList(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 83400c63ab..66e9ecbebe 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -30,6 +30,7 @@ import com.epmet.dto.IcHouseDTO; import com.epmet.dto.form.HouseFormDTO; import com.epmet.entity.IcHouseEntity; import com.epmet.service.IcHouseService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -47,6 +48,7 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-25 */ +@Slf4j @Service public class IcHouseServiceImpl extends BaseServiceImpl implements IcHouseService { @@ -114,6 +116,7 @@ public class IcHouseServiceImpl extends BaseServiceImpl getHouseOption(HouseFormDTO formDTO) { if (StringUtils.isBlank(formDTO.getBuildingId()) && StringUtils.isBlank(formDTO.getUnitId())) { + log.error("楼栋ID为空"); return Collections.emptyList(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java index 5723490984..ceea51f13d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java @@ -29,6 +29,7 @@ import com.epmet.dao.IcNeighborHoodDao; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.service.IcNeighborHoodService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -46,6 +47,7 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-25 */ +@Slf4j @Service public class IcNeighborHoodServiceImpl extends BaseServiceImpl implements IcNeighborHoodService { @@ -103,20 +105,22 @@ public class IcNeighborHoodServiceImpl extends BaseServiceImpl} * @Author zhaoqifeng * @Date 2021/10/26 14:32 */ @Override - public List getNeighborHoodOptions(String gridId) { - if (StringUtils.isBlank(gridId)) { + public List getNeighborHoodOptions(String agencyId, String gridId) { + if (StringUtils.isBlank(agencyId)) { + log.error("组织ID为空"); return Collections.emptyList(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(IcNeighborHoodEntity::getGridId, gridId); + wrapper.eq(IcNeighborHoodEntity::getAgencyId, agencyId); + wrapper.eq(StringUtils.isNotBlank(gridId), IcNeighborHoodEntity::getGridId, gridId); wrapper.last("ORDER BY CONVERT ( NEIGHBOR_HOOD_NAME USING gbk ) ASC"); List list = baseDao.selectList(wrapper); if(CollectionUtils.isEmpty(list)) { From 2afbcbccca27605dfebd56075ee4b3a045be96b2 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Wed, 27 Oct 2021 15:05:24 +0800 Subject: [PATCH 030/253] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E6=89=80=E5=B1=9E=E7=BB=84=E7=BB=87=E5=90=8D=EF=BC=8CID?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/result/StaffBasicInfoResultDTO.java | 10 ++++++++++ .../epmet/controller/CustomerStaffController.java | 2 +- .../java/com/epmet/service/CustomerStaffService.java | 2 +- .../epmet/service/impl/CustomerStaffServiceImpl.java | 12 +++++++++--- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/StaffBasicInfoResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/StaffBasicInfoResultDTO.java index 7de2636450..c861899ccb 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/StaffBasicInfoResultDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/StaffBasicInfoResultDTO.java @@ -67,4 +67,14 @@ public class StaffBasicInfoResultDTO implements Serializable { */ private List roleList; + /** + * 当前工作人员所属组织的agencyId + */ + private String agencyId; + + /** + * 当前工作人员所属组织的agencyName + */ + private String agencyName; + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java index f467d60712..7aae42adea 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/CustomerStaffController.java @@ -396,7 +396,7 @@ public class CustomerStaffController { **/ @PostMapping(value = "staffbasicinfo") public Result staffBasicInfo(@LoginUser TokenDto tokenDTO){ - return customerStaffService.selectStaffBasicInfo(tokenDTO.getUserId()); + return customerStaffService.selectStaffBasicInfo(tokenDTO.getUserId(),tokenDTO.getCustomerId()); } /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java index 74c16285e0..bd4e8aae97 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/CustomerStaffService.java @@ -305,7 +305,7 @@ public interface CustomerStaffService extends BaseService { * @Author zhangyong * @Date 11:10 2020-08-25 **/ - Result selectStaffBasicInfo(String userId); + Result selectStaffBasicInfo(String userId,String customerId); /** * @param formDTO diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java index 6e0c14c1e4..8c880d86cd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/CustomerStaffServiceImpl.java @@ -26,6 +26,7 @@ import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -81,7 +82,7 @@ import java.util.stream.Collectors; @Slf4j @Service public class CustomerStaffServiceImpl extends BaseServiceImpl implements CustomerStaffService { - private Logger logger = LogManager.getLogger(getClass()); + private final Logger logger = LogManager.getLogger(getClass()); @Autowired private GovStaffRoleService govStaffRoleService; @Autowired @@ -415,7 +416,7 @@ public class CustomerStaffServiceImpl extends BaseServiceImpl selectStaffBasicInfo(String userId) { + public Result selectStaffBasicInfo(String userId,String customerId) { StaffBasicInfoResultDTO resultDTO = baseDao.selectStaffBasicInfo(userId); if(null!=resultDTO){ resultDTO.setRoleList(baseDao.selectStaffRoles(userId,resultDTO.getCustomerId())); + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(customerId, userId); + if (null != staffInfo){ + resultDTO.setAgencyId(staffInfo.getAgencyId()); + resultDTO.setAgencyName(staffInfo.getAgencyName()); + } } return new Result().ok(resultDTO); } From 3c222f5445a8ff8567a6453e1258d2394f089adc Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Wed, 27 Oct 2021 16:14:17 +0800 Subject: [PATCH 031/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E5=AD=97=E5=85=B8=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/IcResiDemandDictDTO.java | 107 ++++++++++++++++++ .../IcResiDemandDictController.java | 84 ++++++++++++++ .../com/epmet/dao/IcResiDemandDictDao.java | 37 ++++++ .../epmet/entity/IcResiDemandDictEntity.java | 73 ++++++++++++ .../service/IcResiDemandDictService.java | 96 ++++++++++++++++ .../impl/IcResiDemandDictServiceImpl.java | 99 ++++++++++++++++ .../resources/mapper/IcResiDemandDictDao.xml | 26 +++++ 7 files changed, 522 insertions(+) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDictDTO.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDictDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDictDTO.java new file mode 100644 index 0000000000..ccdb6f5752 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDictDTO.java @@ -0,0 +1,107 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 居民需求字典表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-27 + */ +@Data +public class IcResiDemandDictDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + private String id; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 父级 + */ + private String parentCode; + + /** + * 字典值 + */ + private String categoryCode; + + /** + * 字典描述 + */ + private String categoryName; + + /** + * 级别 + */ + private String level; + + /** + * 备注 + */ + private String remark; + + /** + * 排序 + */ + private Integer sort; + + /** + * 删除标识:0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java new file mode 100644 index 0000000000..4d87ffc779 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java @@ -0,0 +1,84 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +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.IcResiDemandDictDTO; +import com.epmet.service.IcResiDemandDictService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 居民需求字典表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-27 + */ +@RestController +@RequestMapping("icresidemanddict") +public class IcResiDemandDictController { + + @Autowired + private IcResiDemandDictService icResiDemandDictService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icResiDemandDictService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcResiDemandDictDTO data = icResiDemandDictService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcResiDemandDictDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icResiDemandDictService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcResiDemandDictDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icResiDemandDictService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icResiDemandDictService.delete(ids); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java new file mode 100644 index 0000000000..a618f7c71e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java @@ -0,0 +1,37 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.commons.tools.dto.result.OptionResultDTO; +import com.epmet.entity.IcResiDemandDictEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 居民需求字典表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-27 + */ +@Mapper +public interface IcResiDemandDictDao extends BaseDao { + List selectDemandOptions(String customerId); + List selectChildDemands(String parentCode); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java new file mode 100644 index 0000000000..5e01dd2b14 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java @@ -0,0 +1,73 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 居民需求字典表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-27 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_resi_demand_dict") +public class IcResiDemandDictEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id customer.id + */ + private String customerId; + + /** + * 父级 + */ + private String parentCode; + + /** + * 字典值 + */ + private String categoryCode; + + /** + * 字典描述 + */ + private String categoryName; + + /** + * 级别 + */ + private String level; + + /** + * 备注 + */ + private String remark; + + /** + * 排序 + */ + private Integer sort; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java new file mode 100644 index 0000000000..80519d996c --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java @@ -0,0 +1,96 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcResiDemandDictDTO; +import com.epmet.entity.IcResiDemandDictEntity; + +import java.util.List; +import java.util.Map; + +/** + * 居民需求字典表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-27 + */ +public interface IcResiDemandDictService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-27 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-27 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcResiDemandDictDTO + * @author generator + * @date 2021-10-27 + */ + IcResiDemandDictDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-27 + */ + void save(IcResiDemandDictDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-27 + */ + void update(IcResiDemandDictDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-27 + */ + void delete(String[] ids); + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java new file mode 100644 index 0000000000..0cf9fba9d1 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java @@ -0,0 +1,99 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcResiDemandDictDao; +import com.epmet.dto.IcResiDemandDictDTO; +import com.epmet.entity.IcResiDemandDictEntity; +import com.epmet.service.IcResiDemandDictService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 居民需求字典表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-27 + */ +@Service +public class IcResiDemandDictServiceImpl extends BaseServiceImpl implements IcResiDemandDictService { + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcResiDemandDictDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcResiDemandDictDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcResiDemandDictDTO get(String id) { + IcResiDemandDictEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcResiDemandDictDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcResiDemandDictDTO dto) { + IcResiDemandDictEntity entity = ConvertUtils.sourceToTarget(dto, IcResiDemandDictEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcResiDemandDictDTO dto) { + IcResiDemandDictEntity entity = ConvertUtils.sourceToTarget(dto, IcResiDemandDictEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml new file mode 100644 index 0000000000..d2a96e6e66 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 958c8c8af9236edd91b73ead3074013a5aa3d8ad Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 27 Oct 2021 17:37:47 +0800 Subject: [PATCH 032/253] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 4 +- .../java/com/epmet/dao/IcResiUserDao.java | 10 ++++ .../com/epmet/service/IcResiUserService.java | 2 +- .../service/impl/IcResiUserServiceImpl.java | 54 +++++++++++++++++-- .../main/resources/mapper/IcResiUserDao.xml | 23 +++++--- 5 files changed, 78 insertions(+), 15 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 0fdf14cf48..415dcd9323 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -121,8 +121,8 @@ public class IcResiUserController { * @Description 党建互联平台--修改居民信息 **/ @PostMapping("edit") - public Result edit(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserFormDTO formDTO) { - icResiUserService.edit(formDTO); + public Result edit(@LoginUser TokenDto tokenDto, @RequestBody List formDTO) { + icResiUserService.edit(tokenDto, formDTO); return new Result(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 7b45e51552..3ddc71fec4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -33,5 +33,15 @@ import java.util.Map; @Mapper public interface IcResiUserDao extends BaseDao { + /** + * @Author sun + * @Description 居民信息各表新增数据 + **/ void add(@Param("tableName") String tableName, @Param("map") Map map); + + /** + * @Author sun + * @Description 更新或新增居民信息各表数据 + **/ + void upTable(@Param("tableName") String tableName, @Param("id") String id, @Param("map") Map map); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index f4bc23b00f..fe66ec72e6 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -105,5 +105,5 @@ public interface IcResiUserService extends BaseService { * @Author sun * @Description 党建互联平台--修改居民信息 **/ - void edit(IcResiUserFormDTO formDTO); + void edit(TokenDto tokenDto, List formDTO); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 2bc1390f19..e255ee7309 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; @@ -34,6 +35,7 @@ import com.epmet.entity.IcResiUserEntity; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.redis.IcResiUserRedis; import com.epmet.service.IcResiUserService; +import oracle.sql.NUMBER; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,10 +43,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; /** * 用户基础信息 @@ -163,7 +162,52 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { + //1.校验主表数据是否存在 + String resiUserId = ""; + Map map = new HashMap<>(); + for (IcResiUserFormDTO d : formDTO) { + if ("ic_resi_user".equals(d.getTableName())) { + map = d.getList().get(0); + if (!map.containsKey("ID")) { + throw new RenException(String.format("居民信息修改-居民信息表主键值为空")); + } + resiUserId = map.get("ID"); + } + } + if (null == map) { + throw new RenException(String.format("居民信息修改,参数错误,未传入基础信息Id")); + } + IcResiUserEntity entity = baseDao.selectById(resiUserId); + if (null == entity) { + throw new RenException(String.format("居民信息修改,获取基础信息失败,基础信息Id->", resiUserId)); + } + //2.更新主表数据 + if (map.size() > NumConstant.ONE) { + map.put("updated_by", tokenDto.getUserId()); + baseDao.upTable("ic_resi_user", resiUserId, map); + } + + //3.循环更新或新增字表数据 + String finalResiUserId = resiUserId; + formDTO.forEach(d -> { + if (!"ic_resi_user".equals(d.getTableName())) { + d.getList().forEach(hash -> { + hash.put("updated_by", tokenDto.getUserId()); + if (!hash.containsKey("ID")) { + hash.put("id", UUID.randomUUID().toString().replaceAll("-", "")); + hash.put("ic_resi_user", finalResiUserId); + hash.put("customer_id", tokenDto.getCustomerId()); + hash.put("created_by", tokenDto.getUserId()); + //字表新增数据 + baseDao.add(d.getTableName(), hash); + } else { + //字表更新数据 + baseDao.upTable(d.getTableName(), hash.get("ID"), hash); + } + }); + } + }); } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 2631d213fd..a80df030b9 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -15,15 +15,24 @@ ,UPDATED_TIME ) values ( - - #{value} - - ,'0' - ,'0' - ,NOW() - ,NOW() + + #{value} + + ,'0' + ,'0' + ,NOW() + ,NOW() ) + + UPDATE ${tableName} + SET + + ${key} = #{value} + + ,UPDATED_TIME = NOW() + WHERE id = #{id} + \ No newline at end of file From 912e07e938ff307856dec4fcc226667087dfde99 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 17:45:16 +0800 Subject: [PATCH 033/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dto/form/CustomerFormQueryDTO.java | 5 +++++ .../main/java/com/epmet/controller/IcFormController.java | 6 ++++++ .../src/main/java/com/epmet/dao/IcFormDao.java | 4 ++-- .../main/java/com/epmet/service/impl/IcFormServiceImpl.java | 4 ++-- .../src/main/resources/mapper/IcFormDao.xml | 5 ++++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java index e2bafc12df..55e1160110 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java @@ -19,5 +19,10 @@ public class CustomerFormQueryDTO implements Serializable { @NotBlank(message = "tokenDto获取customerId不能为空",groups =AddUserInternalGroup.class ) private String customerId; + + /** + * 是否动态 + */ + private Boolean dynamic; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index f6e0d66c98..708bc42093 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -114,6 +114,9 @@ public class IcFormController { if (StringUtils.isBlank(formDto.getCustomerId())){ formDto.setCustomerId(customerId); } + if (formDto.getDynamic() == null){ + formDto.setDynamic(true); + } ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result().ok(icFormService.getCustomerForm(formDto)); } @@ -131,6 +134,9 @@ public class IcFormController { @PostMapping("conditionlist") public Result> queryConditionList(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto){ formDto.setCustomerId(tokenDto.getCustomerId()); + if (formDto.getDynamic() == null){ + formDto.setDynamic(true); + } ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result>().ok(icFormItemService.queryConditionList(formDto)); } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java index bed3566120..846e59ad72 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java @@ -47,7 +47,7 @@ public interface IcFormDao extends BaseDao { */ CustomerFormResultDTO selectByCode(@Param("customerId") String customerId, @Param("formCode") String formCode); - List selectItemList(String formId); + List selectItemList(String formId, Boolean dynamic); List selectItemListByGroupId(String groupId); List selectListOption(String itemId); @@ -55,4 +55,4 @@ public interface IcFormDao extends BaseDao { List selectListGroup(String formId); FormGroupDTO selectChildGroup(String itemId); -} \ No newline at end of file +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index 03b03ffaf8..6a4d8a426c 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -118,7 +118,7 @@ public class IcFormServiceImpl extends BaseServiceImpl if (null == resultDTO) { throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); } - List itemList=baseDao.selectItemList(resultDTO.getFormId()); + List itemList=baseDao.selectItemList(resultDTO.getFormId(),formDto.getDynamic()); List groupList=baseDao.selectListGroup(resultDTO.getFormId()); resultDTO.setItemList(itemList); @@ -126,4 +126,4 @@ public class IcFormServiceImpl extends BaseServiceImpl return resultDTO; } -} \ No newline at end of file +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 536fe55472..9612996019 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -106,6 +106,9 @@ WHERE fi.DEL_FLAG = '0' AND fi.FORM_ID = #{formId} + + fi.DYNAMIC = #{dynamic} + AND fi.ITEM_GROUP_ID = '0' ORDER BY fi.SORT ASC @@ -196,4 +199,4 @@ g.SORT ASC - \ No newline at end of file + From 2d4b0c73436fc33738bd4e07f3aef6db0bf12702 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 27 Oct 2021 17:51:54 +0800 Subject: [PATCH 034/253] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 60 ++++++++++++++--- .../ExcelDiceAddressListHandlerImpl.java | 64 +++++++++++++++++++ 2 files changed, 114 insertions(+), 10 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/handler/ExcelDiceAddressListHandlerImpl.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 415dcd9323..4e49766a21 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -39,14 +39,19 @@ import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.handler.ExcelDiceAddressListHandlerImpl; import com.epmet.service.IcResiUserService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** @@ -137,18 +142,52 @@ public class IcResiUserController { throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); } System.out.println(JSON.toJSONString(resultForm.getData())); - List colList = new ArrayList<>(); + List firstHeaderList = new ArrayList<>(); resultForm.getData().getItemList().forEach(item->{ - + ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum()))); + header.setNeedMerge(true); + firstHeaderList.add(header); + String baseTableName = "resi_base_info"; + + if (item.getChildGroup() != null){ + //baseTableName单独的一个sheet + if (baseTableName.equals(item.getTableName())){ + header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); + header.setNeedMerge(true); + }else{ + header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); + header.setNeedMerge(true); + } + if (item.getColumnName().equals("GENDER")){ + header.setReplace(new String[]{"男_1","女_2"}); + } + List secondHeaderList = new ArrayList<>(); + item.getChildGroup().getItemList().forEach(item2->{ + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); + secondHeader.setNeedMerge(true); + secondHeaderList.add(secondHeader); + if (CollectionUtils.isNotEmpty(item2.getOptions())){ + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); + thirdHeader.setNeedMerge(true); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } + }); + header.setList(secondHeaderList); + firstHeaderList.add(header); + } }); - ExcelExportEntity desginGroup = new ExcelExportEntity("表头名称","键"); + /* ExcelExportEntity desginGroup = new ExcelExportEntity("表头名称","键"); desginGroup.setNeedMerge(true); List paramCols = new ArrayList<>(); List headerList = Arrays.asList("头1","头2","头3"); @@ -157,15 +196,16 @@ public class IcResiUserController { }); desginGroup.setList(paramCols); - colList.add(desginGroup); + colList.add(desginGroup);*/ List> dataList =new ArrayList<>(); Map dataMap = new HashMap<>(); - dataMap.put("头1","1"); - dataMap.put("头2","2"); - dataMap.put("头3","3"); + dataMap.put("GENDER0","1"); + dataMap.put("ID_CARD0","371888991"); + dataList.add(dataMap); - ExportParams entity = new ExportParams(); - Workbook workbook = ExcelExportUtil.exportExcel(entity, colList, dataList); + ExportParams exportParams = new ExportParams(); + exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl()); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, firstHeaderList, dataList); //ExcelExportUtil.exportExcel FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); workbook.write(fos); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/handler/ExcelDiceAddressListHandlerImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/handler/ExcelDiceAddressListHandlerImpl.java new file mode 100644 index 0000000000..b03634c761 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/handler/ExcelDiceAddressListHandlerImpl.java @@ -0,0 +1,64 @@ +package com.epmet.handler; + +import cn.afterturn.easypoi.handler.inter.IExcelDictHandler; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 模拟使用,生产请用真实字典 + * + * @author jueyue on 20-4-26. + */ +public class ExcelDiceAddressListHandlerImpl implements IExcelDictHandler { + + /** + * 返回字典所有值 + * key: dictKey + * + * @param dict 字典Key + * @return + */ + public List getList(String dict) { + List list = new ArrayList<>(); + Map dictMap = new HashMap<>(); + dictMap.put("dictKey", "1"); + dictMap.put("dictValue", "男"); + list.add(dictMap); + dictMap = new HashMap<>(); + dictMap.put("dictKey", "2"); + dictMap.put("dictValue", "女"); + list.add(dictMap); + return list; + } + + @Override + public String toName(String dict, Object obj, String name, Object value) { + if ("level".equals(dict)) { + int level = Integer.parseInt(value.toString()); + switch (level) { + case 1: + return "男"; + case 2: + return "女"; + } + } + return null; + } + + @Override + public String toValue(String dict, Object obj, String name, Object value) { + if ("level".equals(dict)) { + int level = Integer.parseInt(value.toString()); + switch (level) { + case 1: + return "男"; + case 2: + return "女"; + } + } + return null; + } +} From db8267572a33e39101fb54c6aeb95f1ae40e34fd Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 28 Oct 2021 08:58:44 +0800 Subject: [PATCH 035/253] =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcFormDao.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 9612996019..80cdaee859 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -107,7 +107,7 @@ fi.DEL_FLAG = '0' AND fi.FORM_ID = #{formId} - fi.DYNAMIC = #{dynamic} + AND fi.DYNAMIC = #{dynamic} AND fi.ITEM_GROUP_ID = '0' ORDER BY From 5683872d39cb1f87ae6caa3270954ef01471cc52 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 09:13:23 +0800 Subject: [PATCH 036/253] zancun --- .../dto/epmetuser/IcFormResColumnDTO.java | 17 ++ .../epmetuser/form/IcResiDetailFormDTO.java | 20 ++ .../epmetuser/form/IcResiUserPageFormDTO.java | 37 ++++ .../epmetuser/form/ResiUserQueryValueDTO.java | 20 ++ .../result/IcResiUserPageResultDTO.java | 172 ++++++++++++++++++ .../controller/IcResiUserController.java | 45 +++++ .../dao/epmetuser/IcResiUserDao.java | 18 ++ .../dao/opercustomize/CustomerFootBarDao.java | 5 + .../service/epmetuser/IcResiUserService.java | 14 ++ .../epmetuser/impl/IcResiUserServiceImpl.java | 85 +++++++++ .../opercustomize/CustomerFootBarService.java | 7 + .../impl/CustomerFootBarServiceImpl.java | 11 ++ .../mapper/epmetuser/IcResiUserDao.xml | 65 +++++++ .../opercustomize/CustomerFootBarDao.xml | 40 ++++ 14 files changed, 556 insertions(+) create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java create mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java create mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java create mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java create mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java create mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java new file mode 100644 index 0000000000..2679aa595b --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java @@ -0,0 +1,17 @@ +package com.epmet.dataaggre.dto.epmetuser; + +import lombok.Data; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/27 4:26 下午 + */ +@Data +public class IcFormResColumnDTO { + private String tableName; + private String columnName; + private String label; + private String link; +} + diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java new file mode 100644 index 0000000000..8d45b774b5 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java @@ -0,0 +1,20 @@ +package com.epmet.dataaggre.dto.epmetuser.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 查看详情,回显表单 + * @Author yinzuomei + * @Date 2021/10/27 10:22 下午 + */ +@Data +public class IcResiDetailFormDTO implements Serializable { + public interface AddUserInternalGroup { + } + @NotBlank(message = "icResiUserId不能为空",groups = AddUserInternalGroup.class) + private String icResiUserId; +} + diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java new file mode 100644 index 0000000000..e9ae3c2eea --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java @@ -0,0 +1,37 @@ +package com.epmet.dataaggre.dto.epmetuser.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * @Description 居民信息,分页查询入参 + * @Author yinzuomei + * @Date 2021/10/27 2:06 下午 + */ +@Data +public class IcResiUserPageFormDTO implements Serializable { + public interface AddUserInternalGroup { + } + + @NotNull(message = "pageNo不能为空", groups = AddUserInternalGroup.class) + private Integer pageNo; + + @NotNull(message = "pageSize不能为空", groups = AddUserInternalGroup.class) + private Integer pageSize; + + @NotBlank(message = "formCode不能为空", groups = AddUserInternalGroup.class) + private String formCode; + + @NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class) + private String customerId; + + /** + * 表对应的字段及值 + */ + private List conditions; +} + diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java new file mode 100644 index 0000000000..7e11156ba3 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java @@ -0,0 +1,20 @@ +package com.epmet.dataaggre.dto.epmetuser.form; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/27 6:02 下午 + */ +@Data +public class ResiUserQueryValueDTO implements Serializable { + private String queryType; + private List columnValue; + private String columnName; + private String tableName; +} + diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java new file mode 100644 index 0000000000..3c8774abf9 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java @@ -0,0 +1,172 @@ +package com.epmet.dataaggre.dto.epmetuser.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 居民信息分页查询表单返参 + * @Author yinzuomei + * @Date 2021/10/27 2:07 下午 + */ +@Data +public class IcResiUserPageResultDTO implements Serializable { + private String icResiUserId; + private String gridId; + private String gridName; + /** + * 所属小区ID + */ + private String villageId; + private String vallageName; + + + /** + * 所属楼宇Id + */ + private String buildId; + private String buildName; + + /** + * 单元id + */ + private String unitId; + private String unitName; + + /** + * 所属家庭Id + */ + private String homeId; + private String homeName; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String mobile; + + /** + * 性别 + */ + private String gender; + + /** + * 身份证号 + */ + private String idCard; + + /** + * 出生日期 + */ + private String birthday; + + /** + * 备注 + */ + private String remarks; + + /** + * 是否党员 + */ + private Boolean isParty; + + /** + * 是否低保户 + */ + private Boolean isDbh; + + /** + * 是否保障房 + */ + private Boolean isEnsureHouse; + + /** + * 是否失业 + */ + private Boolean isUnemployed; + + /** + * 是否育龄妇女 + */ + private Boolean isYlfn; + + /** + * 是否退役军人 + */ + private Boolean isVeterans; + + /** + * 是否统战人员 + */ + private Boolean isUnitedFront; + + /** + * 是否信访人员 + */ + private Boolean isXfry; + + /** + * 是否志愿者 + */ + private Boolean isVolunteer; + + /** + * 是否老年人 + */ + private Boolean isOldPeople; + + /** + * 是否空巢 + */ + private Boolean isKc; + + /** + * 是否失独 + */ + private Boolean isSd; + + /** + * 是否失能 + */ + private Boolean isSn; + + /** + * 是否失智 + */ + private Boolean isSz; + + /** + * 是否残疾 + */ + private Boolean isCj; + + /** + * 是否大病 + */ + private Boolean isDb; + + /** + * 是否慢病 + */ + private Boolean isMb; + + /** + * 是否特殊人群 + */ + private Boolean isSpecial; + + private List demandCategoryIds; + + private String demandName; + + /** + * 房屋类型,1楼房,2平房,3别墅 + */ + private String houseType; +} + diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java new file mode 100644 index 0000000000..ae62a23057 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java @@ -0,0 +1,45 @@ +package com.epmet.dataaggre.controller; + +import com.epmet.commons.tools.annotation.LoginUser; +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.ValidatorUtils; +import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; +import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; +import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; +import com.epmet.dataaggre.service.epmetuser.IcResiUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/27 2:03 下午 + */ +@RestController +@RequestMapping("icresiuser") +public class IcResiUserController { + + @Autowired + private IcResiUserService icResiUserService; + + + @PostMapping("listresi") + public Result> queryListResi(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ + //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); + return new Result>().ok(icResiUserService.pageResi(pageFormDTO)); + } + + + @PostMapping("detail") + public Result queryIcResiDetail(@RequestBody IcResiDetailFormDTO pageFormDTO){ + ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); + return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); + } +} + diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java new file mode 100644 index 0000000000..f7ba23a038 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java @@ -0,0 +1,18 @@ +package com.epmet.dataaggre.dao.epmetuser; + +import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; +import com.epmet.dataaggre.dto.epmetuser.form.ResiUserQueryValueDTO; +import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface IcResiUserDao { + List selectListResi(@Param("customerId") String customerId, + @Param("formCode") String formCode, + @Param("conditions") List conditions, + @Param("resultColumns") List resultColumns, + @Param("subTables") List subTables); +} diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java index 7d5d11dda7..340b09f34d 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java @@ -19,6 +19,7 @@ package com.epmet.dataaggre.dao.opercustomize; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dataaggre.dto.app.result.CustomerFootBarDTO; +import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.entity.opercustomize.CustomerFootBarEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -56,4 +57,8 @@ public interface CustomerFootBarDao extends BaseDao { * @date 2021/7/28 10:56 */ CustomerFootBarEntity selectDefaultIcon(@Param("customerId") String customerId, @Param("appType")String appType, @Param("barKey")String barKey); + + List queryConditions(@Param("customerId") String customerId, @Param("formCode")String formCode); + + List querySubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java new file mode 100644 index 0000000000..d439b7b5bd --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java @@ -0,0 +1,14 @@ +package com.epmet.dataaggre.service.epmetuser; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; +import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; +import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; + +import java.util.Map; + +public interface IcResiUserService { + PageData pageResi(IcResiUserPageFormDTO pageFormDTO); + + Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); +} diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java new file mode 100644 index 0000000000..ddc2dda57e --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java @@ -0,0 +1,85 @@ +package com.epmet.dataaggre.service.epmetuser.impl; + +import com.epmet.commons.dynamic.datasource.annotation.DataSource; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dataaggre.constant.DataSourceConstant; +import com.epmet.dataaggre.dao.epmetuser.IcResiUserDao; +import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; +import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; +import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; +import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; +import com.epmet.dataaggre.service.epmetuser.IcResiUserService; +import com.epmet.dataaggre.service.opercustomize.CustomerFootBarService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/27 2:04 下午 + */ +@Service +@DataSource(DataSourceConstant.EPMET_USER) +@Slf4j +public class IcResiUserServiceImpl implements IcResiUserService { + @Autowired + private IcResiUserDao icResiUserDao; + @Autowired + private CustomerFootBarService customerFootBarService; + + + + @Override + public PageData pageResi(IcResiUserPageFormDTO formDTO) { + // 查询列表展示项,如果没有,直接返回 + List resultColumns=customerFootBarService.queryConditions(formDTO.getCustomerId(),formDTO.getFormCode()); + if(CollectionUtils.isEmpty(resultColumns)){ + log.warn("没有配置列表展示列"); + return new PageData(new ArrayList(), NumConstant.ZERO); + } + + // 查询列表展示项需要用到哪些子表 + List subTables=customerFootBarService.querySubTables(formDTO.getCustomerId(),formDTO.getFormCode()); + + /* Set subTableList=resultColumns.stream().filter(item->!item.getTableName().equals("ic_resi_user") + && StringUtils.isNotBlank(item.getLink())) + .map(IcFormResColumnDTO :: getTableName).collect(Collectors.toSet()); + List subTables=new ArrayList<>(); + subTableList.forEach(tableName->{ + //'left join ',temp.TABLE_NAME, ' on ( ic_resi_user.ID=',temp.TABLE_NAME,'.IC_RESI_USER and ',temp.TABLE_NAME,'.del_flag="0" )' + String joinSql=String.format("% join %s on ( ic_resi_user.ID=%s.IC_RESI_USER and %s.del_flag=\"0\" "); + subTables.add(joinSql); + });*/ + PageInfo pageInfo = PageHelper.startPage(formDTO.getPageNo(), + formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResi(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + resultColumns, + subTables)); + List list = pageInfo.getList(); + //todo 还早着呢 + + + + pageInfo.setList(list); + return new PageData<>(pageInfo.getList(),pageInfo.getTotal()); + } + + @Override + public Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO) { + + return null; + } + + +} + diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java index b185b9746a..269dcb4be3 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java @@ -20,8 +20,11 @@ package com.epmet.dataaggre.service.opercustomize; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.dataaggre.dto.app.form.AppFootBarFormDTO; import com.epmet.dataaggre.dto.app.result.AppFootBarResultDTO; +import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.entity.opercustomize.CustomerFootBarEntity; +import java.util.List; + /** * APP底部菜单栏信息 * @@ -39,4 +42,8 @@ public interface CustomerFootBarService extends BaseService queryConditions(String customerId, String formCode); + + List querySubTables(String customerId, String formCode); } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java index 4e1546f5a5..53a717d53e 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.dataaggre.dao.opercustomize.CustomerFootBarDao; import com.epmet.dataaggre.dto.app.form.AppFootBarFormDTO; import com.epmet.dataaggre.dto.app.result.AppFootBarResultDTO; import com.epmet.dataaggre.dto.app.result.CustomerFootBarDTO; +import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.entity.opercrm.CustomerParameterEntity; import com.epmet.dataaggre.entity.opercustomize.CustomerFootBarEntity; import com.epmet.dataaggre.service.opercrm.CustomerParameterService; @@ -112,4 +113,14 @@ public class CustomerFootBarServiceImpl extends BaseServiceImpl queryConditions(String customerId, String formCode) { + return baseDao.queryConditions(customerId,formCode); + } + + @Override + public List querySubTables(String customerId, String formCode) { + return baseDao.querySubTables(customerId,formCode); + } + } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml new file mode 100644 index 0000000000..6ae2537dd4 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml index b412fd552f..1a01106cec 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml @@ -38,4 +38,44 @@ and c.BAR_KEY=#{barKey} AND C.DISPLAY='1' + + + + \ No newline at end of file From 992a4b60fc24749c9113c5751215592b765c5a80 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 28 Oct 2021 09:35:21 +0800 Subject: [PATCH 037/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dto/IcResiDemandDTO.java | 24 ++----------------- .../com/epmet/entity/IcResiDemandEntity.java | 19 ++------------- .../com/epmet/excel/IcResiDemandExcel.java | 13 ++-------- 3 files changed, 6 insertions(+), 50 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java index c0d6370588..a04efa1096 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiDemandDTO.java @@ -44,29 +44,9 @@ public class IcResiDemandDTO implements Serializable { private String customerId; /** - * 主表Id + * 需求code【对应ic_resi_demand_dict】 */ - private String icResiUser; - - /** - * 大类Id - */ - private Date bigClass; - - /** - * 大类名称 - */ - private Date bigClassName; - - /** - * 小类Id - */ - private String smallClass; - - /** - * 小类名称 - */ - private String smallClassName; + private String categoryCode; /** * 描述 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java index 6e2b9ac670..fa4da89b59 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandEntity.java @@ -49,24 +49,9 @@ public class IcResiDemandEntity extends BaseEpmetEntity { private String icResiUser; /** - * 大类Id + * 需求code【对应ic_resi_demand_dict】 */ - private Date bigClass; - - /** - * 大类名称 - */ - private Date bigClassName; - - /** - * 小类Id - */ - private String smallClass; - - /** - * 小类名称 - */ - private String smallClassName; + private String categoryCode; /** * 描述 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java index 8f257a3264..4cf0f37a71 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiDemandExcel.java @@ -40,17 +40,8 @@ public class IcResiDemandExcel { @Excel(name = "主表Id") private String icResiUser; - @Excel(name = "大类Id") - private Date bigClass; - - @Excel(name = "大类名称") - private Date bigClassName; - - @Excel(name = "小类Id") - private String smallClass; - - @Excel(name = "小类名称") - private String smallClassName; + @Excel(name = "需求code") + private String categoryCode; @Excel(name = "描述") private String remakes; From 1a5837eb97a130fac907dc9c28f42e61599a0b11 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Thu, 28 Oct 2021 10:09:34 +0800 Subject: [PATCH 038/253] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IcResiDemandDictController.java | 9 +++++ .../com/epmet/dao/IcResiDemandDictDao.java | 5 ++- .../service/IcResiDemandDictService.java | 10 +++++ .../impl/IcResiDemandDictServiceImpl.java | 14 +++++++ .../resources/mapper/IcResiDemandDictDao.xml | 39 ++++++++++++++++++- 5 files changed, 73 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java index 4d87ffc779..c83b41aa4f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java @@ -17,7 +17,10 @@ package com.epmet.controller; +import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.dto.result.OptionResultDTO; 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; @@ -29,6 +32,7 @@ import com.epmet.service.IcResiDemandDictService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @@ -81,4 +85,9 @@ public class IcResiDemandDictController { return new Result(); } + @PostMapping("demandoption") + public Result> getDemandOptions(@LoginUser TokenDto tokenDto) { + return new Result>().ok(icResiDemandDictService.getDemandOptions(tokenDto.getCustomerId())); + } + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java index a618f7c71e..390e190f3c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java @@ -21,6 +21,7 @@ import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.entity.IcResiDemandDictEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -32,6 +33,6 @@ import java.util.List; */ @Mapper public interface IcResiDemandDictDao extends BaseDao { - List selectDemandOptions(String customerId); - List selectChildDemands(String parentCode); + List selectDemandOptions(@Param("customerId") String customerId); + List selectChildDemands(@Param("customerId")String customerId, @Param("parentCode") String parentCode); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java index 80519d996c..034d4fc166 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java @@ -18,6 +18,7 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcResiDemandDictDTO; import com.epmet.entity.IcResiDemandDictEntity; @@ -93,4 +94,13 @@ public interface IcResiDemandDictService extends BaseService} + * @Author zhaoqifeng + * @Date 2021/10/27 17:57 + */ + List getDemandOptions(String customerId); + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java index 0cf9fba9d1..1910a360af 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcResiDemandDictDao; @@ -96,4 +97,17 @@ public class IcResiDemandDictServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/27 17:57 + */ + @Override + public List getDemandOptions(String customerId) { + return baseDao.selectDemandOptions(customerId); + } + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml index d2a96e6e66..d33235f4bf 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml @@ -19,8 +19,43 @@ - - + + + + + + + + + \ No newline at end of file From aacb7d3e62c1c8cd5bb56de471470078578286ea Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 28 Oct 2021 10:09:52 +0800 Subject: [PATCH 039/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcFormController.java | 6 ------ .../src/main/resources/logback-spring.xml | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 708bc42093..f6e0d66c98 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -114,9 +114,6 @@ public class IcFormController { if (StringUtils.isBlank(formDto.getCustomerId())){ formDto.setCustomerId(customerId); } - if (formDto.getDynamic() == null){ - formDto.setDynamic(true); - } ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result().ok(icFormService.getCustomerForm(formDto)); } @@ -134,9 +131,6 @@ public class IcFormController { @PostMapping("conditionlist") public Result> queryConditionList(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto){ formDto.setCustomerId(tokenDto.getCustomerId()); - if (formDto.getDynamic() == null){ - formDto.setDynamic(true); - } ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result>().ok(icFormItemService.queryConditionList(formDto)); } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/logback-spring.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/logback-spring.xml index d02b4bffb3..9e56bd9fda 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/logback-spring.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/logback-spring.xml @@ -139,7 +139,7 @@ - + From 3215deac9bc1b321b8b50ae5226ae70027ceb002 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 28 Oct 2021 10:21:53 +0800 Subject: [PATCH 040/253] =?UTF-8?q?=E8=BF=98=E6=98=AF=E7=94=A8=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/feign/OperCustomizeOpenFeignClient.java | 2 +- .../src/main/java/com/epmet/controller/IcFormController.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 3bfeb03e14..34d02086a4 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -46,7 +46,7 @@ public interface OperCustomizeOpenFeignClient { Result checkFloatFootBar(@RequestBody CheckFloatFootBarFormDTO checkFloatFootBarFormDTO); /** - * desc: 获取表单填写项 + * desc: 获取表单填写项 【dynamic=null】查询全部;否则查询对应的item * @param formDto * @return */ diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index f6e0d66c98..9927a84eb1 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -102,7 +102,7 @@ public class IcFormController { /** - * 获取居民信息表单 + * 获取居民信息表单 【dynamic=null】查询全部;否则查询对应的item * * @param formDto * @return com.epmet.commons.tools.utils.Result @@ -120,7 +120,7 @@ public class IcFormController { /** - * 获取居民信息的查询条件,组件列表 + * 获取居民信息的查询条件,组件列表 【dynamic=null】查询全部;否则查询对应的item * * @param tokenDto * @param formDto From 822b61b1a4dda2b033a1fdd7590261d3113debe5 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 28 Oct 2021 10:24:53 +0800 Subject: [PATCH 041/253] =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/service/impl/IcResiUserServiceImpl.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index e255ee7309..3c49519af1 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -116,6 +116,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { //循环自动拼接sql语句,往多个表新增数据 //1.先往主表新增数据 @@ -123,7 +124,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { if ("ic_resi_user".equals(d.getTableName())) { - Map map = d.getList().get(0); + LinkedHashMap map = d.getList().get(0); map.put("id", resiUserId); map.put("customer_id", tokenDto.getCustomerId()); map.put("created_by", tokenDto.getUserId()); @@ -143,7 +144,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { if (!"ic_resi_user".equals(d.getTableName())) { - d.getList().forEach(map -> { + for (LinkedHashMap map : d.getList()) { map.put("id", UUID.randomUUID().toString().replaceAll("-", "")); map.put("ic_resi_user", resiUserId); map.put("customer_id", tokenDto.getCustomerId()); @@ -151,7 +152,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { //1.校验主表数据是否存在 String resiUserId = ""; - Map map = new HashMap<>(); + LinkedHashMap map = new LinkedHashMap<>(); for (IcResiUserFormDTO d : formDTO) { if ("ic_resi_user".equals(d.getTableName())) { map = d.getList().get(0); @@ -192,7 +194,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { if (!"ic_resi_user".equals(d.getTableName())) { - d.getList().forEach(hash -> { + for (LinkedHashMap hash : d.getList()) { hash.put("updated_by", tokenDto.getUserId()); if (!hash.containsKey("ID")) { hash.put("id", UUID.randomUUID().toString().replaceAll("-", "")); @@ -205,7 +207,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Thu, 28 Oct 2021 10:26:13 +0800 Subject: [PATCH 042/253] =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java index d359492bae..b510b12c2a 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserFormDTO.java @@ -3,8 +3,8 @@ package com.epmet.dto.form; import lombok.Data; import java.io.Serializable; +import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; /** * @Description 党建互联平台--保存/修改居民信息 @@ -21,5 +21,5 @@ public class IcResiUserFormDTO implements Serializable { /** * 表对应的字段及值 */ - private List> list; + private List> list; } From 07d06bf55727282c4a70c5a1392eb272ed4bcaa4 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 10:33:36 +0800 Subject: [PATCH 043/253] zancun --- .../epmetuser/form/IcResiDetailFormDTO.java | 6 +++ .../controller/IcResiUserController.java | 18 +++++++++ .../dao/epmetuser/IcResiUserDao.java | 6 +++ .../dao/opercustomize/CustomerFootBarDao.java | 3 ++ .../service/epmetuser/IcResiUserService.java | 16 ++++++++ .../epmetuser/impl/IcResiUserServiceImpl.java | 38 +++++++++++++++++-- .../opercustomize/CustomerFootBarService.java | 3 ++ .../impl/CustomerFootBarServiceImpl.java | 6 +++ .../mapper/epmetuser/IcResiUserDao.xml | 9 +++++ .../opercustomize/CustomerFootBarDao.xml | 13 +++++++ .../java/com/epmet/dto/result/FormItem.java | 5 +++ .../java/com/epmet/dto/result/FormItem2.java | 5 +++ .../src/main/resources/mapper/IcFormDao.xml | 9 ++++- 13 files changed, 131 insertions(+), 6 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java index 8d45b774b5..e7952a1ef4 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java @@ -16,5 +16,11 @@ public class IcResiDetailFormDTO implements Serializable { } @NotBlank(message = "icResiUserId不能为空",groups = AddUserInternalGroup.class) private String icResiUserId; + + @NotBlank(message = "formCode不能为空", groups = AddUserInternalGroup.class) + private String formCode; + + @NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class) + private String customerId; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java index ae62a23057..ceeecfacb3 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java @@ -28,14 +28,32 @@ public class IcResiUserController { private IcResiUserService icResiUserService; + /** + * 分页查询居民信息列表 + * + * @param tokenDto + * @param pageFormDTO + * @return com.epmet.commons.tools.utils.Result> + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ @PostMapping("listresi") public Result> queryListResi(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + pageFormDTO.setCustomerId(tokenDto.getCustomerId()); ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); return new Result>().ok(icResiUserService.pageResi(pageFormDTO)); } + /** + * 编辑页面,显示居民信息详情 + * + * @param pageFormDTO + * @return com.epmet.commons.tools.utils.Result + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ @PostMapping("detail") public Result queryIcResiDetail(@RequestBody IcResiDetailFormDTO pageFormDTO){ ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java index f7ba23a038..b4871aadbc 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java @@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; @Mapper public interface IcResiUserDao { @@ -15,4 +16,9 @@ public interface IcResiUserDao { @Param("conditions") List conditions, @Param("resultColumns") List resultColumns, @Param("subTables") List subTables); + + List> selectById(String icResiUserId); + + List> selectSubTableRecords(@Param("icResiUserId") String icResiUserId,@Param("tableName") String tableName); + } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java index 340b09f34d..aaba329a6f 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java @@ -25,6 +25,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Set; /** * APP底部菜单栏信息 @@ -61,4 +62,6 @@ public interface CustomerFootBarDao extends BaseDao { List queryConditions(@Param("customerId") String customerId, @Param("formCode")String formCode); List querySubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); + + Set queryIcResiSubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java index d439b7b5bd..21c0163469 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java @@ -8,7 +8,23 @@ import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; import java.util.Map; public interface IcResiUserService { + /** + * 分页查询居民信息列表 + * + * @param pageFormDTO + * @return com.epmet.commons.tools.page.PageData + * @author yinzuomei + * @date 2021/10/28 10:30 上午 + */ PageData pageResi(IcResiUserPageFormDTO pageFormDTO); + /** + * 编辑页面,显示居民信息详情 + * + * @param pageFormDTO + * @return java.util.Map + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java index ddc2dda57e..0c8b9f7cce 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java @@ -18,9 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @Description TODO @@ -38,6 +36,14 @@ public class IcResiUserServiceImpl implements IcResiUserService { + /** + * 分页查询居民信息列表 + * + * @param formDTO + * @return com.epmet.commons.tools.page.PageData + * @author yinzuomei + * @date 2021/10/28 10:30 上午 + */ @Override public PageData pageResi(IcResiUserPageFormDTO formDTO) { // 查询列表展示项,如果没有,直接返回 @@ -74,10 +80,34 @@ public class IcResiUserServiceImpl implements IcResiUserService { return new PageData<>(pageInfo.getList(),pageInfo.getTotal()); } + + + + /** + * 编辑页面,显示居民信息详情 + * + * @param pageFormDTO + * @return java.util.Map + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ @Override public Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO) { + Map resultMap=new HashMap(); + List> icResiUserMapList=icResiUserDao.selectById(pageFormDTO.getIcResiUserId()); + if(CollectionUtils.isEmpty(icResiUserMapList)){ + return new HashMap(); + } + resultMap.put("ic_resi_user",icResiUserMapList); + + //循环查询每个子表的记录 + Set subTableList=customerFootBarService.queryIcResiSubTables(pageFormDTO.getCustomerId(),pageFormDTO.getFormCode()); + for(String subTalbeName:subTableList){ + List> list=icResiUserDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(),subTalbeName); - return null; + resultMap.put(subTalbeName,list); + } + return resultMap; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java index 269dcb4be3..a79000d974 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java @@ -24,6 +24,7 @@ import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.entity.opercustomize.CustomerFootBarEntity; import java.util.List; +import java.util.Set; /** * APP底部菜单栏信息 @@ -46,4 +47,6 @@ public interface CustomerFootBarService extends BaseService queryConditions(String customerId, String formCode); List querySubTables(String customerId, String formCode); + + Set queryIcResiSubTables(String customerId, String formCode); } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java index 53a717d53e..0aefa94d84 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Set; /** @@ -123,4 +124,9 @@ public class CustomerFootBarServiceImpl extends BaseServiceImpl queryIcResiSubTables(String customerId, String formCode) { + return baseDao.queryIcResiSubTables(customerId,formCode); + } + } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml index 6ae2537dd4..fc07f2d304 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml @@ -62,4 +62,13 @@ order by ic_resi_user.CREATED_TIME desc + + + + + \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml index 1a01106cec..4d83d75057 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml @@ -78,4 +78,17 @@ AND m.FORM_CODE = #{formCode} )temp + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java index 9a65bb0b16..552ddbe880 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java @@ -115,5 +115,10 @@ public class FormItem implements Serializable { * 当前组件,要追加分组 */ private FormGroupDTO childGroup; + + /** + * 1可以多选,0单选,默认0 + */ + private Boolean multiSelect; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java index 41f46c55d0..99114fe830 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java @@ -108,5 +108,10 @@ public class FormItem2 implements Serializable { private Integer columnNum; private List options; + + /** + * 1可以多选,0单选,默认0 + */ + private Boolean multiSelect; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 80cdaee859..67f137634a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -36,6 +36,7 @@ + @@ -100,7 +101,8 @@ fi.LIST_DISPLAY, fi.DATA_ANALYSE, fi.COLUMN_NAME, - fi.COLUMN_NUM + fi.COLUMN_NUM, + fi.MULTI_SELECT FROM ic_form_item fi WHERE @@ -146,6 +148,7 @@ + @@ -172,12 +175,14 @@ fi.LIST_DISPLAY, fi.DATA_ANALYSE, fi.COLUMN_NAME, - fi.COLUMN_NUM + fi.COLUMN_NUM, + fi.MULTI_SELECT FROM ic_form_item fi WHERE fi.DEL_FLAG = '0' AND fi.ITEM_GROUP_ID = #{groupId} + AND fi.DYNAMIC = '1' ORDER BY fi.SORT ASC From 37082ee79043cdd2453b81f1898d1fc694a18e3a Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 10:55:18 +0800 Subject: [PATCH 044/253] zancun --- .../com/epmet/dataaggre/controller/IcResiUserController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java index ceeecfacb3..d5f0e0facb 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java @@ -55,7 +55,9 @@ public class IcResiUserController { * @date 2021/10/28 10:29 上午 */ @PostMapping("detail") - public Result queryIcResiDetail(@RequestBody IcResiDetailFormDTO pageFormDTO){ + public Result queryIcResiDetail(@LoginUser TokenDto tokenDto,@RequestBody IcResiDetailFormDTO pageFormDTO){ + //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + pageFormDTO.setCustomerId(tokenDto.getCustomerId()); ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); } From eaa6363be218796a850ae294f356361c6ba4db7d Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 28 Oct 2021 12:18:06 +0800 Subject: [PATCH 045/253] =?UTF-8?q?easypoi=E5=8D=87=E7=BA=A7=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC4.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-commons/epmet-commons-extapp-auth/pom.xml | 2 +- epmet-commons/epmet-commons-tools/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-commons/epmet-commons-extapp-auth/pom.xml b/epmet-commons/epmet-commons-extapp-auth/pom.xml index b563afcb7d..d6683ae51d 100644 --- a/epmet-commons/epmet-commons-extapp-auth/pom.xml +++ b/epmet-commons/epmet-commons-extapp-auth/pom.xml @@ -18,7 +18,7 @@ 1.3.3 2.6 4.6.1 - 4.1.0 + 4.4.0 2.9.9 1.2.60 2.8.6 diff --git a/epmet-commons/epmet-commons-tools/pom.xml b/epmet-commons/epmet-commons-tools/pom.xml index 5929139632..e73e2b5e6f 100644 --- a/epmet-commons/epmet-commons-tools/pom.xml +++ b/epmet-commons/epmet-commons-tools/pom.xml @@ -18,7 +18,7 @@ 1.3.3 2.6 4.6.1 - 4.1.3 + 4.4.0 2.9.9 1.2.60 2.8.6 From 508325a863b4ed0de300609009f77554e463da22 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 14:41:02 +0800 Subject: [PATCH 046/253] gaobule --- .../dto/govorg/result/HouseInfoDTO.java | 61 +++++++++++++++++++ .../dao/epmetuser/IcResiUserDao.java | 17 ++++++ .../dao/govorg/CustomerAgencyDao.java | 3 + .../epmetuser/impl/IcResiUserServiceImpl.java | 51 +++++++++++++--- .../service/govorg/GovOrgService.java | 3 + .../govorg/impl/GovOrgServiceImpl.java | 8 +++ .../mapper/epmetuser/IcResiUserDao.xml | 16 +++-- .../mapper/govorg/CustomerAgencyDao.xml | 21 +++++++ 8 files changed, 167 insertions(+), 13 deletions(-) create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java new file mode 100644 index 0000000000..4855629190 --- /dev/null +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java @@ -0,0 +1,61 @@ +package com.epmet.dataaggre.dto.govorg.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/28 2:05 下午 + */ +@Data +public class HouseInfoDTO implements Serializable { + private static final long serialVersionUID = -5204197079709062825L; + /** + * 所属家庭Id + */ + private String homeId; + + + /** + * 小区id + */ + private String neighborHoodId; + /** + * 小区名称 + */ + private String neighborHoodName; + + + /** + * 所属楼栋id + */ + private String buildingId; + /** + * 楼栋名称 + */ + private String buildingName; + + + /** + * 所属单元id + */ + private String buildingUnitId; + /** + * 单元名 + */ + private String unitName; + + + /** + * 门牌号 + */ + private String doorName; + + /** + * 房屋类型,这里存储字典value就可以 + */ + private String houseType; +} + diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java index b4871aadbc..bd70e305be 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java @@ -17,8 +17,25 @@ public interface IcResiUserDao { @Param("resultColumns") List resultColumns, @Param("subTables") List subTables); + /** + * 查询主表 + * + * @param icResiUserId + * @return java.util.List> + * @author yinzuomei + * @date 2021/10/28 11:20 上午 + */ List> selectById(String icResiUserId); + /** + * 根据ic_resi_user.id去查询各个子表记录,动态传入表名 + * + * @param icResiUserId + * @param tableName + * @return java.util.List> + * @author yinzuomei + * @date 2021/10/28 11:19 上午 + */ List> selectSubTableRecords(@Param("icResiUserId") String icResiUserId,@Param("tableName") String tableName); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java index bd29030255..33f676721b 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java @@ -24,6 +24,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Set; /** * 机关单位信息表 @@ -98,4 +99,6 @@ public interface CustomerAgencyDao extends BaseDao { * @Date 2021/9/23 10:16 */ List getOrgList(@Param("staffId") String staffId); + + List queryHouseInfo(@Param("houseIdList") Set houseIdList); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java index 0c8b9f7cce..93b728957c 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java @@ -1,5 +1,6 @@ package com.epmet.dataaggre.service.epmetuser.impl; +import com.alibaba.fastjson.JSON; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.page.PageData; @@ -9,7 +10,10 @@ import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; +import com.epmet.dataaggre.dto.govorg.result.GridsInfoListResultDTO; +import com.epmet.dataaggre.dto.govorg.result.HouseInfoDTO; import com.epmet.dataaggre.service.epmetuser.IcResiUserService; +import com.epmet.dataaggre.service.govorg.GovOrgService; import com.epmet.dataaggre.service.opercustomize.CustomerFootBarService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -19,6 +23,8 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @Description TODO @@ -33,7 +39,8 @@ public class IcResiUserServiceImpl implements IcResiUserService { private IcResiUserDao icResiUserDao; @Autowired private CustomerFootBarService customerFootBarService; - + @Autowired + private GovOrgService govOrgService; /** @@ -52,10 +59,11 @@ public class IcResiUserServiceImpl implements IcResiUserService { log.warn("没有配置列表展示列"); return new PageData(new ArrayList(), NumConstant.ZERO); } - + log.warn("列表展示项:"+JSON.toJSONString(resultColumns)); // 查询列表展示项需要用到哪些子表 + // 拼接好的left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') List subTables=customerFootBarService.querySubTables(formDTO.getCustomerId(),formDTO.getFormCode()); - + log.warn("子表:"+JSON.toJSONString(subTables)); /* Set subTableList=resultColumns.stream().filter(item->!item.getTableName().equals("ic_resi_user") && StringUtils.isNotBlank(item.getLink())) .map(IcFormResColumnDTO :: getTableName).collect(Collectors.toSet()); @@ -72,10 +80,30 @@ public class IcResiUserServiceImpl implements IcResiUserService { resultColumns, subTables)); List list = pageInfo.getList(); - //todo 还早着呢 - - - + //查询网格名称 + List gridIds=list.stream().map(IcResiUserPageResultDTO::getGridId).collect(Collectors.toList()); + log.warn("gridIds:"+JSON.toJSONString(gridIds)); + + List gridInfoList=govOrgService.gridListByIds(gridIds); + log.warn(JSON.toJSONString(gridInfoList)); + + Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(GridsInfoListResultDTO::getGridId, Function.identity())); + + //查询房子名称 + Set houseIds=list.stream().map(IcResiUserPageResultDTO::getHomeId).collect(Collectors.toSet()); + List houseInfoDTOList=govOrgService.queryHouseInfo(houseIds); + Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); + for(IcResiUserPageResultDTO resultDTO:list){ + if(null !=gridInfoMap&&gridInfoMap.containsKey(resultDTO.getGridId())){ + resultDTO.setGridName(gridInfoMap.get(resultDTO.getGridId()).getGridName()); + } + if(null !=houseInfoMap &&houseInfoMap.containsKey(resultDTO.getHomeId())){ + resultDTO.setBuildName(houseInfoMap.get(resultDTO.getHomeId()).getBuildingName()); + resultDTO.setVallageName(houseInfoMap.get(resultDTO.getHomeId()).getNeighborHoodName()); + resultDTO.setUnitName(houseInfoMap.get(resultDTO.getHomeId()).getUnitName()); + resultDTO.setHomeName(houseInfoMap.get(resultDTO.getHomeId()).getDoorName()); + } + } pageInfo.setList(list); return new PageData<>(pageInfo.getList(),pageInfo.getTotal()); } @@ -94,6 +122,7 @@ public class IcResiUserServiceImpl implements IcResiUserService { @Override public Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO) { Map resultMap=new HashMap(); + // 先查询主表,主表没有记录,直接返回空 List> icResiUserMapList=icResiUserDao.selectById(pageFormDTO.getIcResiUserId()); if(CollectionUtils.isEmpty(icResiUserMapList)){ return new HashMap(); @@ -104,8 +133,12 @@ public class IcResiUserServiceImpl implements IcResiUserService { Set subTableList=customerFootBarService.queryIcResiSubTables(pageFormDTO.getCustomerId(),pageFormDTO.getFormCode()); for(String subTalbeName:subTableList){ List> list=icResiUserDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(),subTalbeName); - - resultMap.put(subTalbeName,list); + if(!CollectionUtils.isEmpty(list)){ + resultMap.put(subTalbeName,list); + } + //else{ + // resultMap.put(subTalbeName,new ArrayList<>()); + //} } return resultMap; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java index 41b97b57ac..f475d7d38f 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java @@ -12,6 +12,7 @@ import com.epmet.dataaggre.dto.govorg.result.*; import com.epmet.dataaggre.dto.resigroup.result.OrgInfoCommonDTO; import java.util.List; +import java.util.Set; /** * @Author zxc @@ -154,4 +155,6 @@ public interface GovOrgService { * @Date 2021/9/23 10:14 */ List getStaffOrgList(String staffId); + + List queryHouseInfo(Set houseIdList); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java index d4e265cdec..bfa7f9f9d1 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java @@ -532,4 +532,12 @@ public class GovOrgServiceImpl implements GovOrgService { return customerAgencyDao.getOrgList(staffId); } + @Override + public List queryHouseInfo(Set houseIdList) { + if(CollectionUtils.isEmpty(houseIdList)){ + return new ArrayList<>(); + } + return customerAgencyDao.queryHouseInfo(houseIdList); + } + } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml index fc07f2d304..f951feaacc 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml @@ -31,14 +31,21 @@ ${column.columnName} + , + GROUP_CONCAT(ic_resi_demand.CATEGORY_CODE), + GROUP_CONCAT(ic_resi_demand_dict.CATEGORY_NAME) FROM - ic_resi_user + ic_resi_user ${subTableName} + left join ic_resi_demand_dict + on(ic_resi_user.customer_id=ic_resi_demand_dict.CUSTOMER_ID + and ic_resi_demand.CATEGORY_CODE=ic_resi_demand_dict.CATEGORY_CODE ) + WHERE ic_resi_user.DEL_FLAG = '0' and ic_resi_user.customer_id=#{customerId} @@ -47,19 +54,20 @@ - and ${subCondition.columnName} = #{subCondition.columnValue[0]} + and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} - and ${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') - and ${subCondition.columnName} between #{subCondition.columnValue[0]} and #{subCondition.columnValue[1]} + and ${subCondition.tableName}.${subCondition.columnName} between #{subCondition.columnValue[0]} and #{subCondition.columnValue[1]} + group by IC_RESI_USER.id order by ic_resi_user.CREATED_TIME desc diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml index 7a0760d0a3..63766e9120 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml @@ -286,4 +286,25 @@ AND USER_ID = #{staffId} + From 25c69bf7f6ca1084cf3eedbc7b0bda7691ede090 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 28 Oct 2021 14:44:01 +0800 Subject: [PATCH 047/253] =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 3c49519af1..9ca0788099 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -129,8 +129,11 @@ public class IcResiUserServiceImpl extends BaseServiceImpl result = govOrgOpenFeignClient.getAgencyById(agencyId); if (result.success() && null != result.getData()) { map.put("pids", result.getData().getPids()); From 5254a4acb939525e4b35f6effa396b7dacc556c0 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 14:45:52 +0800 Subject: [PATCH 048/253] =?UTF-8?q?houseType:=E6=88=BF=E5=B1=8B=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C1=E6=A5=BC=E6=88=BF=EF=BC=8C2=E5=B9=B3?= =?UTF-8?q?=E6=88=BF=EF=BC=8C3=E5=88=AB=E5=A2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java | 2 +- .../dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java index 4855629190..fc98843047 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java @@ -54,7 +54,7 @@ public class HouseInfoDTO implements Serializable { private String doorName; /** - * 房屋类型,这里存储字典value就可以 + * 房屋类型,1楼房,2平房,3别墅 */ private String houseType; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java index 93b728957c..993598f4ef 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java @@ -102,6 +102,7 @@ public class IcResiUserServiceImpl implements IcResiUserService { resultDTO.setVallageName(houseInfoMap.get(resultDTO.getHomeId()).getNeighborHoodName()); resultDTO.setUnitName(houseInfoMap.get(resultDTO.getHomeId()).getUnitName()); resultDTO.setHomeName(houseInfoMap.get(resultDTO.getHomeId()).getDoorName()); + resultDTO.setHouseType(houseInfoMap.get(resultDTO.getHomeId()).getHouseType()); } } pageInfo.setList(list); From 552d384c2d31729ba807a847d6b57c3e21253126 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 14:48:03 +0800 Subject: [PATCH 049/253] =?UTF-8?q?=E9=9C=80=E6=B1=82=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/epmetuser/result/IcResiUserPageResultDTO.java | 5 +++-- .../src/main/resources/mapper/epmetuser/IcResiUserDao.xml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java index 3c8774abf9..e737bcec54 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java @@ -3,7 +3,6 @@ package com.epmet.dataaggre.dto.epmetuser.result; import lombok.Data; import java.io.Serializable; -import java.util.List; /** * @Description 居民信息分页查询表单返参 @@ -160,7 +159,9 @@ public class IcResiUserPageResultDTO implements Serializable { */ private Boolean isSpecial; - private List demandCategoryIds; + + // 以下属性都需要单独处理,不是直接取数据库的字段 + private String demandCategoryIds; private String demandName; diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml index f951feaacc..0069d6864f 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml @@ -32,8 +32,8 @@ ${column.columnName} , - GROUP_CONCAT(ic_resi_demand.CATEGORY_CODE), - GROUP_CONCAT(ic_resi_demand_dict.CATEGORY_NAME) + GROUP_CONCAT(ic_resi_demand.CATEGORY_CODE) as demandCategoryIds, + GROUP_CONCAT(ic_resi_demand_dict.CATEGORY_NAME) as demandName FROM ic_resi_user From 7cd30f318cedf941061e47bc2d1363cdac82c901 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 15:37:02 +0800 Subject: [PATCH 050/253] =?UTF-8?q?childGroup=E5=A4=96=E5=B1=82=E7=9A=84ta?= =?UTF-8?q?ble=5Fname=E4=B8=8E=E7=BB=84=E4=BB=B6=E9=87=8C=E7=9A=84table=5F?= =?UTF-8?q?name=E8=A6=81=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcFormDao.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 67f137634a..7215f7e5ce 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -159,7 +159,7 @@ select * from ${tableName} where del_flag='0' and IC_RESI_USER=#{icResiUserId} + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java new file mode 100644 index 0000000000..08c9bd6fad --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java @@ -0,0 +1,25 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/28 4:10 下午 + */ +@Data +public class TableHeaderResultDTO implements Serializable { + private static final long serialVersionUID = 8318224643897723433L; + private String label; + private String columnName; + private String itemType; + + public TableHeaderResultDTO(String label,String columnName,String itemType){ + this.label=label; + this.columnName=columnName; + this.itemType=itemType; + } +} + diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 9927a84eb1..d3fdcc532c 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -31,6 +31,7 @@ import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.ConditionResultDTO; import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.excel.IcFormExcel; import com.epmet.service.IcFormItemService; import com.epmet.service.IcFormService; @@ -134,4 +135,11 @@ public class IcFormController { ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result>().ok(icFormItemService.queryConditionList(formDto)); } + + @PostMapping("tableheaders") + public Result> queryTableHeaderList(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto){ + formDto.setCustomerId(tokenDto.getCustomerId()); + ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); + return new Result>().ok(icFormItemService.queryTableHeaderList(formDto)); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java index ce99cb4927..befdc98c06 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java @@ -19,6 +19,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.result.ConditionResultDTO; +import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.entity.IcFormItemEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -35,4 +36,6 @@ import java.util.List; public interface IcFormItemDao extends BaseDao { List selectConditionList(@Param("customerId") String customerId, @Param("formCode") String formCode); + + List queryTableHeaderList(@Param("customerId") String customerId, @Param("formCode") String formCode); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java index 5fd14e3ef5..9a5ce5c9a6 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java @@ -22,6 +22,7 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormItemDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.ConditionResultDTO; +import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.entity.IcFormItemEntity; import java.util.List; @@ -104,4 +105,6 @@ public interface IcFormItemService extends BaseService { * @date 2021/10/27 9:19 上午 */ List queryConditionList(CustomerFormQueryDTO formDto); + + List queryTableHeaderList(CustomerFormQueryDTO formDto); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java index 40bec48d08..b6f8ead33f 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java @@ -27,12 +27,14 @@ import com.epmet.dao.IcFormItemDao; import com.epmet.dto.IcFormItemDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.ConditionResultDTO; +import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.entity.IcFormItemEntity; import com.epmet.service.IcFormItemService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -113,4 +115,18 @@ public class IcFormItemServiceImpl extends BaseServiceImpl queryTableHeaderList(CustomerFormQueryDTO formDto) { + List list=new ArrayList<>(); + list.add(new TableHeaderResultDTO("所在网格","GRID_NAME","input")); + //list.add(new TableHeaderResultDTO("小区","VILLAGE_NAME","input")); + //list.add(new TableHeaderResultDTO("楼栋","BUILD_NAME","input")); + //list.add(new TableHeaderResultDTO("单元","UNIT_NAME","input")); + list.add(new TableHeaderResultDTO("所在家庭","HOME_NAME","input")); + list.addAll(baseDao.queryTableHeaderList(formDto.getCustomerId(),formDto.getFormCode())); + list.add(new TableHeaderResultDTO("需求分类","DEMAND_NAME","input")); + list.add(new TableHeaderResultDTO("房屋类型","HOUSE_TYPE","input")); + return list; + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index 5a929a1b3d..15c004f89a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -52,4 +52,19 @@ AND b.FORM_CODE = #{formCode} ORDER BY b.SORT asc + + \ No newline at end of file From c903d48d9734963b628dfc690f4dfe4fc8e46cb4 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 28 Oct 2021 17:01:57 +0800 Subject: [PATCH 052/253] =?UTF-8?q?=E8=A1=A8=E5=A4=B4=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcFormItemDao.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index 15c004f89a..35bcf987dc 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -29,7 +29,13 @@ + select + a.ID as buildingId, + a.BUILDING_NAME as buildingName, + a.TOTAL_HOUSE_NUM as totalHouseNum, + a.TOTAL_FLOOR_NUM as totalFloorNum, + a.TOTAL_UNIT_NUM as totalUnitNum, + a.BUILDING_NAME as buildingType, + b.NEIGHBOR_HOOD_NAME as neighbourHoodName + from ic_building a + + LEFT JOIN ic_neighbor_hood b on a.NEIGHBOR_HOOD_ID = b.ID + + + + AND a.NEIGHBOR_HOOD_ID = #{building.id} + + + AND a.BUILDING_NAME like concat('%',trim(#{building.buildingName}),'%') + + + AND a.DEL_FLAG = #{building.delFlag} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index 25df6ce4a6..e62cb42010 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -26,5 +26,201 @@ + + + + + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index 8a057c3a9f..b1d6f0c7e3 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -25,7 +25,7 @@ - + select + a.id as neighborHoodId, + a.NEIGHBOR_HOOD_NAME as neighborHoodName, + a.ADDRESS as address, + a.REMARK as remark, + + b.ORGANIZATION_NAME as orgName, + c.GRID_NAME as gridName + from ic_neighbor_hood a + + left join customer_agency b on a.AGENCY_ID = b.ID + + left join customer_grid c on a.GRID_ID = c.ID + + + AND a.GRID_ID = #{neighbor.id} + + + AND a.DEL_FLAG = #{neighbor.delFlag} + + + + + + + \ No newline at end of file From 1702350ece0625f0b5b5841a9742fab65b172b80 Mon Sep 17 00:00:00 2001 From: lzh Date: Fri, 29 Oct 2021 09:14:18 +0800 Subject: [PATCH 056/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=EF=BC=8C=E6=A5=BC?= =?UTF-8?q?=E5=AE=87=EF=BC=8C=E6=88=BF=E5=B1=8B=E7=AE=A1=E7=90=86=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=EF=BC=8C=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=EF=BC=8C=E5=AF=BC=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gov-org/gov-org-server/src/main/resources/bootstrap.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/bootstrap.yml b/epmet-module/gov-org/gov-org-server/src/main/resources/bootstrap.yml index dc2f9674ba..ddd78b7407 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/bootstrap.yml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/bootstrap.yml @@ -108,7 +108,6 @@ mybatis-plus: cache-enabled: false call-setters-on-nulls: true jdbc-type-for-null: 'null' - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl feign: From c02d22664a523a14a187b2897a41bb9d5ea8ca42 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 29 Oct 2021 10:10:55 +0800 Subject: [PATCH 057/253] =?UTF-8?q?listresi=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmetuser/impl/IcResiUserServiceImpl.java | 99 ++++++++++--------- 1 file changed, 51 insertions(+), 48 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java index 6fa0ed8051..7c3e062649 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java @@ -3,6 +3,7 @@ package com.epmet.dataaggre.service.epmetuser.impl; import com.alibaba.fastjson.JSON; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.page.PageData; import com.epmet.dataaggre.constant.DataSourceConstant; import com.epmet.dataaggre.dao.epmetuser.IcResiUserDao; @@ -111,19 +112,19 @@ public class IcResiUserServiceImpl implements IcResiUserService { } - public PageData> pageResiMap(IcResiUserPageFormDTO formDTO) { + public PageData> pageResiMap(IcResiUserPageFormDTO formDTO) { // 查询列表展示项,如果没有,直接返回 - List resultColumns=customerFootBarService.queryConditions(formDTO.getCustomerId(),formDTO.getFormCode()); - if(CollectionUtils.isEmpty(resultColumns)){ + List resultColumns = customerFootBarService.queryConditions(formDTO.getCustomerId(), formDTO.getFormCode()); + if (CollectionUtils.isEmpty(resultColumns)) { log.warn("没有配置列表展示列"); return new PageData(new ArrayList(), NumConstant.ZERO); } - log.warn("列表展示项:"+JSON.toJSONString(resultColumns)); + //log.warn("列表展示项:" + JSON.toJSONString(resultColumns)); // 查询列表展示项需要用到哪些子表 // 拼接好的left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') - List subTables=customerFootBarService.querySubTables(formDTO.getCustomerId(),formDTO.getFormCode()); - log.info("子表:"+JSON.toJSONString(subTables)); - PageInfo> pageInfo = PageHelper.startPage(formDTO.getPageNo(), + List subTables = customerFootBarService.querySubTables(formDTO.getCustomerId(), formDTO.getFormCode()); + //log.info("子表:" + JSON.toJSONString(subTables)); + PageInfo> pageInfo = PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResiMap(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getConditions(), @@ -132,75 +133,77 @@ public class IcResiUserServiceImpl implements IcResiUserService { List> list = pageInfo.getList(); //查询网格名称 - List gridIds=new ArrayList<>(); - Set houseIds=new HashSet<>(); - for(Map map:list){ + List gridIds = new ArrayList<>(); + Set houseIds = new HashSet<>(); + for (Map map : list) { log.warn(JSON.toJSONString(map)); - if(map.containsKey("GRID_ID")&& StringUtils.isNotBlank(map.get("GRID_ID").toString())){ + if (map.containsKey("GRID_ID") && null != map.get("GRID_ID") && StringUtils.isNotBlank(map.get("GRID_ID").toString())) { gridIds.add(map.get("GRID_ID").toString()); } - if(map.containsKey("HOME_ID")&& StringUtils.isNotBlank(map.get("HOME_ID").toString())){ + if (map.containsKey("HOME_ID") && null != map.get("HOME_ID") && StringUtils.isNotBlank(map.get("HOME_ID").toString())) { houseIds.add(map.get("HOME_ID").toString()); } } - log.warn("gridIds:"+JSON.toJSONString(gridIds)); + //log.warn("gridIds:" + JSON.toJSONString(gridIds)); - List gridInfoList=govOrgService.gridListByIds(gridIds); + List gridInfoList = govOrgService.gridListByIds(gridIds); //log.warn(JSON.toJSONString(gridInfoList)); Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(GridsInfoListResultDTO::getGridId, Function.identity())); //查询房子名称 - List houseInfoDTOList=govOrgService.queryHouseInfo(houseIds); + List houseInfoDTOList = govOrgService.queryHouseInfo(houseIds); Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); - for(Map resultMap:list){ - if (null != gridInfoMap && gridInfoMap.containsKey(resultMap.get("GRID_ID").toString())) { - resultMap.put("GRID_ID_VALUE",resultMap.get("GRID_ID").toString()); + for (Map resultMap : list) { + String gridIdValue = null != resultMap.get("GRID_ID") ? resultMap.get("GRID_ID").toString() : StrConstant.EPMETY_STR; + resultMap.put("GRID_ID_VALUE", gridIdValue); + if (null != gridInfoMap && gridInfoMap.containsKey(gridIdValue) && null != gridInfoMap.get(gridIdValue)) { //GRID_NAME - resultMap.put("GRID_ID",gridInfoMap.get(resultMap.get("GRID_ID")).getGridName()); + resultMap.put("GRID_ID", gridInfoMap.get(gridIdValue).getGridName()); } - if(null !=houseInfoMap &&houseInfoMap.containsKey(resultMap.get("HOME_ID"))){ - String homeId=resultMap.get("HOME_ID").toString(); - resultMap.put("HOME_ID_VALUE",homeId); - String buildName=houseInfoMap.get(resultMap.get("HOME_ID")).getBuildingName(); - resultMap.put("BUILD_NAME",buildName); + String homeId = null != resultMap.get("HOME_ID") ? resultMap.get("HOME_ID").toString() : StrConstant.EPMETY_STR; + resultMap.put("HOME_ID_VALUE", homeId); + if (null != houseInfoMap && houseInfoMap.containsKey(homeId) && null != houseInfoMap.get(homeId)) { + HouseInfoDTO houseInfoDTO = houseInfoMap.get(homeId); + String buildName = StringUtils.isNotBlank(houseInfoDTO.getBuildingName()) ? houseInfoDTO.getBuildingName() : StrConstant.EPMETY_STR; + resultMap.put("BUILD_NAME", buildName); - String neighBorName=houseInfoMap.get(resultMap.get("HOME_ID")).getNeighborHoodName(); - resultMap.put("VILLAGE_NAME",neighBorName); + String neighBorName = StringUtils.isNotBlank(houseInfoDTO.getNeighborHoodName()) ? houseInfoDTO.getNeighborHoodName() : StrConstant.EPMETY_STR; + resultMap.put("VILLAGE_NAME", neighBorName); - String unitName=houseInfoMap.get(resultMap.get("HOME_ID")).getUnitName(); - resultMap.put("UNIT_NAME",unitName); + String unitName = StringUtils.isNotBlank(houseInfoDTO.getUnitName()) ? houseInfoDTO.getUnitName() : StrConstant.EPMETY_STR; + resultMap.put("UNIT_NAME", unitName); - String doorName=houseInfoMap.get(resultMap.get("HOME_ID")).getDoorName(); - resultMap.put("DOOR_NAME",doorName); + String doorName = StringUtils.isNotBlank(houseInfoDTO.getDoorName()) ? houseInfoDTO.getDoorName() : StrConstant.EPMETY_STR; + resultMap.put("DOOR_NAME", doorName); - String houseType=houseInfoMap.get(resultMap.get("HOME_ID")).getHouseType(); + String houseType = StringUtils.isNotBlank(houseInfoDTO.getHouseType()) ? houseInfoDTO.getHouseType() : StrConstant.EPMETY_STR; //房屋类型,1楼房,2平房,3别墅 - resultMap.put("HOUSE_TYPE",""); - if("1".equals(houseType)){ - resultMap.put("HOUSE_TYPE","楼房"); - }else if("2".equals(houseType)){ - resultMap.put("HOUSE_TYPE","平房"); - }else if("3".equals(houseType)){ - resultMap.put("HOUSE_TYPE","别墅"); + resultMap.put("HOUSE_TYPE", ""); + if ("1".equals(houseType)) { + resultMap.put("HOUSE_TYPE", "楼房"); + } else if ("2".equals(houseType)) { + resultMap.put("HOUSE_TYPE", "平房"); + } else if ("3".equals(houseType)) { + resultMap.put("HOUSE_TYPE", "别墅"); } - resultMap.put("HOME_ID",neighBorName.concat(buildName).concat(unitName).concat(doorName)); + resultMap.put("HOME_ID", neighBorName.concat(buildName).concat(unitName).concat(doorName)); } - if(resultMap.containsKey("GENDER")){ - String genderValue=resultMap.get("GENDER").toString(); - if("1".equals(genderValue)){ - resultMap.put("GENDER","男"); - }else if("2".equals(genderValue)){ - resultMap.put("HOUSE_TYPE","女"); - }else if("0".equals(genderValue)){ - resultMap.put("HOUSE_TYPE","未知"); + if (resultMap.containsKey("GENDER")) { + String genderValue = null != resultMap.get("GENDER") ? resultMap.get("GENDER").toString() : StrConstant.EPMETY_STR; + if ("1".equals(genderValue)) { + resultMap.put("GENDER", "男"); + } else if ("2".equals(genderValue)) { + resultMap.put("HOUSE_TYPE", "女"); + } else if ("0".equals(genderValue)) { + resultMap.put("HOUSE_TYPE", "未知"); } } } pageInfo.setList(list); - return new PageData<>(pageInfo.getList(),pageInfo.getTotal()); + return new PageData<>(pageInfo.getList(), pageInfo.getTotal()); } /** From ded2a4b07122a2a78f8fd28666b807a67afe9866 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 29 Oct 2021 10:48:39 +0800 Subject: [PATCH 058/253] =?UTF-8?q?=E8=A1=A8=E5=A4=B4=E6=9F=A5=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/result/TableHeaderResultDTO.java | 11 ++++------ .../service/impl/IcFormItemServiceImpl.java | 15 +++++++++++-- .../main/resources/mapper/IcFormItemDao.xml | 22 +++++++++++++++---- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java index 08c9bd6fad..dd39f668e7 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/TableHeaderResultDTO.java @@ -3,23 +3,20 @@ package com.epmet.dto.result; import lombok.Data; import java.io.Serializable; +import java.util.List; /** - * @Description TODO + * @Description 表头返参DTO * @Author yinzuomei * @Date 2021/10/28 4:10 下午 */ @Data public class TableHeaderResultDTO implements Serializable { private static final long serialVersionUID = 8318224643897723433L; + private String itemId; private String label; private String columnName; private String itemType; - - public TableHeaderResultDTO(String label,String columnName,String itemType){ - this.label=label; - this.columnName=columnName; - this.itemType=itemType; - } + private List options; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java index 64bbd8f661..1c62d14ed7 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcFormItemDao; @@ -33,6 +34,7 @@ import com.epmet.service.IcFormItemService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Arrays; @@ -123,9 +125,18 @@ public class IcFormItemServiceImpl extends BaseServiceImpl result=baseDao.queryTableHeaderList(formDto.getCustomerId(),formDto.getFormCode()); + if(!CollectionUtils.isEmpty(result)){ + list.addAll(result); + } //list.add(new TableHeaderResultDTO("需求分类","DEMAND_NAME","input")); - list.add(new TableHeaderResultDTO("房屋类型","HOUSE_TYPE","input")); + TableHeaderResultDTO houseType=new TableHeaderResultDTO(); + houseType.setItemType("input"); + houseType.setItemId(StrConstant.EPMETY_STR); + houseType.setColumnName("HOUSE_TYPE"); + houseType.setLabel("房屋类型"); + houseType.setOptions(new ArrayList<>()); + list.add(houseType); return list; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index 35bcf987dc..e369303a80 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -21,8 +21,8 @@ - - + + @@ -59,11 +59,25 @@ ORDER BY b.SORT asc - SELECT + m.id as item_id, m.LABEL, m.COLUMN_NAME, - m.item_type + m.item_type FROM ic_form_item m WHERE From 8ff43fbe529d5dafa583c6f7d66fc07f488c2231 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 29 Oct 2021 10:53:22 +0800 Subject: [PATCH 059/253] =?UTF-8?q?form=E8=A1=A8=E5=8D=95=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcFormDao.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 7215f7e5ce..6310a06195 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -195,7 +195,11 @@ g.LABEL, g.sort, g.SUPPORT_ADD, - 'ic_resi_user' AS TABLE_NAME + ( + case when g.table_name is null or g.table_name ='' then 'ic_resi_user' + else g.TABLE_NAME + end + ) AS TABLE_NAME FROM ic_form_item_group g WHERE From 75f33e47d8e232bae7b1426519c48a01e206e335 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 29 Oct 2021 14:18:06 +0800 Subject: [PATCH 060/253] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E6=94=BEredis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 10 ++++++++ .../com/epmet/redis/CustomerFootBarRedis.java | 25 +++++++++++++++++++ .../epmet/service/impl/IcFormServiceImpl.java | 13 +++++++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index fe293c5288..9b7a7afccb 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -579,4 +579,14 @@ public class RedisKeys { public static String loginTicket(String app, String ticket) { return rootPrefix.concat("sys:security:ticket:").concat(app).concat(":").concat(ticket); } + + /** + * 政府端机关单位缓存Key + * @param formCode + * @param customerId + * @return + */ + public static String getIcFormKey(String formCode,String customerId) { + return rootPrefix.concat("icform:").concat(formCode).concat(":").concat(customerId); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java index 1d120429d8..8cded15b44 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java @@ -17,9 +17,15 @@ package com.epmet.redis; +import cn.hutool.core.bean.BeanUtil; +import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.dto.result.CustomerFormResultDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Map; /** * APP底部菜单栏信息 @@ -44,4 +50,23 @@ public class CustomerFootBarRedis { return null; } + public void deleteIcForm(String formCode,String customerId) { + String key = RedisKeys.getIcFormKey(formCode,customerId); + redisUtils.delete(key); + } + + public void setCustomerFormResultDTO(String formCode,String customerId, CustomerFormResultDTO value){ + String key = RedisKeys.getIcFormKey(formCode,customerId); + Map map = BeanUtil.beanToMap(value, false, true); + redisUtils.hMSet(key, map); + } + + public CustomerFormResultDTO getCustomerFormResultDTO(String formCode,String customerId){ + String key = RedisKeys.getIcFormKey(formCode,customerId); + Map resultMap = redisUtils.hGetAll(key); + if (CollectionUtils.isEmpty(resultMap)) { + return null; + } + return BeanUtil.mapToBean(resultMap, CustomerFormResultDTO.class, true); + } } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index 6a4d8a426c..f7cf1fe235 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -32,8 +32,10 @@ import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; import com.epmet.dto.result.FormItem; import com.epmet.entity.IcFormEntity; +import com.epmet.redis.CustomerFootBarRedis; import com.epmet.service.IcFormService; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -49,7 +51,8 @@ import java.util.Map; */ @Service public class IcFormServiceImpl extends BaseServiceImpl implements IcFormService { - + @Autowired + private CustomerFootBarRedis customerFootBarRedis; @Override public PageData page(Map params) { @@ -113,17 +116,19 @@ public class IcFormServiceImpl extends BaseServiceImpl */ @Override public CustomerFormResultDTO getCustomerForm(CustomerFormQueryDTO formDto) { - //todo + CustomerFormResultDTO customerFormResultDTO = customerFootBarRedis.getCustomerFormResultDTO(formDto.getFormCode(), formDto.getCustomerId()); + if (null != customerFormResultDTO) { + return customerFormResultDTO; + } CustomerFormResultDTO resultDTO=baseDao.selectByCode(formDto.getCustomerId(),formDto.getFormCode()); if (null == resultDTO) { throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); } List itemList=baseDao.selectItemList(resultDTO.getFormId(),formDto.getDynamic()); List groupList=baseDao.selectListGroup(resultDTO.getFormId()); - resultDTO.setItemList(itemList); resultDTO.setGroupList(groupList); + customerFootBarRedis.setCustomerFormResultDTO(formDto.getFormCode(),formDto.getCustomerId(),resultDTO); return resultDTO; } - } From fcff5bf14cb56d81a098636b13f0cfa1bc46a9bd Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 29 Oct 2021 17:13:59 +0800 Subject: [PATCH 061/253] =?UTF-8?q?GenderEnum=EF=BC=8CHouseTypeEnum,?= =?UTF-8?q?=E5=8F=AF=E4=B8=8D=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/enums/GenderEnum.java | 44 ++++++ .../commons/tools/enums/HouseTypeEnum.java | 45 ++++++ .../epmet/dataaggre/constant/OrgConstant.java | 3 + .../epmetuser/form/IcResiUserPageFormDTO.java | 1 + .../epmetuser/impl/IcResiUserServiceImpl.java | 130 ++++++++++-------- 5 files changed, 164 insertions(+), 59 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/GenderEnum.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/HouseTypeEnum.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/GenderEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/GenderEnum.java new file mode 100644 index 0000000000..5604377ed5 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/GenderEnum.java @@ -0,0 +1,44 @@ +package com.epmet.commons.tools.enums; + +import com.epmet.commons.tools.exception.EpmetErrorCode; + +public enum GenderEnum { + MAN("1", "男"), + WOMAN("2", "女"), + UN_KNOWN("0", "未知"); + + private String code; + private String name; + + + GenderEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public static String getName(String code) { + GenderEnum[] genderEnums = values(); + for (GenderEnum genderEnum : genderEnums) { + if (genderEnum.getCode() == code) { + return genderEnum.getName(); + } + } + return EpmetErrorCode.SERVER_ERROR.getMsg(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/HouseTypeEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/HouseTypeEnum.java new file mode 100644 index 0000000000..c86ff94d4e --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/HouseTypeEnum.java @@ -0,0 +1,45 @@ +package com.epmet.commons.tools.enums; + +import com.epmet.commons.tools.exception.EpmetErrorCode; + +public enum HouseTypeEnum { + //房屋类型,1楼房,2平房,3别墅 + LOUFANG("1", "楼房"), + PINGFANG("2", "平房"), + BIESHU("3", "别墅"); + + private String code; + private String name; + + + HouseTypeEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public static String getName(String code) { + HouseTypeEnum[] houseTypeEnums = values(); + for (HouseTypeEnum houseTypeEnum : houseTypeEnums) { + if (houseTypeEnum.getCode() == code) { + return houseTypeEnum.getName(); + } + } + return EpmetErrorCode.SERVER_ERROR.getMsg(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/OrgConstant.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/OrgConstant.java index b3083d658e..5119475926 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/OrgConstant.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/OrgConstant.java @@ -11,4 +11,7 @@ public interface OrgConstant { String CITY = "city"; String DISTRICT = "district"; + String GRID_ID="GRID_ID"; + String GENDER="GENDER"; + String HOUSE_TYPE_KEY="HOUSE_TYPE"; } diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java index e9ae3c2eea..04dc8f0943 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java @@ -33,5 +33,6 @@ public class IcResiUserPageFormDTO implements Serializable { * 表对应的字段及值 */ private List conditions; + private Boolean pageFlag; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java index 7c3e062649..a3dbfc59b3 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java @@ -4,8 +4,11 @@ import com.alibaba.fastjson.JSON; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.enums.GenderEnum; +import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.page.PageData; import com.epmet.dataaggre.constant.DataSourceConstant; +import com.epmet.dataaggre.constant.OrgConstant; import com.epmet.dataaggre.dao.epmetuser.IcResiUserDao; import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; @@ -49,23 +52,23 @@ public class IcResiUserServiceImpl implements IcResiUserService { * 分页查询居民信息列表 * * @param formDTO - * @return com.epmet.commons.tools.page.PageData + * @return com.epmet.commons.tools.page.PageData * @author yinzuomei * @date 2021/10/28 10:30 上午 */ @Override public PageData pageResi(IcResiUserPageFormDTO formDTO) { // 查询列表展示项,如果没有,直接返回 - List resultColumns=customerFootBarService.queryConditions(formDTO.getCustomerId(),formDTO.getFormCode()); - if(CollectionUtils.isEmpty(resultColumns)){ + List resultColumns = customerFootBarService.queryConditions(formDTO.getCustomerId(), formDTO.getFormCode()); + if (CollectionUtils.isEmpty(resultColumns)) { log.warn("没有配置列表展示列"); return new PageData(new ArrayList(), NumConstant.ZERO); } - log.warn("列表展示项:"+JSON.toJSONString(resultColumns)); + log.warn("列表展示项:" + JSON.toJSONString(resultColumns)); // 查询列表展示项需要用到哪些子表 // 拼接好的left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') - List subTables=customerFootBarService.querySubTables(formDTO.getCustomerId(),formDTO.getFormCode()); - log.warn("子表:"+JSON.toJSONString(subTables)); + List subTables = customerFootBarService.querySubTables(formDTO.getCustomerId(), formDTO.getFormCode()); + log.warn("子表:" + JSON.toJSONString(subTables)); /* Set subTableList=resultColumns.stream().filter(item->!item.getTableName().equals("ic_resi_user") && StringUtils.isNotBlank(item.getLink())) .map(IcFormResColumnDTO :: getTableName).collect(Collectors.toSet()); @@ -76,30 +79,30 @@ public class IcResiUserServiceImpl implements IcResiUserService { subTables.add(joinSql); });*/ PageInfo pageInfo = PageHelper.startPage(formDTO.getPageNo(), - formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResi(formDTO.getCustomerId(), - formDTO.getFormCode(), - formDTO.getConditions(), - resultColumns, - subTables)); + formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResi(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + resultColumns, + subTables)); List list = pageInfo.getList(); //查询网格名称 - List gridIds=list.stream().map(IcResiUserPageResultDTO::getGridId).collect(Collectors.toList()); - log.warn("gridIds:"+JSON.toJSONString(gridIds)); + List gridIds = list.stream().map(IcResiUserPageResultDTO::getGridId).collect(Collectors.toList()); + log.warn("gridIds:" + JSON.toJSONString(gridIds)); - List gridInfoList=govOrgService.gridListByIds(gridIds); + List gridInfoList = govOrgService.gridListByIds(gridIds); log.warn(JSON.toJSONString(gridInfoList)); Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(GridsInfoListResultDTO::getGridId, Function.identity())); //查询房子名称 - Set houseIds=list.stream().map(IcResiUserPageResultDTO::getHomeId).collect(Collectors.toSet()); - List houseInfoDTOList=govOrgService.queryHouseInfo(houseIds); + Set houseIds = list.stream().map(IcResiUserPageResultDTO::getHomeId).collect(Collectors.toSet()); + List houseInfoDTOList = govOrgService.queryHouseInfo(houseIds); Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); - for(IcResiUserPageResultDTO resultDTO:list){ - if(null !=gridInfoMap&&gridInfoMap.containsKey(resultDTO.getGridId())){ + for (IcResiUserPageResultDTO resultDTO : list) { + if (null != gridInfoMap && gridInfoMap.containsKey(resultDTO.getGridId())) { resultDTO.setGridName(gridInfoMap.get(resultDTO.getGridId()).getGridName()); } - if(null !=houseInfoMap &&houseInfoMap.containsKey(resultDTO.getHomeId())){ + if (null != houseInfoMap && houseInfoMap.containsKey(resultDTO.getHomeId())) { resultDTO.setBuildName(houseInfoMap.get(resultDTO.getHomeId()).getBuildingName()); resultDTO.setVallageName(houseInfoMap.get(resultDTO.getHomeId()).getNeighborHoodName()); resultDTO.setUnitName(houseInfoMap.get(resultDTO.getHomeId()).getUnitName()); @@ -108,7 +111,7 @@ public class IcResiUserServiceImpl implements IcResiUserService { } } pageInfo.setList(list); - return new PageData<>(pageInfo.getList(),pageInfo.getTotal()); + return new PageData<>(pageInfo.getList(), pageInfo.getTotal()); } @@ -119,17 +122,27 @@ public class IcResiUserServiceImpl implements IcResiUserService { log.warn("没有配置列表展示列"); return new PageData(new ArrayList(), NumConstant.ZERO); } - //log.warn("列表展示项:" + JSON.toJSONString(resultColumns)); // 查询列表展示项需要用到哪些子表 // 拼接好的left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') List subTables = customerFootBarService.querySubTables(formDTO.getCustomerId(), formDTO.getFormCode()); - //log.info("子表:" + JSON.toJSONString(subTables)); - PageInfo> pageInfo = PageHelper.startPage(formDTO.getPageNo(), - formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResiMap(formDTO.getCustomerId(), - formDTO.getFormCode(), - formDTO.getConditions(), - resultColumns, - subTables)); + PageInfo> pageInfo=new PageInfo<>(); + if (null == formDTO.getPageFlag()||formDTO.getPageFlag()) { + //分页 + pageInfo= PageHelper.startPage(formDTO.getPageNo(), + formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResiMap(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + resultColumns, + subTables)); + }else{ + List> list=icResiUserDao.selectListResiMap(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + resultColumns, + subTables); + pageInfo.setTotal(CollectionUtils.isEmpty(list)?NumConstant.ZERO:list.size()); + pageInfo.setList(list); + } List> list = pageInfo.getList(); //查询网格名称 @@ -137,17 +150,15 @@ public class IcResiUserServiceImpl implements IcResiUserService { Set houseIds = new HashSet<>(); for (Map map : list) { log.warn(JSON.toJSONString(map)); - if (map.containsKey("GRID_ID") && null != map.get("GRID_ID") && StringUtils.isNotBlank(map.get("GRID_ID").toString())) { - gridIds.add(map.get("GRID_ID").toString()); + if (map.containsKey(OrgConstant.GRID_ID) && null != map.get(OrgConstant.GRID_ID) && StringUtils.isNotBlank(map.get(OrgConstant.GRID_ID).toString())) { + gridIds.add(map.get(OrgConstant.GRID_ID).toString()); } if (map.containsKey("HOME_ID") && null != map.get("HOME_ID") && StringUtils.isNotBlank(map.get("HOME_ID").toString())) { houseIds.add(map.get("HOME_ID").toString()); } } - //log.warn("gridIds:" + JSON.toJSONString(gridIds)); List gridInfoList = govOrgService.gridListByIds(gridIds); - //log.warn(JSON.toJSONString(gridInfoList)); Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(GridsInfoListResultDTO::getGridId, Function.identity())); @@ -155,11 +166,11 @@ public class IcResiUserServiceImpl implements IcResiUserService { List houseInfoDTOList = govOrgService.queryHouseInfo(houseIds); Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); for (Map resultMap : list) { - String gridIdValue = null != resultMap.get("GRID_ID") ? resultMap.get("GRID_ID").toString() : StrConstant.EPMETY_STR; + String gridIdValue = null != resultMap.get(OrgConstant.GRID_ID) ? resultMap.get(OrgConstant.GRID_ID).toString() : StrConstant.EPMETY_STR; resultMap.put("GRID_ID_VALUE", gridIdValue); if (null != gridInfoMap && gridInfoMap.containsKey(gridIdValue) && null != gridInfoMap.get(gridIdValue)) { //GRID_NAME - resultMap.put("GRID_ID", gridInfoMap.get(gridIdValue).getGridName()); + resultMap.put(OrgConstant.GRID_ID, gridInfoMap.get(gridIdValue).getGridName()); } String homeId = null != resultMap.get("HOME_ID") ? resultMap.get("HOME_ID").toString() : StrConstant.EPMETY_STR; @@ -180,25 +191,26 @@ public class IcResiUserServiceImpl implements IcResiUserService { String houseType = StringUtils.isNotBlank(houseInfoDTO.getHouseType()) ? houseInfoDTO.getHouseType() : StrConstant.EPMETY_STR; //房屋类型,1楼房,2平房,3别墅 - resultMap.put("HOUSE_TYPE", ""); - if ("1".equals(houseType)) { - resultMap.put("HOUSE_TYPE", "楼房"); - } else if ("2".equals(houseType)) { - resultMap.put("HOUSE_TYPE", "平房"); - } else if ("3".equals(houseType)) { - resultMap.put("HOUSE_TYPE", "别墅"); + resultMap.put(OrgConstant.HOUSE_TYPE_KEY, ""); + if (HouseTypeEnum.LOUFANG.getCode().equals(houseType)) { + resultMap.put(OrgConstant.HOUSE_TYPE_KEY, HouseTypeEnum.LOUFANG.getName()); + } else if (HouseTypeEnum.PINGFANG.getCode().equals(houseType)) { + resultMap.put(OrgConstant.HOUSE_TYPE_KEY, HouseTypeEnum.PINGFANG.getName()); + } else if (HouseTypeEnum.BIESHU.getCode().equals(houseType)) { + resultMap.put(OrgConstant.HOUSE_TYPE_KEY, HouseTypeEnum.BIESHU.getName()); } resultMap.put("HOME_ID", neighBorName.concat(buildName).concat(unitName).concat(doorName)); } - if (resultMap.containsKey("GENDER")) { - String genderValue = null != resultMap.get("GENDER") ? resultMap.get("GENDER").toString() : StrConstant.EPMETY_STR; - if ("1".equals(genderValue)) { - resultMap.put("GENDER", "男"); - } else if ("2".equals(genderValue)) { - resultMap.put("HOUSE_TYPE", "女"); - } else if ("0".equals(genderValue)) { - resultMap.put("HOUSE_TYPE", "未知"); + + if (resultMap.containsKey(OrgConstant.GENDER)) { + String genderValue = null != resultMap.get(OrgConstant.GENDER) ? resultMap.get(OrgConstant.GENDER).toString() : StrConstant.EPMETY_STR; + if (GenderEnum.MAN.getCode().equals(genderValue)) { + resultMap.put(OrgConstant.GENDER, GenderEnum.MAN.getName()); + } else if (GenderEnum.WOMAN.getCode().equals(genderValue)) { + resultMap.put(OrgConstant.GENDER, GenderEnum.WOMAN.getName()); + } else if (GenderEnum.UN_KNOWN.getCode().equals(genderValue)) { + resultMap.put(OrgConstant.GENDER, GenderEnum.UN_KNOWN.getName()); } } } @@ -210,26 +222,26 @@ public class IcResiUserServiceImpl implements IcResiUserService { * 编辑页面,显示居民信息详情 * * @param pageFormDTO - * @return java.util.Map + * @return java.util.Map * @author yinzuomei * @date 2021/10/28 10:29 上午 */ @Override public Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO) { - Map resultMap=new HashMap(); + Map resultMap = new HashMap(); // 先查询主表,主表没有记录,直接返回空 - List> icResiUserMapList=icResiUserDao.selectById(pageFormDTO.getIcResiUserId()); - if(CollectionUtils.isEmpty(icResiUserMapList)){ + List> icResiUserMapList = icResiUserDao.selectById(pageFormDTO.getIcResiUserId()); + if (CollectionUtils.isEmpty(icResiUserMapList)) { return new HashMap(); } - resultMap.put("ic_resi_user",icResiUserMapList); + resultMap.put("ic_resi_user", icResiUserMapList); //循环查询每个子表的记录 - Set subTableList=customerFootBarService.queryIcResiSubTables(pageFormDTO.getCustomerId(),pageFormDTO.getFormCode()); - for(String subTalbeName:subTableList){ - List> list=icResiUserDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(),subTalbeName); - if(!CollectionUtils.isEmpty(list)){ - resultMap.put(subTalbeName,list); + Set subTableList = customerFootBarService.queryIcResiSubTables(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode()); + for (String subTalbeName : subTableList) { + List> list = icResiUserDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(), subTalbeName); + if (!CollectionUtils.isEmpty(list)) { + resultMap.put(subTalbeName, list); } //else{ // resultMap.put(subTalbeName,new ArrayList<>()); From 3c3eb1cca849782a67ae218441d307d77fbd4221 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Fri, 29 Oct 2021 17:33:22 +0800 Subject: [PATCH 062/253] copy grid --- .../src/main/java/com/epmet/controller/GridController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java index 737c378af3..9b0db78308 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java @@ -103,6 +103,13 @@ public class GridController { return customerGridService.getAllGridsByAgency(agencyFormDTO); } + @PostMapping("allgridsnopermission") + public Result> allGridsNoPermission(@LoginUser TokenDto tokenDto, @RequestBody CommonAgencyIdFormDTO agencyFormDTO){ + agencyFormDTO.setUserId(tokenDto.getUserId()); + ValidatorUtils.validateEntity(agencyFormDTO); + return customerGridService.getAllGridsByAgency(agencyFormDTO); + } + /** * @Description 在给网格添加工作人员时,查询当前机关下没有加入到此网格下的工作人员,禁用的也不能选(不显示) * @Param CommonGridIdFormDTO From 4dbd7cd131e925fc6c8a95fc538894860165ef18 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 29 Oct 2021 17:48:13 +0800 Subject: [PATCH 063/253] =?UTF-8?q?=E6=88=BF=E5=B1=8B=E6=8C=89=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcHouseServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 66e9ecbebe..a1811351c2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -115,12 +115,12 @@ public class IcHouseServiceImpl extends BaseServiceImpl getHouseOption(HouseFormDTO formDTO) { - if (StringUtils.isBlank(formDTO.getBuildingId()) && StringUtils.isBlank(formDTO.getUnitId())) { - log.error("楼栋ID为空"); + if (StringUtils.isBlank(formDTO.getUnitId())) { + log.error("单元ID为空"); return Collections.emptyList(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StringUtils.isNotBlank(formDTO.getBuildingId()), IcHouseEntity::getBuildingId, formDTO.getBuildingId()); + //wrapper.eq(StringUtils.isNotBlank(formDTO.getBuildingId()), IcHouseEntity::getBuildingId, formDTO.getBuildingId()); wrapper.eq(StringUtils.isNotBlank(formDTO.getUnitId()), IcHouseEntity::getBuildingUnitId, formDTO.getUnitId()); wrapper.last("ORDER BY CONVERT ( HOUSE_NAME USING gbk ) ASC"); List list = baseDao.selectList(wrapper); From 61c6ed31d87a95b78e13ce0d396a4baf9a7dcd5c Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 29 Oct 2021 18:01:17 +0800 Subject: [PATCH 064/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E7=BB=8F=E7=BA=AC?= =?UTF-8?q?=E5=BA=A6=E5=9C=B0=E5=9D=80=EF=BC=8C=E4=B8=8D=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=BF=85=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java index 76a0e52504..5e6aebef29 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java @@ -87,7 +87,7 @@ public class IcNeighborHoodFormDTO implements Serializable { /** * 坐标位置 */ - @NotBlank(message = "坐标位置不能为空", groups = {AddGroup.class, UpdateGroup.class}) + //@NotBlank(message = "坐标位置不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String location; @@ -100,7 +100,7 @@ public class IcNeighborHoodFormDTO implements Serializable { /** * 中心点位:纬度 */ - @NotBlank(message = "维度不能为空", groups = {UpdateGroup.class}) + @NotBlank(message = "纬度不能为空", groups = {UpdateGroup.class}) private String latitude; From 29c57a98e90a4e087ec94c9d0286eec8c62de74f Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 29 Oct 2021 19:53:31 +0800 Subject: [PATCH 065/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-commons/epmet-commons-tools/pom.xml | 2 + .../main/resources/jar/easypoi-base-4.4.0.jar | Bin 0 -> 322934 bytes .../controller/IcResiUserController.java | 160 +++++++++++------- 3 files changed, 105 insertions(+), 57 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/resources/jar/easypoi-base-4.4.0.jar diff --git a/epmet-commons/epmet-commons-tools/pom.xml b/epmet-commons/epmet-commons-tools/pom.xml index e73e2b5e6f..93d1fef898 100644 --- a/epmet-commons/epmet-commons-tools/pom.xml +++ b/epmet-commons/epmet-commons-tools/pom.xml @@ -89,6 +89,8 @@ cn.afterturn easypoi-base ${easypoi.version} + system + ${project.basedir}/src/main/resources/jar/easypoi-base-4.4.0.jar cn.afterturn diff --git a/epmet-commons/epmet-commons-tools/src/main/resources/jar/easypoi-base-4.4.0.jar b/epmet-commons/epmet-commons-tools/src/main/resources/jar/easypoi-base-4.4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..9a1eb02ae9f62a98a58721b395bc4dfa9fc4a8ab GIT binary patch literal 322934 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 za≀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 I(Vt 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 literal 0 HcmV?d00001 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 4e49766a21..de5d3c2a05 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -20,6 +20,7 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.export.ExcelExportService; import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.EpmetErrorCode; @@ -37,21 +38,21 @@ import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.FormGroupDTO; +import com.epmet.dto.result.FormItem; import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; -import com.epmet.handler.ExcelDiceAddressListHandlerImpl; import com.epmet.service.IcResiUserService; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -63,6 +64,7 @@ import java.util.Map; @RestController @RequestMapping("icresiuser") public class IcResiUserController { + private static final String BASE_TABLE_NAME = "ic_resi_user"; @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @@ -136,80 +138,124 @@ public class IcResiUserController { CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); queryDTO.setFormCode("resi_base_info"); queryDTO.setCustomerId(customerId); - Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); } System.out.println(JSON.toJSONString(resultForm.getData())); - List firstHeaderList = new ArrayList<>(); - resultForm.getData().getItemList().forEach(item->{ + Map> sheetHeaderMap = buildHeaderByItem(resultForm); + Workbook workbook = null; + for (Map.Entry> entry : sheetHeaderMap.entrySet()) { + String sheetName = entry.getKey(); + List headers = entry.getValue(); + ExportParams exportParams = new ExportParams(null, sheetName); + + if (workbook == null) { + List> dataList =new ArrayList<>(); + Map dataMap = new HashMap<>(); + dataMap.put("GENDER0", "1"); + dataMap.put("ID_CARD0", "371888991"); + dataList.add(dataMap); + workbook = ExcelExportUtil.exportExcel(exportParams, headers, dataList); + } + new ExcelExportService().createSheetForMap(workbook, exportParams, headers,new ArrayList<>()); + } + + + //exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl()); + System.out.println("header:"+JSON.toJSONString(sheetHeaderMap)); + //Workbook workbook = ExcelExportUtil.exportExcel( new ExportParams(), sheetHeaderMap.get(), dataList); + FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); + workbook.write(fos); + fos.close(); + } + + @NotNull + private Map> buildHeaderByItem(Result resultForm) { + + + List itemList = resultForm.getData().getItemList(); + List groupList = resultForm.getData().getGroupList(); + + Map> everySheetHeaderMap = new LinkedHashMap<>(); + + itemList.forEach(item->{ + if (StringUtils.isBlank(item.getColumnName())){ + return; + } ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum()))); header.setNeedMerge(true); - firstHeaderList.add(header); - String baseTableName = "resi_base_info"; + //这些是动态的 formGroup if (item.getChildGroup() != null){ //baseTableName单独的一个sheet - if (baseTableName.equals(item.getTableName())){ - header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); - header.setNeedMerge(true); - }else{ + System.out.println(item.getLabel()); + if (BASE_TABLE_NAME.equals(item.getTableName())){ header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); header.setNeedMerge(true); + buildHeader(everySheetHeaderMap, item, header); } - if (item.getColumnName().equals("GENDER")){ - header.setReplace(new String[]{"男_1","女_2"}); - } - List secondHeaderList = new ArrayList<>(); - item.getChildGroup().getItemList().forEach(item2->{ - ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); - secondHeader.setNeedMerge(true); - secondHeaderList.add(secondHeader); - if (CollectionUtils.isNotEmpty(item2.getOptions())){ - List thirdHeaderList = new ArrayList<>(); - item2.getOptions().forEach(child->{ - ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); - thirdHeader.setNeedMerge(true); - thirdHeaderList.add(thirdHeader); - }); - secondHeader.setList(thirdHeaderList); - } - }); - header.setList(secondHeaderList); - firstHeaderList.add(header); } }); + List firstSheetHeaderList = new ArrayList<>(); + groupList.forEach(item->{ + /* if (!"兴趣爱好".equals(item.getLabel()) && !"宗教信仰".equals(item.getLabel())){ + return; + }*/ + if (!BASE_TABLE_NAME.equals(item.getTableName())){ + System.out.println(item.getLabel()+"--"+item.getTableName()); + return; + } + ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getTableName()); + header.setNeedMerge(true); + List secondHeaderList = new ArrayList<>(); + item.getItemList().forEach(item2->{ + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum())),30); + secondHeader.setNeedMerge(true); + secondHeaderList.add(secondHeader); + if (CollectionUtils.isNotEmpty(item2.getOptions())){ + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel(),child.getValue()+ new Random(1).nextInt(2),30); + thirdHeader.setNeedMerge(true); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } + }); + header.setList(secondHeaderList); + firstSheetHeaderList.add(header); + System.out.println(JSON.toJSONString(firstSheetHeaderList)); + }); + return everySheetHeaderMap; + } + private void buildHeader(Map> everySheetHeaderMap, FormItem item, ExcelExportEntity header) { + List firstSheetHeaderList = new ArrayList<>(); + List secondHeaderList = new ArrayList<>(); + item.getChildGroup().getItemList().forEach(item2->{ + if (!BASE_TABLE_NAME.equals(item2.getTableName())){ + everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); + } + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); + secondHeader.setNeedMerge(true); + secondHeaderList.add(secondHeader); + if (CollectionUtils.isNotEmpty(item2.getOptions())){ + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } - - /* ExcelExportEntity desginGroup = new ExcelExportEntity("表头名称","键"); - desginGroup.setNeedMerge(true); - List paramCols = new ArrayList<>(); - List headerList = Arrays.asList("头1","头2","头3"); - headerList.forEach(e->{ - paramCols.add(new ExcelExportEntity(e,e,30)); }); - - desginGroup.setList(paramCols); - colList.add(desginGroup);*/ - List> dataList =new ArrayList<>(); - Map dataMap = new HashMap<>(); - dataMap.put("GENDER0","1"); - dataMap.put("ID_CARD0","371888991"); - - dataList.add(dataMap); - ExportParams exportParams = new ExportParams(); - exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl()); - Workbook workbook = ExcelExportUtil.exportExcel(exportParams, firstHeaderList, dataList); - //ExcelExportUtil.exportExcel - FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); - workbook.write(fos); - fos.close(); + header.setList(secondHeaderList); + firstSheetHeaderList.add(header); } } From 4b9210a98aba39a54de4a963279c11b2951f5933 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 29 Oct 2021 22:11:26 +0800 Subject: [PATCH 066/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A7=81=E6=9C=8D?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=B9=B6=E5=88=A0=E9=99=A4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/jar/easypoi-base-4.4.0.jar | Bin 322934 -> 0 bytes pom.xml | 5 +++++ 2 files changed, 5 insertions(+) delete mode 100644 epmet-commons/epmet-commons-tools/src/main/resources/jar/easypoi-base-4.4.0.jar diff --git a/epmet-commons/epmet-commons-tools/src/main/resources/jar/easypoi-base-4.4.0.jar b/epmet-commons/epmet-commons-tools/src/main/resources/jar/easypoi-base-4.4.0.jar deleted file mode 100644 index 9a1eb02ae9f62a98a58721b395bc4dfa9fc4a8ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322934 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 za≀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 I(Vt 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 diff --git a/pom.xml b/pom.xml index 8e34094ca6..0cbc5c73fa 100644 --- a/pom.xml +++ b/pom.xml @@ -97,6 +97,11 @@ + + mvnrepo + jianjun gitee + https://gitee.com/jianjun4833/easypoi.git/ + public aliyun nexus From 6ccee695639fbdb502d2b97f4150e1530f923539 Mon Sep 17 00:00:00 2001 From: lzh Date: Sat, 30 Oct 2021 00:12:13 +0800 Subject: [PATCH 067/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=EF=BC=8C=E6=A5=BC?= =?UTF-8?q?=E5=AE=87=EF=BC=8C=E6=88=BF=E5=B1=8B=E7=AE=A1=E7=90=86=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=EF=BC=8C=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=EF=BC=8C=E5=AF=BC=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/constant/NeighborhoodConstant.java | 4 +- .../com/epmet/dto/form/IcBulidingFormDTO.java | 15 +- .../com/epmet/dto/form/IcHouseFormDTO.java | 6 +- .../epmet/dto/form/IcNeighborHoodFormDTO.java | 4 +- .../dto/form/ListIcNeighborHoodFormDTO.java | 4 +- .../dto/result/IcNeighborHoodResultDTO.java | 8 +- .../epmet/controller/BuildingController.java | 70 +++++++- .../com/epmet/controller/HouseController.java | 81 ++++++++- .../controller/NeighborHoodController.java | 98 ++++++++--- .../main/java/com/epmet/dao/IcHouseDao.java | 4 +- .../java/com/epmet/excel/IcBuildingExcel.java | 12 +- .../java/com/epmet/excel/IcHouseExcel.java | 14 +- .../com/epmet/excel/IcNeighborHoodExcel.java | 5 +- .../com/epmet/service/BuildingService.java | 7 + .../java/com/epmet/service/HouseService.java | 7 + .../service/impl/BuildingServiceImpl.java | 119 ++++++++++++- .../epmet/service/impl/HouseServiceImpl.java | 93 +++++++++- .../service/impl/NeighborHoodServiceImpl.java | 160 +++--------------- .../java/com/epmet/util/ExcelPoiUtils.java | 16 +- .../java/com/epmet/util/ExcelVerifyInfo.java | 31 ++++ .../main/resources/excel/building_export.xlsx | Bin 0 -> 12531 bytes .../main/resources/excel/house_export.xlsx | Bin 0 -> 11453 bytes .../main/resources/excel/neighbor_export.xlsx | Bin 0 -> 12931 bytes .../main/resources/mapper/IcBuildingDao.xml | 86 +++++----- .../src/main/resources/mapper/IcHouseDao.xml | 137 ++++++++------- .../resources/mapper/IcNeighborHoodDao.xml | 48 ++++-- 26 files changed, 685 insertions(+), 344 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelVerifyInfo.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_export.xlsx create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_export.xlsx create mode 100644 epmet-module/gov-org/gov-org-server/src/main/resources/excel/neighbor_export.xlsx diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/NeighborhoodConstant.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/NeighborhoodConstant.java index a7b77e0b90..49a21f262e 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/NeighborhoodConstant.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/constant/NeighborhoodConstant.java @@ -6,10 +6,10 @@ package com.epmet.constant; */ public interface NeighborhoodConstant { - String NEIGHBOR_HOOD= "neighbourHood"; + String GRID = "grid"; + String NEIGHBOR_HOOD= "neighbourHood"; String BUILDING = "building"; - String HOUSE = "house"; } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java index da2b08fc09..9026613dc1 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java @@ -24,6 +24,7 @@ import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.io.Serializable; @@ -74,43 +75,43 @@ public class IcBulidingFormDTO implements Serializable { /** * 排序 */ - @NotBlank(message = "排序不能为空", groups = { UpdateGroup.class}) + @NotNull(message = "排序不能为空", groups = {AddGroup.class, UpdateGroup.class}) private Integer sort = 0; /** * 总单元数 */ - @NotBlank(message = "总单元数不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @NotNull(message = "总单元数不能为空", groups = {AddGroup.class, UpdateGroup.class}) private Integer totalUnitNum=1; /** * 总楼层总数 */ - @NotBlank(message = "总楼层总数不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @NotNull(message = "总楼层总数不能为空", groups = {AddGroup.class, UpdateGroup.class}) private Integer totalFloorNum; /** * 总户数 */ - @NotBlank(message = "总户数不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @NotNull(message = "总户数不能为空", groups = {AddGroup.class, UpdateGroup.class}) private Integer totalHouseNum; /** * 坐标位置 */ - @NotBlank(message = "坐标位置不能为空", groups = { UpdateGroup.class}) + private String location; /** * 中心点位:经度 */ - @NotBlank(message = "经度不能为空", groups = {UpdateGroup.class}) + private String longitude; /** * 中心点位:纬度 */ - @NotBlank(message = "维度不能为空", groups = {UpdateGroup.class}) + private String latitude; diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java index 022a34ad6e..14feda5200 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java @@ -21,9 +21,9 @@ import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import lombok.Data; -import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.io.Serializable; @@ -77,8 +77,8 @@ public class IcHouseFormDTO implements Serializable { /** * 1出租;0未出租 */ - @NotBlank(message = "是否出租不能为空", groups = {AddGroup.class, UpdateGroup.class}) - private Boolean rentFlag; + @NotNull(message = "是否出租不能为空", groups = {AddGroup.class, UpdateGroup.class}) + private Integer rentFlag; /** * 房主姓名 diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java index 5e6aebef29..98a6ad0fde 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java @@ -94,13 +94,13 @@ public class IcNeighborHoodFormDTO implements Serializable { /** * 中心点位:经度 */ - @NotBlank(message = "经度不能为空", groups = {UpdateGroup.class}) + private String longitude; /** * 中心点位:纬度 */ - @NotBlank(message = "纬度不能为空", groups = {UpdateGroup.class}) + private String latitude; diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/ListIcNeighborHoodFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/ListIcNeighborHoodFormDTO.java index 3e7eecf9b8..80b95263b6 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/ListIcNeighborHoodFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/ListIcNeighborHoodFormDTO.java @@ -70,11 +70,11 @@ public class ListIcNeighborHoodFormDTO implements Serializable{ /** * 楼栋ID */ -// private String buildingId; + private String buildingId; /** * 小区ID */ -// private String neighborHoodId; + private String neighborHoodId; } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java index 77358255e1..ca53315d02 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java @@ -22,10 +22,10 @@ public class IcNeighborHoodResultDTO implements Serializable { * */ private Long total; - /** - * 数据类型【小区:neighbourHood,楼栋:building,房屋:house】 - * */ - private String dataType; +// /** +// * 数据类型【小区:neighbourHood,楼栋:building,房屋:house】 +// * */ +// private String dataType; /** * 结果集 diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 632f57fd3f..1763147e90 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -17,29 +17,43 @@ package com.epmet.controller; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.constant.NeighborhoodConstant; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; +import com.epmet.excel.IcBuildingExcel; +import com.epmet.excel.IcHouseExcel; import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.service.BuildingService; import com.epmet.service.IcBuildingService; import com.epmet.service.IcNeighborHoodService; import com.epmet.service.NeighborHoodService; +import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -70,7 +84,7 @@ public class BuildingController { public Result houseList(@RequestBody ListIcNeighborHoodFormDTO formDTO){ //效验数据 ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); - IcNeighborHoodResultDTO icNeighborHoodResultDTO = neighborHoodService.listNeighborhood(formDTO); + IcNeighborHoodResultDTO icNeighborHoodResultDTO = buildingService.listBuilding(formDTO); return new Result().ok(icNeighborHoodResultDTO); } @@ -110,6 +124,60 @@ public class BuildingController { List buildingTreeLevelDTOS =buildingService.treeList(tokenDTO.getUserId()); return new Result().ok(buildingTreeLevelDTOS); } + /** + * 导出模板 + * @param formDTO + * @param response + * @throws Exception + */ + @PostMapping("exporttemplate") + public void exportTemplate(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + TemplateExportParams templatePath = new TemplateExportParams("excel/building_template.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",new ArrayList()); + ExcelPoiUtils.exportExcel(templatePath ,map,"楼宇信息录入表",response); + + } + /** + * 导出 + * @param formDTO + * @param response + * @throws Exception + */ + @RequestMapping("exportbuildinginfo") + public void exportbuildinginfo(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + buildingService.exportBuildinginfo(formDTO,response); + + } + + /** + * 导入数据 + * @param file + * @return + * @throws IOException + */ + @PostMapping("import") + public Result importExcel(@LoginUser TokenDto tokenDTO, @RequestParam("file") MultipartFile file) throws IOException { +// String customerId = tokenDTO.getCustomerId(); + String customerId = "123123"; + + ExcelImportResult importResult = ExcelPoiUtils.importExcelMore(file, 0, 1, IcBuildingExcel.class); + + List failList = importResult.getFailList(); + + if(!CollectionUtils.isEmpty(failList)){ + for ( IcBuildingExcel entity : failList) { + log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 + } + return new Result().error(8000,failList.get(0).getErrorMsg()); + } + List result =importResult.getList(); + + buildingService.importExcel(customerId,result); + return new Result().ok("导入成功"); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index 82eb115b44..3e96997238 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -17,24 +17,40 @@ package com.epmet.controller; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.constant.NeighborhoodConstant; import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; +import com.epmet.excel.IcBuildingExcel; +import com.epmet.excel.IcHouseExcel; +import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.service.HouseService; import com.epmet.service.NeighborHoodService; +import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** @@ -60,7 +76,7 @@ public class HouseController { public Result houseList(@RequestBody ListIcNeighborHoodFormDTO formDTO){ //效验数据 ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); - IcNeighborHoodResultDTO icNeighborHoodResultDTO = neighborHoodService.listNeighborhood(formDTO); + IcNeighborHoodResultDTO icNeighborHoodResultDTO = houseService.listNeighborhood(formDTO); return new Result().ok(icNeighborHoodResultDTO); } @@ -93,5 +109,60 @@ public class HouseController { houseService.delHouse(formDTO.getHouseId()); return new Result(); } + /** + * 导出模板 + * @param formDTO + * @param response + * @throws Exception + */ + @PostMapping("exporttemplate") + public void exportTemplate(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + TemplateExportParams templatePath = new TemplateExportParams("excel/house_template.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",new ArrayList()); + ExcelPoiUtils.exportExcel(templatePath ,map,"房屋信息录入表",response); + + } + /** + * 导出 + * @param formDTO + * @param response + * @throws Exception + */ + @RequestMapping("exporthouseinfo") + public void exporthouseinfo(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + houseService.exportBuildinginfo(formDTO,response); + + } + + /** + * 导入数据 + * @param file + * @return + * @throws IOException + */ + @PostMapping("import") + public Result importExcel(@LoginUser TokenDto tokenDTO, @RequestParam("file") MultipartFile file) throws IOException { + + String customerId = tokenDTO.getCustomerId(); +// String customerId = "123123"; + + ExcelImportResult importResult = ExcelPoiUtils.importExcelMore(file, 0, 1, IcHouseExcel.class); + + List failList = importResult.getFailList(); + + if(!CollectionUtils.isEmpty(failList)){ + for ( IcHouseExcel entity : failList) { + log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 + } + return new Result().error(8000,failList.get(0).getErrorMsg()); + } + List result =importResult.getList(); + + houseService.importExcel(customerId,result); + return new Result().ok("导入成功"); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index 97aa10b5b8..d9b38807e4 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -19,6 +19,9 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; @@ -27,28 +30,30 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.constant.NeighborhoodConstant; +import com.epmet.dao.IcBuildingDao; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; +import com.epmet.entity.IcBuildingEntity; import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcHouseExcel; import com.epmet.excel.IcNeighborHoodExcel; -import com.epmet.service.BuildingService; -import com.epmet.service.HouseService; -import com.epmet.service.IcNeighborHoodService; -import com.epmet.service.NeighborHoodService; +import com.epmet.service.*; import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -73,6 +78,8 @@ public class NeighborHoodController { private BuildingService buildingService; @Autowired private HouseService houseService; + @Resource + private IcBuildingDao icBuildingDao; @@ -112,8 +119,13 @@ public class NeighborHoodController { //效验数据 ValidatorUtils.validateEntity(formDTO, IcNeighborHoodFormDTO.DeleteGroup.class); String neighborHoodId = formDTO.getNeighborHoodId(); + //判断是否存在楼宇,如果存在不能删除 + List icBuildingEntities = icBuildingDao.selectList(new QueryWrapper().lambda().eq(IcBuildingEntity::getNeighborHoodId, neighborHoodId)); + if(!CollectionUtils.isEmpty(icBuildingEntities)){ + return new Result().error(8000,"小区下已存在楼宇,无法删除"); + } neighborHoodService.DelNeighborhood(neighborHoodId); - return new Result(); + return new Result().ok("删除成功"); } @@ -123,13 +135,55 @@ public class NeighborHoodController { * @param response * @throws Exception */ - @RequestMapping("exportneighborhoodinfo") + @PostMapping("exportneighborhoodinfo") public void exportneighborhoodinfo(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); neighborHoodService.exportNeighborhoodinfo(formDTO,response); } + /** + * 导出模板 + * @param formDTO + * @param response + * @throws Exception + */ + @PostMapping("exporttemplate") + public void exportTemplate(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + TemplateExportParams templatePath = new TemplateExportParams("excel/neighbor_template.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",new ArrayList()); + ExcelPoiUtils.exportExcel(templatePath ,map,"小区信息录入表",response); + + } + + /** + * 导出模板 + + * @param response + * @throws Exception + */ + /*@GetMapping("export") + public void export( HttpServletResponse response) throws Exception { + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + TemplateExportParams templatePath = new TemplateExportParams("excel/neighbor_template.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",new ArrayList()); + ExcelPoiUtils.exportExcel(templatePath ,map,"小区信息录入表",response); + + }*/ + /** + * 导出 + * @param response + * @throws Exception + */ + /* @RequestMapping("exportinfo") + public void exportinfo(HttpServletResponse response) throws Exception { + ListIcNeighborHoodFormDTO formDTO = new ListIcNeighborHoodFormDTO(); + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + neighborHoodService.exportNeighborhoodinfo(formDTO,response); + }*/ // /** @@ -151,25 +205,25 @@ public class NeighborHoodController { * @return * @throws IOException */ - @PostMapping("importneighborhoodinfo") - public Result importExcel(@LoginUser TokenDto tokenDTO, @RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException { - String dataType = request.getParameter("dataType"); - if(StringUtils.isEmpty(dataType)){ - return new Result().error(ErrorCode.PASSWORD_ERROR); - } + @PostMapping("import") + public Result importExcel(@LoginUser TokenDto tokenDTO, @RequestParam("file") MultipartFile file) throws IOException { + String customerId = tokenDTO.getCustomerId(); // String customerId = "123123"; - if(NeighborhoodConstant.NEIGHBOR_HOOD.equals(dataType)){ - List result = ExcelPoiUtils.importExcel(file, 0, 1, IcNeighborHoodExcel.class); - neighborHoodService.importExcel(customerId,result); - }else if(NeighborhoodConstant.BUILDING.equals(dataType)){ - List result = ExcelPoiUtils.importExcel(file, 0, 1, IcBuildingExcel.class); - buildingService.importExcel(customerId,result); - }else if(NeighborhoodConstant.HOUSE.equals(dataType)){ - List result = ExcelPoiUtils.importExcel(file, 0, 1, IcHouseExcel.class); - houseService.importExcel(customerId,result); + ExcelImportResult importResult = ExcelPoiUtils.importExcelMore(file, 0, 1, IcNeighborHoodExcel.class); +// List result = ExcelPoiUtils.importExcel(file, 0, 1, IcNeighborHoodExcel.class); + List failList = importResult.getFailList(); + + if(!CollectionUtils.isEmpty(failList)){ + for ( IcNeighborHoodExcel entity : failList) { + log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 + } + return new Result().error(8000,failList.get(0).getErrorMsg()); } - return new Result().ok("导入成功"); + List result =importResult.getList(); +// log.info(JSON.toJSONString(result)); + neighborHoodService.importExcel(customerId,result); + return new Result(); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java index 929a8ab570..e82789db12 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java @@ -51,7 +51,5 @@ public interface IcHouseDao extends BaseDao { IPage> searchHouseByPage(IPage page, @Param("house") IcHouseEntity house); - List searchAllHouse(@Param("neighbor") IcNeighborHoodEntity neighbor, - @Param("building") IcBuildingEntity building, - @Param("house") IcHouseEntity house); + List searchAllHouse(@Param("house") IcHouseEntity house); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java index 230f8d26e0..d29a14942e 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java @@ -18,11 +18,13 @@ package com.epmet.excel; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.epmet.util.ExcelVerifyInfo; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; -import java.util.Date; +import javax.validation.constraints.NotNull; +import java.io.Serializable; /** * 楼栋信息 @@ -31,7 +33,7 @@ import java.util.Date; * @since v1.0.0 2021-10-27 */ @Data -public class IcBuildingExcel { +public class IcBuildingExcel extends ExcelVerifyInfo implements Serializable { /*@Excel(name = "楼栋主键") private String id; @@ -108,14 +110,14 @@ public class IcBuildingExcel { private String buildingName; @Excel(name = "单元数") - @NotBlank(message = "单元数不能位空") + @NotNull(message = "单元数不能位空") private Integer totalUnitNum; @Excel(name = "层数") - @NotBlank(message = "层数不能位空") + @NotNull(message = "层数不能位空") private Integer totalFloorNum; @Excel(name = "户数") - @NotBlank(message = "户数不能位空") + @NotNull(message = "户数不能位空") private Integer totalHouseNum; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java index d51725fd6e..c606388a25 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java @@ -18,11 +18,13 @@ package com.epmet.excel; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.epmet.util.ExcelVerifyInfo; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; -import java.util.Date; +import javax.validation.constraints.NotNull; +import java.io.Serializable; /** * 房屋信息 @@ -31,7 +33,7 @@ import java.util.Date; * @since v1.0.0 2021-10-27 */ @Data -public class IcHouseExcel { +public class IcHouseExcel extends ExcelVerifyInfo implements Serializable { /*@Excel(name = "房屋主键") private String id; @@ -95,17 +97,17 @@ public class IcHouseExcel { - @Excel(name = "小区名称") + @Excel(name = "所属小区") @NotBlank(message = "小区名称不能位空") @Length(max=50,message = "小区名称不能超过50个字") private String neighborHoodName; - @Excel(name = "楼栋名称") + @Excel(name = "所属楼栋") @NotBlank(message = "楼栋名称不能位空") private String buildingName; @Excel(name = "单元号") - @NotBlank(message = "单元号不能位空") + @NotNull(message = "单元号不能位空") private Integer buildingUnit; @Excel(name = "门牌号") @@ -132,7 +134,7 @@ public class IcHouseExcel { @NotBlank(message = "房主电话不能位空") private String ownerPhone; - @Excel(name = "房主身份证号") + @Excel(name = "房主身份证") @NotBlank(message = "房主身份证号不能位空") private String ownerIdCard; diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java index 2926485139..71fcec8379 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java @@ -20,10 +20,12 @@ package com.epmet.excel; import cn.afterturn.easypoi.excel.annotation.Excel; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.util.ExcelVerifyInfo; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; +import java.io.Serializable; import java.util.Date; /** @@ -33,7 +35,7 @@ import java.util.Date; * @since v1.0.0 2021-10-26 */ @Data -public class IcNeighborHoodExcel { +public class IcNeighborHoodExcel extends ExcelVerifyInfo implements Serializable { /*@Excel(name = "小区主键") private String id; @@ -109,7 +111,6 @@ public class IcNeighborHoodExcel { private String neighborHoodName; @Excel(name = "关联物业") - private String propertyName; @Excel(name = "详细地址") diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java index 8cdad17d3e..39df4d14df 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java @@ -19,9 +19,12 @@ package com.epmet.service; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.form.IcBulidingFormDTO; +import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcNeighborHoodExcel; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -50,4 +53,8 @@ public interface BuildingService { List treeList(String customerId); void importExcel(String customerId, List list); + + IcNeighborHoodResultDTO listBuilding(ListIcNeighborHoodFormDTO formDTO); + + void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception ; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java index 258c8c020d..20978c60b2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java @@ -18,9 +18,12 @@ package com.epmet.service; import com.epmet.dto.form.IcHouseFormDTO; +import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.excel.IcHouseExcel; import com.epmet.excel.IcNeighborHoodExcel; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -44,4 +47,8 @@ public interface HouseService { void importExcel(String customerId, List list); + + IcNeighborHoodResultDTO listNeighborhood(ListIcNeighborHoodFormDTO formDTO); + + void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 2ae7a5ac42..0eae07a286 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -1,15 +1,23 @@ package com.epmet.service.impl; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.*; import com.epmet.dto.*; import com.epmet.dto.form.IcBulidingFormDTO; +import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.ExtStaffPermissionResultDTO; +import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.service.*; +import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -18,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -48,6 +57,8 @@ public class BuildingServiceImpl implements BuildingService { private IcNeighborHoodDao icNeighborHoodDao; @Resource private CustomerStaffAgencyDao customerStaffAgencyDao; + @Resource + private IcBuildingUnitDao icBuildingUnitDao; @Override @Transactional(rollbackFor = Exception.class) @@ -63,7 +74,7 @@ public class BuildingServiceImpl implements BuildingService { for(int i =0 ;iu.getId()).orElse(""));//neighborHoodMap.get(icBuildingExcel.getNeighborHoodName()).getId() entity.setBuildingName(icBuildingExcel.getBuildingName()); + entity.setType(""); + entity.setSort(0); entity.setTotalUnitNum(icBuildingExcel.getTotalUnitNum()); entity.setTotalFloorNum(icBuildingExcel.getTotalFloorNum()); entity.setTotalHouseNum(icBuildingExcel.getTotalHouseNum()); @@ -214,7 +227,8 @@ public class BuildingServiceImpl implements BuildingService { for(int i =0 ;i> resultMap = searchBuilding(formDTO); + result.setTotal(resultMap.getTotal()); + result.setList(resultMap.getRecords()); + return result; + } + + @Override + public void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + //如果类型是building 查楼栋 + //导出楼栋 + List icBuildingExcels = searchAllBuilding(formDTO); + TemplateExportParams templatePath = new TemplateExportParams("excel/building_export.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",icBuildingExcels); + ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"楼宇信息录入表",response); + return ; + } + private List searchAllBuilding(ListIcNeighborHoodFormDTO formDTO) { + +// QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); +// neighborHoodEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getAgencyId()),IcNeighborHoodEntity::getAgencyId,formDTO.getAgencyId()) +// .eq(!StringUtils.isEmpty(formDTO.getGridId()),IcNeighborHoodEntity::getId,formDTO.getGridId()) +// .eq(!StringUtils.isEmpty(formDTO.getNeighborHoodId()),IcNeighborHoodEntity::getId,formDTO.getNeighborHoodId()) +// .like(!StringUtils.isEmpty(formDTO.getNeighborHoodName()),IcNeighborHoodEntity::getNeighborHoodName,formDTO.getNeighborHoodName()); +// IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); + +// QueryWrapper buildingEntityQueryWrapper = new QueryWrapper<>(); +// buildingEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) +// .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); +// buildingEntityQueryWrapper.eq("a.DEL_FLAG","0"); + IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); + building.setDelFlag("0"); + + return icBuildingDao.searchAllBuilding(building); + } + + private IPage> searchBuilding(ListIcNeighborHoodFormDTO formDTO) { + IPage page = new Page(formDTO.getPageNo(),formDTO.getPageSize()); + +// IcNeighborHoodEntity neighbor = new IcNeighborHoodEntity(); +// IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); + +// QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); +// neighborHoodEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getAgencyId()),IcNeighborHoodEntity::getAgencyId,formDTO.getAgencyId()) +// .eq(!StringUtils.isEmpty(formDTO.getGridId()),IcNeighborHoodEntity::getId,formDTO.getGridId()) +// .eq(!StringUtils.isEmpty(formDTO.getNeighborHoodId()),IcNeighborHoodEntity::getId,formDTO.getNeighborHoodId()) +// .like(!StringUtils.isEmpty(formDTO.getNeighborHoodName()),IcNeighborHoodEntity::getNeighborHoodName,formDTO.getNeighborHoodName()); + + + IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); + building.setDelFlag("0"); +// QueryWrapper buildingEntityQueryWrapper = new QueryWrapper<>(); +// +// buildingEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) +// .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); +// buildingEntityQueryWrapper.eq("a.DEL_FLAG","0"); + + return icBuildingDao.searchBuildingByPage(page,building); + } + private List covertToTree(CustomerAgencyEntity customerAgency,List agencyList) { BuildingTreeLevelDTO buildingTreeLevelDTO = new BuildingTreeLevelDTO(); @@ -264,7 +346,7 @@ public class BuildingServiceImpl implements BuildingService { IcBuildingDTO icBuilding= icBuildingService.get(formDTO.getBuildingId()); if(!icBuilding.getNeighborHoodId().equals(formDTO.getNeighborHoodId())){ - //更新对应房屋小区名 + //更新对应房屋小区id List icHouseEntities = icHouseDao.selectList(new QueryWrapper().lambda().eq(IcHouseEntity::getBuildingId, formDTO.getBuildingId())); icHouseEntities.forEach(item->{ item.setNeighborHoodId(formDTO.getNeighborHoodId()); @@ -277,7 +359,24 @@ public class BuildingServiceImpl implements BuildingService { icBuildingService.update(icBuildingDTO); //更新楼宇单元 //如果楼宇单元大于之前的楼宇单元,新增单元 - //如果小于,判断是否存在房屋,如果存在就提示不能更改 + Integer nowUnit= formDTO.getTotalUnitNum(); + Integer unit = icBuilding.getTotalUnitNum(); + if(nowUnit>unit){ + //新增单元 + List unitList = new ArrayList<>(); + for(int i =unit ;i icHouseEntities = icHouseDao.selectList(new QueryWrapper().lambda().eq(IcHouseEntity::getBuildingId, buildingId)); + if(!CollectionUtils.isEmpty(icHouseEntities)){ + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(),"楼宇单元下存在房屋,无法删除"); + } + //删除楼宇 icBuildingService.deleteById(buildingId); + //删除楼宇单元 + icBuildingUnitDao.delete(new QueryWrapper().lambda().eq(IcBuildingUnitEntity::getBuildingId,buildingId)); + } } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index 724a35b032..d393d24362 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -1,5 +1,8 @@ package com.epmet.service.impl; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcBuildingDao; import com.epmet.dao.IcBuildingUnitDao; @@ -9,12 +12,17 @@ import com.epmet.dto.IcBuildingDTO; import com.epmet.dto.IcBuildingUnitDTO; import com.epmet.dto.IcHouseDTO; import com.epmet.dto.form.IcHouseFormDTO; +import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.IcNeighborHoodResultDTO; +import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; +import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.excel.IcHouseExcel; import com.epmet.service.HouseService; import com.epmet.service.IcBuildingService; import com.epmet.service.IcBuildingUnitService; import com.epmet.service.IcHouseService; +import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; @@ -51,7 +60,7 @@ public class HouseServiceImpl implements HouseService { public void addHouse(String customerId, IcHouseFormDTO formDTO) { IcHouseDTO icHouseDTO= ConvertUtils.sourceToTarget(formDTO, IcHouseDTO.class); icHouseDTO.setCustomerId(customerId); - icHouseDTO.setRentFlag(formDTO.getRentFlag()?1:0); + icHouseDTO.setRentFlag(formDTO.getRentFlag()); icHouseDTO.setHouseName(getHouseName(formDTO)); icHouseService.save(icHouseDTO); @@ -78,7 +87,7 @@ public class HouseServiceImpl implements HouseService { IcHouseDTO icHouseDTO = ConvertUtils.sourceToTarget(formDTO, IcHouseDTO.class); icHouseDTO.setId(formDTO.getHouseId()); icHouseDTO.setCustomerId(customerId); - icHouseDTO.setRentFlag(formDTO.getRentFlag()?1:0); + icHouseDTO.setRentFlag(formDTO.getRentFlag()); //设置 icHouseDTO.setHouseName(getHouseName(formDTO)); icHouseService.update(icHouseDTO); @@ -127,12 +136,12 @@ public class HouseServiceImpl implements HouseService { entity.setId(uuid); entity.setCustomerId(customerId); Map item = buildMap.get(icHouseExcel.getNeighborHoodName()+","+icHouseExcel.getBuildingName()+","+icHouseExcel.getBuildingUnit()); - if(!CollectionUtils.isEmpty(item)){ - entity.setNeighborHoodId(String.valueOf(item.get("neighborId"))); - entity.setBuildingId(String.valueOf(item.get("buildingId"))); - entity.setBuildingUnitId(String.valueOf(item.get("buildingUnitId"))); - entity.setHouseName(icHouseExcel.getBuildingName()+"-"+icHouseExcel.getBuildingUnit()+"-"+icHouseExcel.getDoorName()); - } + + entity.setNeighborHoodId(String.valueOf(Optional.ofNullable(item).map(u->u.get("neighborId")).orElse(""))); + entity.setBuildingId(String.valueOf(Optional.ofNullable(item).map(u->u.get("buildingId")).orElse(""))); + entity.setBuildingUnitId(String.valueOf(Optional.ofNullable(item).map(u->u.get("buildingUnitId")).orElse(""))); + entity.setHouseName(icHouseExcel.getBuildingName()+"-"+icHouseExcel.getBuildingUnit()+"-"+icHouseExcel.getDoorName()); + entity.setDoorName(icHouseExcel.getDoorName()); entity.setHouseType(icHouseExcel.getHouseType()); entity.setPurpose(icHouseExcel.getPurpose()); @@ -143,10 +152,76 @@ public class HouseServiceImpl implements HouseService { houseEntityList.add(entity); } //3.保存 - //4.新增单元 icHouseService.insertBatch(houseEntityList); } + @Override + public IcNeighborHoodResultDTO listNeighborhood(ListIcNeighborHoodFormDTO formDTO) { + IcNeighborHoodResultDTO result = new IcNeighborHoodResultDTO(); + //如果类型是house 查房屋 + IPage> resultMap = searchHouse(formDTO); + result.setTotal(resultMap.getTotal()); + result.setList(resultMap.getRecords()); + return result; + } + + @Override + public void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { + //如果类型是house 查房屋 + //导出房屋 + + List icHouseExcels = searchAllHouse(formDTO); + TemplateExportParams templatePath = new TemplateExportParams("excel/house_export.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",icHouseExcels); + ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"房屋信息录入表",response); + + return ; + } + private List searchAllHouse(ListIcNeighborHoodFormDTO formDTO) { + + IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); + + IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); + + + IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); + house.setDelFlag("0"); + + return icHouseDao.searchAllHouse(house); + } + + private IPage> searchHouse(ListIcNeighborHoodFormDTO formDTO) { + IPage page = new Page(formDTO.getPageNo(),formDTO.getPageSize()); + +// QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); +// neighborHoodEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getAgencyId()),IcNeighborHoodEntity::getAgencyId,formDTO.getAgencyId()) +// .eq(!StringUtils.isEmpty(formDTO.getGridId()),IcNeighborHoodEntity::getId,formDTO.getGridId()) +// .eq(!StringUtils.isEmpty(formDTO.getNeighborHoodId()),IcNeighborHoodEntity::getId,formDTO.getNeighborHoodId()) +// .like(!StringUtils.isEmpty(formDTO.getNeighborHoodName()),IcNeighborHoodEntity::getNeighborHoodName,formDTO.getNeighborHoodName()); +// IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); + + +// QueryWrapper buildingEntityQueryWrapper = new QueryWrapper<>(); +// buildingEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) +// .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); +// IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); + + +// QueryWrapper houseEntityQueryWrapper = new QueryWrapper<>(); +// houseEntityQueryWrapper.lambda() +// .eq(!StringUtils.isEmpty(formDTO.getOwnerName()),IcHouseEntity::getOwnerName,formDTO.getOwnerName()) +// .like(!StringUtils.isEmpty(formDTO.getOwnerPhone()),IcHouseEntity::getOwnerPhone,formDTO.getOwnerPhone()); +// houseEntityQueryWrapper.eq("a.DEL_FLAG","0"); + + IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); + house.setDelFlag("0"); + + return icHouseDao.searchHouseByPage(page,house); + } + } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index fff8156f11..bed3ac83ee 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -102,91 +102,26 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { */ @Override public IcNeighborHoodResultDTO listNeighborhood(ListIcNeighborHoodFormDTO formDTO) { - String dataType = formDTO.getLevel(); + String level = formDTO.getLevel(); Integer pageNo = formDTO.getPageNo(); Integer pageSize = formDTO.getPageSize(); IcNeighborHoodResultDTO result = new IcNeighborHoodResultDTO(); - result.setDataType(dataType); - - if(StringUtils.isEmpty(dataType)|| NeighborhoodConstant.NEIGHBOR_HOOD.equals(dataType)){ - //如果类型是neighbourHood 查小区 - IPage> resultMap = searchNeighborhood(formDTO); - result.setTotal(resultMap.getTotal()); - result.setList(resultMap.getRecords()); - }else if(NeighborhoodConstant.BUILDING.equals(dataType)){ - //如果类型是building 查楼栋 - IPage> resultMap = searchBuilding(formDTO); - result.setTotal(resultMap.getTotal()); - result.setList(resultMap.getRecords()); - }else if(NeighborhoodConstant.HOUSE.equals(dataType)){ - //如果类型是house 查房屋 - IPage> resultMap = searchHouse(formDTO); - result.setTotal(resultMap.getTotal()); - result.setList(resultMap.getRecords()); - } - return result; - - } - - - - private IPage> searchHouse(ListIcNeighborHoodFormDTO formDTO) { - IPage page = new Page(formDTO.getPageNo(),formDTO.getPageSize()); - -// QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); -// neighborHoodEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getAgencyId()),IcNeighborHoodEntity::getAgencyId,formDTO.getAgencyId()) -// .eq(!StringUtils.isEmpty(formDTO.getGridId()),IcNeighborHoodEntity::getId,formDTO.getGridId()) -// .eq(!StringUtils.isEmpty(formDTO.getNeighborHoodId()),IcNeighborHoodEntity::getId,formDTO.getNeighborHoodId()) -// .like(!StringUtils.isEmpty(formDTO.getNeighborHoodName()),IcNeighborHoodEntity::getNeighborHoodName,formDTO.getNeighborHoodName()); -// IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); - -// QueryWrapper buildingEntityQueryWrapper = new QueryWrapper<>(); -// buildingEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) -// .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); -// IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); + IPage> resultMap = searchNeighborhood(formDTO); + result.setTotal(resultMap.getTotal()); + result.setList(resultMap.getRecords()); + return result; -// QueryWrapper houseEntityQueryWrapper = new QueryWrapper<>(); -// houseEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getOwnerName()),IcHouseEntity::getOwnerName,formDTO.getOwnerName()) -// .like(!StringUtils.isEmpty(formDTO.getOwnerPhone()),IcHouseEntity::getOwnerPhone,formDTO.getOwnerPhone()); -// houseEntityQueryWrapper.eq("a.DEL_FLAG","0"); - IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); - house.setDelFlag("0"); - - return icHouseDao.searchHouseByPage(page,house); } - private IPage> searchBuilding(ListIcNeighborHoodFormDTO formDTO) { - IPage page = new Page(formDTO.getPageNo(),formDTO.getPageSize()); -// IcNeighborHoodEntity neighbor = new IcNeighborHoodEntity(); -// IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); -// QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); -// neighborHoodEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getAgencyId()),IcNeighborHoodEntity::getAgencyId,formDTO.getAgencyId()) -// .eq(!StringUtils.isEmpty(formDTO.getGridId()),IcNeighborHoodEntity::getId,formDTO.getGridId()) -// .eq(!StringUtils.isEmpty(formDTO.getNeighborHoodId()),IcNeighborHoodEntity::getId,formDTO.getNeighborHoodId()) -// .like(!StringUtils.isEmpty(formDTO.getNeighborHoodName()),IcNeighborHoodEntity::getNeighborHoodName,formDTO.getNeighborHoodName()); - IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); - building.setDelFlag("0"); -// QueryWrapper buildingEntityQueryWrapper = new QueryWrapper<>(); -// -// buildingEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) -// .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); -// buildingEntityQueryWrapper.eq("a.DEL_FLAG","0"); - return icBuildingDao.searchBuildingByPage(page,building); - } private IPage> searchNeighborhood(ListIcNeighborHoodFormDTO formDTO) { @@ -202,6 +137,13 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); neighbor.setDelFlag("0"); + if(NeighborhoodConstant.GRID.equals(formDTO.getLevel())){ + //根据网格过滤 + neighbor.setGridId(formDTO.getId()); + }else{ + //根据组织过滤 + neighbor.setAgencyId(formDTO.getId()); + } return icNeighborHoodDao.searchNeighborhoodByPage(page, neighbor); } @@ -274,38 +216,14 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { */ @Override public void exportNeighborhoodinfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - String dataType = formDTO.getLevel(); - - if(StringUtils.isEmpty(dataType)|| NeighborhoodConstant.NEIGHBOR_HOOD.equals(dataType)){ - //如果类型是neighbourHood 查小区 - //导出小区 - List icNeighborHoodExcels = searchAllNeighborhood(formDTO); + //导出小区 + List icNeighborHoodExcels = searchAllNeighborhood(formDTO); // ExcelUtils.exportExcelToTarget(response, "小区信息录入表", icNeighborHoodExcels, IcNeighborHoodExcel.class); - TemplateExportParams templatePath = new TemplateExportParams("excel/neighbor_template.xlsx"); - ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"小区信息录入表",response); - - return ; - }else if(NeighborhoodConstant.BUILDING.equals(dataType)){ - //如果类型是building 查楼栋 - //导出楼栋 - List icBuildingExcels = searchAllBuilding(formDTO); -// ExcelUtils.exportExcelToTarget(response, "楼宇信息录入表", icBuildingExcels, IcBuildingExcel.class); - TemplateExportParams templatePath = new TemplateExportParams("excel/building_template.xlsx"); - ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"楼宇信息录入表",response); - - return ; - }else if(NeighborhoodConstant.HOUSE.equals(dataType)){ - //如果类型是house 查房屋 - //导出房屋 - - List icHouseExcels = searchAllHouse(formDTO); -// ExcelUtils.exportExcelToTarget(response, "房屋信息录入表", icHouseExcels, IcHouseExcel.class); - TemplateExportParams templatePath = new TemplateExportParams("excel/house_template.xlsx"); - ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"房屋信息录入表",response); - - return ; - } + TemplateExportParams templatePath = new TemplateExportParams("excel/neighbor_export.xlsx"); + Map map = new HashMap<>(); + map.put("maplist",icNeighborHoodExcels); + ExcelPoiUtils.exportExcel(templatePath ,map,"小区信息录入表",response); } @Override @@ -339,16 +257,18 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { entity.setId(uuid); entity.setCustomerId(customerId); entity.setNeighborHoodName(icNeighborHoodExcel.getNeighborHoodName()); - entity.setAgencyId(agencyMap.get(icNeighborHoodExcel.getAgencyName()).getId()); - entity.setParentAgencyId(agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPid()); - entity.setAgencyPids(agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPids()); - entity.setGridId(gridMap.get(icNeighborHoodExcel.getGridName()).getId()); + + entity.setAgencyId(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName())).map(u->u.getId()).orElse("")); // agencyMap.get(icNeighborHoodExcel.getAgencyName()).getId()); + entity.setParentAgencyId(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName())).map(u->u.getPid()).orElse(""));//agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPid() + entity.setAgencyPids(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName())).map(u->u.getPids()).orElse(""));//agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPids() + entity.setGridId(Optional.ofNullable(gridMap.get(icNeighborHoodExcel.getGridName())).map(u->u.getId()).orElse(""));//gridMap.get(icNeighborHoodExcel.getGridName()).getId() entity.setAddress(icNeighborHoodExcel.getAddress()); entity.setRemark(icNeighborHoodExcel.getRemark()); neighborHoodEntityList.add(entity); IcNeighborHoodPropertyEntity entity1 = new IcNeighborHoodPropertyEntity(); - entity1.setPropertyId(propertyMap.get(icNeighborHoodExcel.getPropertyName()).getId()); + + entity1.setPropertyId(Optional.ofNullable(propertyMap.get(icNeighborHoodExcel.getPropertyName())).map(u->u.getId()).orElse("")); entity1.setNeighborHoodId(uuid); icNeighborHoodPropertyEntityList.add(entity1); } @@ -360,26 +280,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { } - private List searchAllBuilding(ListIcNeighborHoodFormDTO formDTO) { -// QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); -// neighborHoodEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getAgencyId()),IcNeighborHoodEntity::getAgencyId,formDTO.getAgencyId()) -// .eq(!StringUtils.isEmpty(formDTO.getGridId()),IcNeighborHoodEntity::getId,formDTO.getGridId()) -// .eq(!StringUtils.isEmpty(formDTO.getNeighborHoodId()),IcNeighborHoodEntity::getId,formDTO.getNeighborHoodId()) -// .like(!StringUtils.isEmpty(formDTO.getNeighborHoodName()),IcNeighborHoodEntity::getNeighborHoodName,formDTO.getNeighborHoodName()); -// IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); - -// QueryWrapper buildingEntityQueryWrapper = new QueryWrapper<>(); -// buildingEntityQueryWrapper.lambda() -// .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) -// .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); -// buildingEntityQueryWrapper.eq("a.DEL_FLAG","0"); - IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); - building.setDelFlag("0"); - - return icBuildingDao.searchAllBuilding(building); - } private List searchAllNeighborhood(ListIcNeighborHoodFormDTO formDTO) { // QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); @@ -395,18 +296,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { return icNeighborHoodDao.searchAllNeighborhood(neighbor); } - private List searchAllHouse(ListIcNeighborHoodFormDTO formDTO) { - IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); - - IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); - - - IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); - house.setDelFlag("0"); - - return icHouseDao.searchAllHouse(neighbor,building,house); - } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelPoiUtils.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelPoiUtils.java index fa03b631d1..38ea2c597c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelPoiUtils.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelPoiUtils.java @@ -169,7 +169,7 @@ public class ExcelPoiUtils { params.setTitleRows(titleRows); params.setHeadRows(headerRows); params.setNeedSave(true); - params.setSaveUrl("/excel/"); + params.setSaveUrl("/tmp/excel/"); try { return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params); } catch (NoSuchElementException e) { @@ -218,7 +218,7 @@ public class ExcelPoiUtils { ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); - params.setSaveUrl("/excel/"); + params.setSaveUrl("/tmp/excel/"); params.setNeedSave(true); try { return ExcelImportUtil.importExcel(inputStream, pojoClass, params); @@ -236,12 +236,12 @@ public class ExcelPoiUtils { * @param * @return */ - public static ExcelImportResult importExcelMore(MultipartFile file, Class pojoClass) throws IOException { + public static ExcelImportResult importExcelMore(MultipartFile file,Integer titleRows, Integer headerRows, Class pojoClass) throws IOException { if (file == null) { return null; } try { - return importExcelMore(file.getInputStream(), pojoClass); + return importExcelMore(file.getInputStream(), titleRows, headerRows, pojoClass); } catch (Exception e) { throw new IOException(e.getMessage()); } @@ -255,14 +255,14 @@ public class ExcelPoiUtils { * @param * @return */ - private static ExcelImportResult importExcelMore(InputStream inputStream, Class pojoClass) throws IOException { + private static ExcelImportResult importExcelMore(InputStream inputStream,Integer titleRows, Integer headerRows, Class pojoClass) throws IOException { if (inputStream == null) { return null; } ImportParams params = new ImportParams(); - params.setTitleRows(1);//表格内数据标题行 - params.setHeadRows(1);//表头行 - params.setSaveUrl("/excel/"); + params.setTitleRows(titleRows);//表格内数据标题行 + params.setHeadRows(headerRows);//表头行 + params.setSaveUrl("/tmp/excel/"); params.setNeedSave(true); params.setNeedVerify(true); try { diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelVerifyInfo.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelVerifyInfo.java new file mode 100644 index 0000000000..42be514c98 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/util/ExcelVerifyInfo.java @@ -0,0 +1,31 @@ +package com.epmet.util; + +import cn.afterturn.easypoi.handler.inter.IExcelDataModel; +import cn.afterturn.easypoi.handler.inter.IExcelModel; + +public class ExcelVerifyInfo implements IExcelModel, IExcelDataModel { + + private String errorMsg; + + private int rowNum; + + @Override + public Integer getRowNum() { + return rowNum; + } + + @Override + public void setRowNum(Integer rowNum) { + this.rowNum = rowNum; + } + + @Override + public String getErrorMsg() { + return errorMsg; + } + + @Override + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_export.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_export.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2e2fbd53a4687a1b712d03e47607025fb7c5c251 GIT binary patch literal 12531 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 T+VgX|6BV!uR>1q`KY#rXhBHJ; literal 0 HcmV?d00001 diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_export.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_export.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9460a651dab7de2c80bb9af0fb3d65f06b3d94ee GIT binary patch literal 11453 zcmeHt^;;b2wsqs~?vUW_?jg8q&=A}kcXxM!1ef5F;1=B7gC{`a5b2IpO<4{K8XEu$fCm5o6o4;ujrvXy000Rr0DuL6htz!mv~xDK zbAGMvVQ=cB&+Kk%L!J)}Nt+9R1mFMP?LYVnj3(<_ce7%Lp1|FqQ8gCC@Z%f5YX3X{ zq8@$lui&fi@=n0Y`f-;fNn-3ANo&J{V(Ykey(e>qI>1m+O9iby{?g@M^N2kYH-{Z{ykRgfyhR<^N)byoju(| z6I2^Oe?6?=HJf~XSSAsM=%;>B83$MYlchV}T~dX>bLj}oFW;FDpA}S&3n7SwBYqMu zI5_j+Qzgt=akV&C3>2Ji)iHG5Ho1$D593q%DtrqK06acI0hIs3RV;%~rjTH+u7jzF z1m@~%M^hUo7UrM(|8n#{n3#Wh^@>CVIVd*t(38MNiqUp~W%_5+HY_i96-*u=*wP;i zdD7zxTOO_@#hmjRNIf&F-LgH>FU>v{xEG*%xnjP3i4d4+Hq)xvE%(sW1c#C2C>e7o z-5v1ErtF~nk|Ty5l=t~kII?0RKbV>7(I4MMO0zFes9DdF_f?7`zRra#S{apI3Wy|h zoltp=ZPc2BIQR8=LZLNcJTwr>u3Vd~lnUpis=t)xqO@36M9qZPlhV;Rc7 zX8RyyJgzmtgE_wT@fQ3Q{!W?no9!wPm@YHmw}X z3tyYrH#3Jcnk?BCd-ldE|5((k{q$eKpB&H3YKCD*ri-c zP;66Sq0er~L!Nqve#=v zWsN=iM_u;c-*6&NTh%3so~=d9uR26c+Ouv3t^x}W63TAHWZl#tJp%E)lAK1)u(NtJ zD?d*m>1%0m;TgtkG-2f%HYJ@`UdiWaVm0H-l-fM6z~*Ak4Ns_%mor+dPsD|8LfI`a zB0>e+wJ4L@p3vN>IgRD!i@rjqj1HzYv9gO`YSW3rj!7ET$SH+4CBV{Sz7O)zU_VgH z+h3VjJWH4vK-}-aG3vi+IBHS%V0y)^B}XP(m*vyLc@aEnk*J_n@tEf;u74J!|NY(N0p|-`=V|);c`LN}q*I|vbxxOqZ8J9q^ zoPwySJ_Y>i2iD%taT9kw9U}V@!pB*08&f!>J=-vWQ|-a@s>?87`TTbb7tu}?48h~(GTVpbYh)-d+|(##~< zy!tIas%@;bI(h=hFxr8*g?%Q$_-+1k$xW03mT%wfc#W`$m92C*m95Q`xJ_MlmbgQK z0q@>XK3AeSMiv_S5VhA!#J@F8G%s+no3oY$1$=eVCJ-a4BbyA5NVWeyRD#&8z;1KO zH!joj((Oq2QBqs6LquL0C58%q_A+> zu$s<+)HZXL`69!ZfN;;nV;*H#P@$3ie$LYU=F7^6S9%OI(weW0zRLYZ1dG3FCSaR(wc!O<9Y$z6(p)bWgnlwIRm9EO)V{ z&vk4T6vGjUEQY&0vESq9cO~37JnaN5i|6WDGrZxn0U71uv&)&jj}3%lv}|wZV9M1| z_}T;W;zq7daLtRZ&EO0XFs+hivg*Sakx|wIOsJLNN*s#Rb=af)F1b13P%6H?Gr^%& zNe)en$lwl^U++;irQ;Q(^G#M>hRx42!ae5^a9|}-IP-H;_k|A3KFqlH!^ zadzmT%P_``Gw%~Y6P*;*4-D*ZpxLbMP)Q85HdVKTq6||Q2ae=~oyVVMUo`w^Wj&>w zwZ}XL0830>$)47kQ}KLuCucl*Q>D)@5c#awFaL_88^4vJ1!Z;Vb&DQ0q|#@Nmz>Fb z59sDBbSSAvCpl!0gqAQ2d5bMqiwx<_++@!M2aQeUsC9;E_5yeD@GV4U>HMYO#9%9--IO zT*V!eQq3mVNmWxXr_;WU)e7!(HlVpIKJa-$w@{RYnCs~&BVy~w9xsBC6zkPKV+4;) z=jRlA8`L2VtAK8^fk!B->;{B@a^@Gg$KXwuKQ>Ks zw_huEc`a4p^(ls#G8unEqfuNKW|q1?ti=UurGpL+1$Y<#3T{6koa_0gXnxAXAvEz% zB+sJKU-XV{vl!_sYf!e-Xe8`+tGwh!GOrCQk0f4%s_>kPC`P4o{#u?t+oyt)!mJp@ zYKkC-#Xd)(0QPZA4S^UKYrbKNAk8lZAI|?0evtnKyfphl1j>Qvd;dD5VE-n$;0g~V z5r>d?4ugn};>6{W;vk(^s93IrySrbi{OdiPm0In(m60ECM#umr;X0JvkY%%Zs#LJs zNW9IsUzZ$LG(iUrsuDDUivw346`XPuJDbH~41McLD4Os;%4ZD|Vv>O$1B$+Qw@=Sb zNqvkR0SMKveKERHeU9&T!`8Gb;ehVeEN}bX`5965L7Aui>?4k9Ww?m$8kgJFYs8FX zn}G$^1_^Xy`fR}pt`Z}=2oef7-x%W3b^5Sp;@{)kcT3dFA8G5>=?u>Vwu%tQs?Cizc=IPw!+ zF}C3;<<`u!s@JGbxl*pbbD(x7E&v!q*dEy>l+&}%1cNS8MUSwS;2FJDj;tS8nL=LX*#k)xe2}x)?tF^w*TH?@i z0Vxzcq{NkVyOq(Lm)01bXdemuK1wEg_%c<@#*)FObOZ<3mgB7C6EZfr`@6HUt3Kq- z`0!3wv_P8|ts_53wO}0Ry*&w zdF0M>O9=H&#Itl?_;Cu#pK|Vz!8xCtzqjt{b7afdX$-Y>zaBF{KT1l3%}%878x%ri zvwikr$7I)J4rhZpz;y$Q-54k@b`)L!>1_e{AO-->dh?ZSsH_(=#K5 zV>%^Th3ifiK9X4Gq9RQtQ0q7OKGKa#D=<08Fv`p}f<^w{ocuqF)g-JM47dLss~mq| zRRy?Ajy|wXb0k2%_7khP42oQpWjdv3b4#`p&^gA~Ul=Z7)AMF@%s;k ze-R&R#lMpc&*iUSH~Ab?kb>Kuk|6w`6TB8=)1Om;VVeCKiJ^WIP8`JY#&FpRrm+MT ziJ6p~G&)+{Z`YYDmb09>OM8#!g@}rUmv}|pl!J&kUu~J^D}f6~Q|arfG}%7a?Ciwb zIkqu;kr9*nGyIwuf`q=jZKoS2HayiV>784aZfv!$Up0!6yroje7)sN!UV#J-_k(H< zuoy{Ft6^7X@7;b>E9~kQQsiuHg*dqC-SwnKNzS0qXpFwlJ+Fqr8|kyi&LM30+QH}b zqHaQ#&|NXqJK2laXh|Y;d}wm0jGj9?5f2a%>z@`97WypVyQ!0M_I9h)z4SDUQ>`j5Ew7c~FVz`9R8kuw4V0B{rhtk(WY zXPqrfZB1Ez?SDmGhuTVUL|oV%&reAtor+~#&x^IWbdR=`@LHBNSL;fo%=^#6L3q$%ts#41A54{X6ruDx+dM-3&BUS(E{5`^KbgA`J2ad!gBdM5he3 z*AFRzKoS*8pVNylJS8$OmTY1E=EtqA9}_faq?s#^bPJ{k$9bIWFgbqLH?P;dHy&=j zFYlmrIB$kTJRS`w`8|M;c+js@Os8tANgsY}fe#{gn|EQT-%+Kou!N}*aM!rJ4_8eP zDij3z8;F&@m&-&OOE4l}2ib+~=S4GpsfWpDUSV#?a(f3A(&VqT?Z%{wW-OfA%XU7; z`@tVBdP=`P3$>|in_W;ayEwtiQJBYp2ZP^nY*nfhXX&dT)G;M<$^*Wx*;+1b3T-#t z+icGPGkgI}w=ndPYB(tc z-1kAr?oiR$H~08zBQaW&dilLYj?tJ_{N7|kpG~*E2EtL>(NaqAcPD%Fpd)=vY#x8p zE;(5Z>C@EXD~cBpvz0ii$A67sOzqfd_JB{7K4X^HPkr@*EeQMN8Va@kHz>0c^h;z1 z(Y+=6b?VQE*NYPNNNF>irLyRkX5%Cu+5*$t$?%*bYs?79U8Ab860>F2PAt5%$6R?G z?6TX{OxjVe$qIKNGKzUv4NIgkoV_Buft3Q-u8W~`E8@|{vh-y#dh+m_M zBq2LWl_W9cW9a$9B<>LXa7m-u6i1B@cM7wf9$F-)z;udBEZivvr7nu9jZrK$^uwZe z>sssKS%7RgPy_AY2$YI>?f0;zUa(#Tlidq9V^e@ijw2&gnw!lZ8I0 zGvF=K;Z8of;xi4yN0&LFR&|C6fvjVSpWEysxm zuYO4y2QK}pvEpLTZ^fqj(;rN95R2f=>hv=@>D3&IUFJsrgf}Pv-)4PjJoEusMy$;M0zx&n(=NckG9ocTxlnXU zm+z%r^X2ET-O3%kTW*xef!+8-n(Ae=Gl znP6l`1)kB1iL9AiL26faw{^)%?o->s? zcu^2`e^sC}iNTRK1=Yn+Hd$QeW$=AE7|$Y9i}ger;TP$Xjsdmm8}H=X)#MWmmn;$K z4wjvR-bErs@F17C8u&YvpKnh$^793z&B5_b;{(k#4V+%>oRZI3>`WIWdHm19u2SyMpUX>SdJQ!fc;Z zfr#30xaO^?s_2%lXQQEBQ(iRzXU=P@d9CFe{bdLQB;4LZAs|^ITb6`x5y)4(@va4u zL-47~lX29ZFtjp6TxXMI`{v?A<7T{cvD|o{dknxa(NaG+F&NFK^&|+5nvA*!_)-tP zdm{jX*^^Gl^SYcPa&UeNMY_O|+pCPQ20I0p5}w*-QIQhR|4&!2k<&HAwoU z)2gLo8m1*?8v_N!dv~E*Xm?-Snz^`+wHH*s? znza=bV6c|Y5;c`ayioKY9Uhz}JB9Z7aj|!@E~2Quct{(hBu<9C8i7XBX*NX?wK`W{ zdT}&V7XXDg>n$eRX1u@sja_Wu^tv#&mC#7!@HSu#(Nvytm)Eyk1Y=FlI9{>cHm|s6 zW=SR^_jQ#fOTnea_A-)NeN7Mn!V#@rO>Ugd)J*6lGUY>4ETfQQ!!6kN3pGxD}e zNC|Zub*nng8X-g8^Y*vA-J1iCnij-b`)(n@ z^Y=Ua*$e9gTsQWm77F;F0?h*P84YxV_m3OF9Q0p_PtNy5euc76b7y_=cf-9+_M!53_TS;uac2!aV>SwvQAI zx2dQJbTPVAWpQwj?Dk3`cs^;bRHc<>s#TQ6A8IuU^{Bx(|WZHQ-iwEZ3JPZem z&97^*2U$%(spDKScA~I~vd5v&*PqZtPLw#@zOS`=9K|vhcO8Y*POWtzv#zwewm+x< zzbGD;wI9VPimZD0UEgk7eNl{CZS7gKnQh0<@yi_Rf2igOBHKLIQfnHnx5QTRUK8ep z@`SRGHw#yHZ8dKcSVd4vCriK?`bcdX;YxQ2Rn%)oUmf(3>U1HK?vA0ivQo;{0#^^z zJuwRlpPy7I^B_Nb!N-yt+ki4Jo1nGq>?d1JYa^son%wd!NB%9WrgzKbsD)^2+PR_- z&JE;OQqPP*MlCP(o^g?@1z4=hqPjkpmUjK>*BVw-V}30rKh7ilz^Ufni}K6k+ZX!a zKie356$4z9Hvt+eI|A*USd4*=ra$!^+~56gEgsAQ@5FW49#-uB6PWe9txs~(x8|V@ zP$~L+=oPeUAzL;K+?F!zjY83G23{Zr1mRH2);ZLdg9_uqri5bKcIC^sdMAfxL=1OUmRhk^0f^ia8{}u{bojM6 zqAOnoZn$odEJd9U(;nZ?G1`yyal8h^!t?bY5~r>>tN?miX!1!^BT2QZ{`X1AR2C@=b^7Lq!X3iG#xmqJF!<(d#=6LddZa$+awmir zg=~~l-J#JM5@Uhqx%3qj^7%Fes{F5^`ev(}8RROzO_vrEGM#E?WIL{)FF{6anwby6 z4!o3mwASIBI}Hi*UY0PVbCfc4)Gv^SS*O`Bp24s5-#7x%RJI{i6>eD-Ou`G}zAQAz z^E}IF$Qt0qVSs^U*$DUujivm}M{I@MxkoSXN-Xj%E)%_@Fv6`I@lG^V4uxS@`Ul)L zSUHSFYobJ9ZUu4{zc$~yA6NJ12T@;C$gF&L?MMc0CC2YU@rk)zVWFh3Q4yRJV0-kN zp_Tj~vf~20LLuBbwKc*yNzRX?y)3VQmgFSsWjShFcQLz~%LDf7TgRC2>u|oWu*(qz zaUG;uLkeRWefBgs9UY8L0baH*%B zp`=P1M%$0nOLI^cyvc*=efC!BTFa#TW^w$up?KmmNuHGb;lX)o!w7Y+1(^zy5- z^wi7KD*taU5a2rMKRnB?n*UQTPs^{ry;R}+^76D8`_#eH9R9b1GH@pi{20G8`lqH( z^MT){>12PHKFtoEdiZOQ`P&`<2&Di3{uXjRHUDco@Mm*E%0HR^D>`^;{a3~Pv-K7A dpRA4lzy2!A!GNLqv($kCPynM{hwkUE{|7}qamD}u literal 0 HcmV?d00001 diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/neighbor_export.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/neighbor_export.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2a1b3237d9de0b9f071d4c7ebfcc9fb0df6ef6cb GIT binary patch literal 12931 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

9`#A z^g$5_AJ$!|Y>})zK+PMVe5R$TV`@E_*c8Dq{PeY)szpDzb}fnt zlJqQL^6E=U8+O;jl#!x~tWS#<3vkt(#!(Av>*S>eN|*tz)ooZYWXEGK8W!h;60q=s zb~8Bna6$|UOZ}Q(@J!^03CrZwJ(?AT%qPS5LQxli<0Luz?pv$gX`@EqyiH&f)$%BW z!q3a-TPwl9Pkr5t%evg5n|RLCdvjxU|KP>q5i>Lb&z*1B2ZYxOKvW%ce3E*6Fn?Tq zi#ywxkJqF?+&hVV(mi^;dA2cF8@5m?ZH?70SAiAzj&keW)4i*b=u)}#5(9;zxK4wNiTy z*TSRh>J!*VZSUHbbybZ+6BJD9T&@`Zl}!Qb;N)5$Z(;yq6e_5tXlP>~Z*ODkz-VA& zZ}c;!1E~bIU*)eJuS(Qes z1CzOKUPGzzP(KfY(68UwWTwKJarpSVBhOM>tfwl+4$2|3=%Rh$AQn_8?rvT0JiRX{ zzrsvA`;j+TA11a^3Fug}mbj`z8&%03+l-^PfVtE4wTtOL06aGJ9G%if<+0GY;LHeO zI4QUGEr(#;%$NCgZC+kN)kz&QGUtv=|_59kkUU;8w|7-}D`+eH8S0T*6vWt$J8 zq!j4*1OAngdbYOzWh97-e}2+prL5;cJ=!ZMdzcS*N!2ePKL|2YoeE%4>$gi@Dw!Li zW{ZDFgLNK_k->(t_bate#oA_;lnAE3s@kzOe*8Kb$(qNxJVjwP4s&4HlOG#LZW>Qp zt8KE+*T%I~8V}D^+$pQB;6Of1;j}VZQ*J0}ov{HtB=zeIxZ`p}{$Q5)kA$FQQ9rFQ#j+ohuEs zOu1$-iBsmYcCblV_8Fl(Z^Jxy43-b;O`cA+`)NvjdM_s?Efh54+J|aLbopa1!3AQ+ zPA%U{!H@(jdK!B^xLYZLtuXRT65XKWDy+}YQm73U_%VF1WQZBPKfk|wyu3f#3tdql zGWX)Ne$jg?GIAG)L-5KO8bS;M8O}ilx>LIeQqCJJBl3esAec+Lx=JwHi?ai953@@f zGvXJ^#hFSQcj4Qr^S!pq8;5AH%P{ZNFiPNgucZ6TYA=7x8$-t z2vIthqb4UMxa8JE`#Cxh@-Xh?2$t7+6;=mT4sW%nw^u>%Hx)_3_%=H2ti$YtW@<^Qq?wB_A!gZP#D> zv*B{8ahDOZ?YF-ir=lZQaJHLLr8+k8`KMl^f*4z#^YEf^;;^@V2nJ=7?}s;&pQj! zK9riPs%_rxw%@Id>yv`2=Isu~#9HtQunnAKf#iHWA6oQ$m_tnAEA-$Qk)LYe7+<+; z9`?FoV5y+T53(RDh+vVGQ-6%jgX2&L$BMf*hNy@f;s>qP9~=V%rw0Xt|2{eXdrANJ z_Ahhf@=|{X`1`!-UjYU|PWdm>tIrLePwo9SeFV+%J)7ZsZv6N0rr)Lj02-*;_J0pM zJ;!-I select - a.ID as buildingId, a.BUILDING_NAME as buildingName, + b.NEIGHBOR_HOOD_NAME as neighbourHoodName, a.TOTAL_HOUSE_NUM as totalHouseNum, a.TOTAL_FLOOR_NUM as totalFloorNum, a.TOTAL_UNIT_NUM as totalUnitNum, - a.BUILDING_NAME as buildingType, - b.NEIGHBOR_HOOD_NAME as neighbourHoodName + a.TYPE as buildingType, + a.ID as buildingId, + c.ID as agencyId. + c.ORGANIZATION_NAME as agencyName, + d.ID as gridId, + d.GRID_NAME as gridName, + a.SORT as sort, + a.LONGITUDE as longitude, + a.LATITUDE as latitude, + a.TYPE as buildingTypeKey from ic_building a - LEFT JOIN ic_neighbor_hood b on a.NEIGHBOR_HOOD_ID = b.ID - + LEFT JOIN ic_neighbor_hood b on a.NEIGHBOR_HOOD_ID = b.ID and b.DEL_FLAG='0' + left join customer_agency c on b.AGENCY_ID = c.ID and c.DEL_FLAG='0' - + left join customer_grid d on b.GRID_ID = d.ID and d.DEL_FLAG='0' + + AND a.NEIGHBOR_HOOD_ID = #{building.id} - - AND a.BUILDING_NAME like concat('%',trim(#{building.buildingName}),'%') + + AND a.DEL_FLAG = #{building.delFlag} + + + + + + - diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index e62cb42010..01764d05ad 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -104,39 +104,78 @@ --> + - \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index b1d6f0c7e3..9703c6b33c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -61,19 +61,30 @@ select a.id as neighborHoodId, a.NEIGHBOR_HOOD_NAME as neighborHoodName, + b.ORGANIZATION_NAME as agencyName, + c.GRID_NAME as gridName, a.ADDRESS as address, a.REMARK as remark, + b.ID as agencyId, + c.ID as gridId, + d.PROPERTY_ID as propertyId , + a.LOCATION as location, + a.LONGITUDE as longitude, + a.LATITUDE as latitude - b.ORGANIZATION_NAME as orgName, - c.GRID_NAME as gridName from ic_neighbor_hood a - left join customer_agency b on a.AGENCY_ID = b.ID + left join customer_agency b on a.AGENCY_ID = b.ID and b.DEL_FLAG='0' - left join customer_grid c on a.GRID_ID = c.ID + left join customer_grid c on a.GRID_ID = c.ID and c.DEL_FLAG='0' + + left join ic_neighbor_hood_property d on a.ID = d.NEIGHBOR_HOOD_ID and d.DEL_FLAG='0' - - AND a.GRID_ID = #{neighbor.id} + + AND a.GRID_ID = #{neighbor.gridId} + + + AND (a.AGENCY_ID = #{neighbor.agencyId} or CONCAT(':',a.PIDS, ':') like CONCAT('%:',#{neighbor.agencyId},':%')) AND a.DEL_FLAG = #{neighbor.delFlag} @@ -90,17 +101,20 @@ c.GRID_NAME as gridName from ic_neighbor_hood a - left join customer_agency b on a.AGENCY_ID = b.ID + left join customer_agency b on a.AGENCY_ID = b.ID and b.DEL_FLAG='0' - left join customer_grid c on a.GRID_ID = c.ID - left join ic_neighbor_hood_property d on a.ID = d.NEIGHBOR_HOOD_ID - left join ic_property_management e on d.PROPERTY_ID = e.ID + left join customer_grid c on a.GRID_ID = c.ID and c.DEL_FLAG='0' + left join ic_neighbor_hood_property d on a.ID = d.NEIGHBOR_HOOD_ID and d.DEL_FLAG='0' + left join ic_property_management e on d.PROPERTY_ID = e.ID and e.DEL_FLAG='0' - - AND a.GRID_ID = #{neighbor.id} + + AND a.GRID_ID = #{neighbor.gridId} + + + AND (a.AGENCY_ID = #{neighbor.agencyId} or CONCAT(':',a.PIDS, ':') like CONCAT('%:',#{neighbor.agencyId},':%')) - AND a.DEL_FLAG = #{building.delFlag} + AND a.DEL_FLAG = #{neighbor.delFlag} @@ -142,15 +156,15 @@ ic_neighbor_hood a INNER JOIN customer_agency b on a.AGENCY_ID = b.ID and b.ORGANIZATION_NAME in - ${val} + #{val} - INNER JOIN customer_grid c on a.GRID_ID = c.ID and c.PID = b.ID and b.GRID_NAME in + INNER JOIN customer_grid c on a.GRID_ID = c.ID and c.PID = b.ID and c.GRID_NAME in - ${val} + #{val} where a.DEL_FLAG= '0'and a.NEIGHBOR_HOOD_NAME in - ${val} + #{val} From 5832704b3938fd3da7525f6ff1e27509cc64f235 Mon Sep 17 00:00:00 2001 From: lzh Date: Sat, 30 Oct 2021 15:55:18 +0800 Subject: [PATCH 068/253] =?UTF-8?q?=E7=89=A9=E4=B8=9A=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=8C=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=EF=BC=8C=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/form/IcBulidingFormDTO.java | 5 ++ .../com/epmet/dto/form/IcHouseFormDTO.java | 2 +- .../dto/form/IcPropertyManagementFormDTO.java | 51 +++++++++++ .../result/IcPropertyManagementResultDTO.java | 25 ++++++ .../epmet/controller/BuildingController.java | 4 +- .../controller/NeighborHoodController.java | 15 +--- .../PropertyManagementController.java | 88 +++++++++++++++++++ .../java/com/epmet/dao/IcBuildingDao.java | 5 +- .../java/com/epmet/dao/IcNeighborHoodDao.java | 5 +- .../service/PropertyManagementService.java | 44 ++++++++++ .../service/impl/BuildingServiceImpl.java | 26 +++--- .../epmet/service/impl/HouseServiceImpl.java | 4 +- .../service/impl/NeighborHoodServiceImpl.java | 7 +- .../impl/PropertyManagementServiceImpl.java | 67 ++++++++++++++ .../main/resources/mapper/IcBuildingDao.xml | 36 +++++++- .../resources/mapper/IcNeighborHoodDao.xml | 35 +++++++- 16 files changed, 381 insertions(+), 38 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcPropertyManagementResultDTO.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java index 9026613dc1..592c5a4776 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java @@ -66,6 +66,11 @@ public class IcBulidingFormDTO implements Serializable { @Length(max=10,message = "楼栋名称不能超过10个字", groups = {AddGroup.class, UpdateGroup.class}) private String buildingName; + /** + * 楼栋类型 + */ + private String type=""; + /** * 客户id */ diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java index 14feda5200..2f28b22eee 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java @@ -46,7 +46,7 @@ public class IcHouseFormDTO implements Serializable { private String neighborHoodId; @NotBlank(message = "所属楼栋ID不能为空", groups = { UpdateGroup.class}) - private String belongBuildingId; + private String buildingId; /** * 所属单元id diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java new file mode 100644 index 0000000000..ae5f2f9903 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java @@ -0,0 +1,51 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + + +@Data +public class IcPropertyManagementFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + public interface DeleteGroup extends CustomerClientShowGroup { + } + + @NotBlank(message = "物业id不能为空", groups = { UpdateGroup.class,DeleteGroup.class}) + private String id; + + + /** + * 物业名称 + */ + @NotBlank(message = "物业名称不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @Length(max=10,message = "物业名称不能超过100个字", groups = {AddGroup.class, UpdateGroup.class}) + private String name; + + + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcPropertyManagementResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcPropertyManagementResultDTO.java new file mode 100644 index 0000000000..6f2e058206 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcPropertyManagementResultDTO.java @@ -0,0 +1,25 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @Description 网格列表信息 + * @ClassName GridListInfoResultDTO + * @Author wangc + * @date 2020.04.23 14:21 + */ +@Data +public class IcPropertyManagementResultDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String propertyId; + + private String propertyName; + + +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 1763147e90..81fccb5087 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -160,8 +160,8 @@ public class BuildingController { */ @PostMapping("import") public Result importExcel(@LoginUser TokenDto tokenDTO, @RequestParam("file") MultipartFile file) throws IOException { -// String customerId = tokenDTO.getCustomerId(); - String customerId = "123123"; + String customerId = tokenDTO.getCustomerId(); +// String customerId = "123123"; ExcelImportResult importResult = ExcelPoiUtils.importExcelMore(file, 0, 1, IcBuildingExcel.class); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index d9b38807e4..8d98ad3c8a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -17,42 +17,35 @@ package com.epmet.controller; -import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; -import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; -import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; -import com.epmet.constant.NeighborhoodConstant; import com.epmet.dao.IcBuildingDao; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.IcBuildingEntity; -import com.epmet.excel.IcBuildingExcel; -import com.epmet.excel.IcHouseExcel; import com.epmet.excel.IcNeighborHoodExcel; -import com.epmet.service.*; +import com.epmet.service.BuildingService; +import com.epmet.service.HouseService; +import com.epmet.service.IcNeighborHoodService; +import com.epmet.service.NeighborHoodService; import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java new file mode 100644 index 0000000000..6d35f9af68 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java @@ -0,0 +1,88 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.dto.form.IcPropertyManagementFormDTO; +import com.epmet.dto.result.IcPropertyManagementResultDTO; +import com.epmet.service.IcPropertyManagementService; +import com.epmet.service.PropertyManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +@RestController +@RequestMapping("propertymanagement") +public class PropertyManagementController { + + @Autowired + private IcPropertyManagementService icPropertyManagementService; + + @Autowired + private PropertyManagementService propertyManagementService; + + + @PostMapping("list") + public Result> list(){ + return new Result>().ok(propertyManagementService.getList()); + } + + + @PostMapping("add") + public Result add(@LoginUser TokenDto tokenDTO, @RequestBody IcPropertyManagementFormDTO formDTO){ + //效验数据 + ValidatorUtils.validateEntity(formDTO, AddGroup.class); + propertyManagementService.add(formDTO); + return new Result().ok("保存成功"); + } + + + + @PostMapping("update") + public Result update(@LoginUser TokenDto tokenDTO, @RequestBody IcPropertyManagementFormDTO formDTO){ + //效验数据 + ValidatorUtils.validateEntity(formDTO, UpdateGroup.class); + propertyManagementService.update(formDTO); + return new Result(); + } + + @PostMapping("delete") + public Result delete(@LoginUser TokenDto tokenDTO, @RequestBody IcPropertyManagementFormDTO formDTO){ + //效验数据 + ValidatorUtils.validateEntity(formDTO, IcPropertyManagementFormDTO.DeleteGroup.class); + propertyManagementService.delete(formDTO); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java index becb5ad1b8..511daa2fad 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.entity.IcBuildingEntity; +import com.epmet.entity.IcHouseEntity; import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.excel.IcBuildingExcel; import org.apache.ibatis.annotations.Mapper; @@ -45,14 +46,14 @@ public interface IcBuildingDao extends BaseDao { // @Param("neighbor") IcNeighborHoodEntity neighbor, // @Param("building")IcBuildingEntity building); IPage> searchBuildingByPage(IPage page, - @Param("building")IcBuildingEntity building); + @Param("building")IcBuildingEntity building, @Param("house") IcHouseEntity house); // List searchAllBuilding(@Param(Constants.WRAPPER) QueryWrapper neighborHoodEntityQueryWrapper, // @Param("ew1") QueryWrapper buildingEntityQueryWrapper); // List searchAllBuilding(@Param("neighbor") IcNeighborHoodEntity neighbor, // @Param("building")IcBuildingEntity building); List searchAllBuilding( - @Param("building")IcBuildingEntity building); + @Param("building")IcBuildingEntity building, @Param("house")IcHouseEntity house); List selectAgencyChildrenList(@Param("agencyId") String agencyId); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java index 919cd34707..4da3423f9d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcHouseEntity; import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.excel.IcNeighborHoodExcel; import org.apache.ibatis.annotations.Mapper; @@ -40,10 +41,10 @@ import java.util.Set; public interface IcNeighborHoodDao extends BaseDao { // IPage> searchNeighborhoodByPage(IPage page,@Param(Constants.WRAPPER) QueryWrapper neighborHoodEntityQueryWrapper); - IPage> searchNeighborhoodByPage(IPage page,@Param("neighbor") IcNeighborHoodEntity neighbor); + IPage> searchNeighborhoodByPage(IPage page, @Param("neighbor") IcNeighborHoodEntity neighbor, @Param("house")IcHouseEntity house); // List searchAllNeighborhood(@Param(Constants.WRAPPER) QueryWrapper neighborHoodEntityQueryWrapper); - List searchAllNeighborhood(@Param("neighbor") IcNeighborHoodEntity neighbor); + List searchAllNeighborhood(@Param("neighbor") IcNeighborHoodEntity neighbor, @Param("house")IcHouseEntity house); List selectListByName(@Param("neighborNameList")List neighborNameList, @Param("agencyNameList") List agencyNameList, diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java new file mode 100644 index 0000000000..5fe43468e9 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java @@ -0,0 +1,44 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcPropertyManagementDTO; +import com.epmet.dto.form.IcPropertyManagementFormDTO; +import com.epmet.dto.result.IcPropertyManagementResultDTO; +import com.epmet.entity.IcPropertyManagementEntity; + +import java.util.List; +import java.util.Map; + +/** + * 物业表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-25 + */ +public interface PropertyManagementService { + + List getList(); + + void add(IcPropertyManagementFormDTO formDTO); + + void update(IcPropertyManagementFormDTO formDTO); + void delete(IcPropertyManagementFormDTO formDTO); +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 0eae07a286..d6b989fbd0 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -73,6 +73,7 @@ public class BuildingServiceImpl implements BuildingService { List unitList = new ArrayList<>(); for(int i =0 ;i> searchBuilding(ListIcNeighborHoodFormDTO formDTO) { @@ -305,8 +306,8 @@ public class BuildingServiceImpl implements BuildingService { // .eq(!StringUtils.isEmpty(formDTO.getBuildingId()),IcBuildingEntity::getId,formDTO.getBuildingId()) // .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); // buildingEntityQueryWrapper.eq("a.DEL_FLAG","0"); - - return icBuildingDao.searchBuildingByPage(page,building); + IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); + return icBuildingDao.searchBuildingByPage(page,building,house); } @@ -348,10 +349,14 @@ public class BuildingServiceImpl implements BuildingService { if(!icBuilding.getNeighborHoodId().equals(formDTO.getNeighborHoodId())){ //更新对应房屋小区id List icHouseEntities = icHouseDao.selectList(new QueryWrapper().lambda().eq(IcHouseEntity::getBuildingId, formDTO.getBuildingId())); - icHouseEntities.forEach(item->{ - item.setNeighborHoodId(formDTO.getNeighborHoodId()); - }); - icHouseService.updateBatchById(icHouseEntities); + if(!CollectionUtils.isEmpty(icHouseEntities)){ + // + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(),"楼宇单元下存在房屋,无法更新"); +// icHouseEntities.forEach(item->{ +// item.setNeighborHoodId(formDTO.getNeighborHoodId()); +// }); +// icHouseService.updateBatchById(icHouseEntities); + } } IcBuildingDTO icBuildingDTO= ConvertUtils.sourceToTarget(formDTO, IcBuildingDTO.class); icBuildingDTO.setId(formDTO.getBuildingId()); @@ -361,13 +366,14 @@ public class BuildingServiceImpl implements BuildingService { //如果楼宇单元大于之前的楼宇单元,新增单元 Integer nowUnit= formDTO.getTotalUnitNum(); Integer unit = icBuilding.getTotalUnitNum(); - if(nowUnit>unit){ + if(nowUnit>=unit){ //新增单元 List unitList = new ArrayList<>(); for(int i =unit ;iu.getBuildingName()).orElse(""); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index bed3ac83ee..dc96ce0dd8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -136,6 +136,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { // neighborHoodEntityQueryWrapper.eq("a.DEL_FLAG","0"); IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); + IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); neighbor.setDelFlag("0"); if(NeighborhoodConstant.GRID.equals(formDTO.getLevel())){ //根据网格过滤 @@ -144,7 +145,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { //根据组织过滤 neighbor.setAgencyId(formDTO.getId()); } - return icNeighborHoodDao.searchNeighborhoodByPage(page, neighbor); + return icNeighborHoodDao.searchNeighborhoodByPage(page, neighbor,house); } /** @@ -292,8 +293,8 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { // neighborHoodEntityQueryWrapper.eq("a.DEL_FLAG","0"); IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); neighbor.setDelFlag("0"); - - return icNeighborHoodDao.searchAllNeighborhood(neighbor); + IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); + return icNeighborHoodDao.searchAllNeighborhood(neighbor,house); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java new file mode 100644 index 0000000000..4068fb710d --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java @@ -0,0 +1,67 @@ +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.IcNeighborHoodPropertyDao; +import com.epmet.dao.IcPropertyManagementDao; +import com.epmet.dto.form.IcPropertyManagementFormDTO; +import com.epmet.dto.result.IcPropertyManagementResultDTO; +import com.epmet.entity.IcNeighborHoodPropertyEntity; +import com.epmet.entity.IcPropertyManagementEntity; +import com.epmet.service.PropertyManagementService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Service +public class PropertyManagementServiceImpl implements PropertyManagementService { + + @Resource + private IcPropertyManagementDao icPropertyManagementDao; + @Resource + private IcNeighborHoodPropertyDao icNeighborHoodPropertyDao; + + @Override + public List getList() { + List propertyManagementEntityList = icPropertyManagementDao.selectList(null); + List list = new ArrayList<>(); + propertyManagementEntityList.forEach(item->{ + IcPropertyManagementResultDTO propertyManagementResultDTO = new IcPropertyManagementResultDTO(); + propertyManagementResultDTO.setPropertyId(item.getId()); + propertyManagementResultDTO.setPropertyName(item.getName()); + list.add(propertyManagementResultDTO); + }); + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void add(IcPropertyManagementFormDTO formDTO) { + IcPropertyManagementEntity icPropertyManagementEntity = ConvertUtils.sourceToTarget(formDTO, IcPropertyManagementEntity.class); + icPropertyManagementDao.insert(icPropertyManagementEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcPropertyManagementFormDTO formDTO) { + IcPropertyManagementEntity icPropertyManagementEntity = ConvertUtils.sourceToTarget(formDTO, IcPropertyManagementEntity.class); + icPropertyManagementDao.updateById(icPropertyManagementEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(IcPropertyManagementFormDTO formDTO) { + List list = icNeighborHoodPropertyDao.selectList(new QueryWrapper().lambda().eq(IcNeighborHoodPropertyEntity::getPropertyId, formDTO.getId())); + if(!CollectionUtils.isEmpty(list)){ + throw new RenException("物业存在与小区关联,无法删除"); + } + icPropertyManagementDao.deleteById(formDTO.getId()); + } +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index 9951294477..1226c7ec74 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -51,12 +51,13 @@ select a.BUILDING_NAME as buildingName, b.NEIGHBOR_HOOD_NAME as neighbourHoodName, + b.ID as neighborHoodId, a.TOTAL_HOUSE_NUM as totalHouseNum, a.TOTAL_FLOOR_NUM as totalFloorNum, a.TOTAL_UNIT_NUM as totalUnitNum, a.TYPE as buildingType, a.ID as buildingId, - c.ID as agencyId. + c.ID as agencyId, c.ORGANIZATION_NAME as agencyName, d.ID as gridId, d.GRID_NAME as gridName, @@ -72,8 +73,23 @@ left join customer_grid d on b.GRID_ID = d.ID and d.DEL_FLAG='0' - AND a.NEIGHBOR_HOOD_ID = #{building.id} + AND a.NEIGHBOR_HOOD_ID = #{building.neighborHoodId} + + + AND a.ID in (select distinct BUILDING_ID from ic_house e + + + AND e.OWNER_NAME = #{house.ownerName} + + + AND e.OWNER_PHONE = #{house.ownerPhone} + + and e.DEL_FLAG='0' + + ) + + AND a.DEL_FLAG = #{building.delFlag} @@ -99,7 +115,21 @@ - AND a.NEIGHBOR_HOOD_ID = #{building.id} + AND a.NEIGHBOR_HOOD_ID = #{building.neighborHoodId} + + + + AND a.ID in (select distinct BUILDING_ID from ic_house e + + + AND e.OWNER_NAME = #{house.ownerName} + + + AND e.OWNER_PHONE = #{house.ownerPhone} + + and e.DEL_FLAG='0' + + ) AND a.DEL_FLAG = #{building.delFlag} diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index 9703c6b33c..8c00a943d6 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -84,8 +84,24 @@ AND a.GRID_ID = #{neighbor.gridId} - AND (a.AGENCY_ID = #{neighbor.agencyId} or CONCAT(':',a.PIDS, ':') like CONCAT('%:',#{neighbor.agencyId},':%')) + AND (a.AGENCY_ID = #{neighbor.agencyId} or CONCAT(':',a.AGENCY_PIDS, ':') like CONCAT('%:',#{neighbor.agencyId},':%')) + + + AND a.ID in (select NEIGHBOR_HOOD_ID from ic_house e + + + AND e.OWNER_NAME = #{house.ownerName} + + + AND e.OWNER_PHONE = #{house.ownerPhone} + + and e.DEL_FLAG='0' + + ) + + + AND a.DEL_FLAG = #{neighbor.delFlag} @@ -111,8 +127,23 @@ AND a.GRID_ID = #{neighbor.gridId} - AND (a.AGENCY_ID = #{neighbor.agencyId} or CONCAT(':',a.PIDS, ':') like CONCAT('%:',#{neighbor.agencyId},':%')) + AND (a.AGENCY_ID = #{neighbor.agencyId} or CONCAT(':',a.AGENCY_PIDS, ':') like CONCAT('%:',#{neighbor.agencyId},':%')) + + + AND a.ID in (select distinct NEIGHBOR_HOOD_ID from ic_house e + + + AND e.OWNER_NAME = #{house.ownerName} + + + AND e.OWNER_PHONE = #{house.ownerPhone} + + and e.DEL_FLAG='0' + + ) + + AND a.DEL_FLAG = #{neighbor.delFlag} From 74a475171ba04827f14ec096c413b253ada64ac0 Mon Sep 17 00:00:00 2001 From: jianjun Date: Sun, 31 Oct 2021 07:50:36 +0800 Subject: [PATCH 069/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A7=81=E6=9C=8D?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=B9=B6=E5=88=A0=E9=99=A4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-commons/epmet-commons-tools/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/pom.xml b/epmet-commons/epmet-commons-tools/pom.xml index 93d1fef898..31e2276fc4 100644 --- a/epmet-commons/epmet-commons-tools/pom.xml +++ b/epmet-commons/epmet-commons-tools/pom.xml @@ -89,8 +89,8 @@ cn.afterturn easypoi-base ${easypoi.version} - system - ${project.basedir}/src/main/resources/jar/easypoi-base-4.4.0.jar + cn.afterturn From 102adebe0526107c04666876f9b2df71e53ef332 Mon Sep 17 00:00:00 2001 From: jianjun Date: Sun, 31 Oct 2021 23:02:51 +0800 Subject: [PATCH 070/253] =?UTF-8?q?=E6=9E=84=E5=BB=BA=E8=A1=A8=E5=A4=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index de5d3c2a05..753b3e5fe4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -17,11 +17,11 @@ package com.epmet.controller; -import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.afterturn.easypoi.excel.export.ExcelExportService; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; @@ -43,9 +43,9 @@ import com.epmet.dto.result.FormItem; import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -144,29 +144,21 @@ public class IcResiUserController { } System.out.println(JSON.toJSONString(resultForm.getData())); - + XSSFWorkbook workbook = new XSSFWorkbook(); Map> sheetHeaderMap = buildHeaderByItem(resultForm); - Workbook workbook = null; + //Workbook workbook = null; for (Map.Entry> entry : sheetHeaderMap.entrySet()) { String sheetName = entry.getKey(); List headers = entry.getValue(); - ExportParams exportParams = new ExportParams(null, sheetName); - - if (workbook == null) { - List> dataList =new ArrayList<>(); - Map dataMap = new HashMap<>(); - dataMap.put("GENDER0", "1"); - dataMap.put("ID_CARD0", "371888991"); - dataList.add(dataMap); - workbook = ExcelExportUtil.exportExcel(exportParams, headers, dataList); - } + ExportParams exportParams = new ExportParams(); + exportParams.setSheetName(sheetName); + exportParams.setAutoSize(true); new ExcelExportService().createSheetForMap(workbook, exportParams, headers,new ArrayList<>()); } + List allNames = workbook.getAllNames(); + System.out.println("======"+allNames); - //exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl()); - System.out.println("header:"+JSON.toJSONString(sheetHeaderMap)); - //Workbook workbook = ExcelExportUtil.exportExcel( new ExportParams(), sheetHeaderMap.get(), dataList); FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); workbook.write(fos); fos.close(); @@ -174,32 +166,61 @@ public class IcResiUserController { @NotNull private Map> buildHeaderByItem(Result resultForm) { - + //form中的itemlist 为一级表头 但是要排除每个item中含有childGroup的 List itemList = resultForm.getData().getItemList(); List groupList = resultForm.getData().getGroupList(); Map> everySheetHeaderMap = new LinkedHashMap<>(); + List firstSheetHeaderList = new ArrayList<>(); itemList.forEach(item->{ if (StringUtils.isBlank(item.getColumnName())){ return; } - ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum()))); - header.setNeedMerge(true); + ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum())),30); + header.setNeedMerge(true); + if (item.getChildGroup() == null){ + System.out.println(item.getLabel()); + firstSheetHeaderList.add(header); + return; + } + everySheetHeaderMap.putIfAbsent(resultForm.getData().getFormName(),firstSheetHeaderList); //这些是动态的 formGroup if (item.getChildGroup() != null){ //baseTableName单独的一个sheet - System.out.println(item.getLabel()); + System.out.println("childGroup:"+item.getLabel()); if (BASE_TABLE_NAME.equals(item.getTableName())){ header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); header.setNeedMerge(true); - buildHeader(everySheetHeaderMap, item, header); + List otherSheetHeaderList = new ArrayList<>(); + List secondHeaderList = new ArrayList<>(); + //这里是设置除基础信息之外的sheet的表头 + item.getChildGroup().getItemList().forEach(item2->{ + if (!BASE_TABLE_NAME.equals(item2.getTableName())){ + + everySheetHeaderMap.putIfAbsent(item.getLabel(),otherSheetHeaderList); + } + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); + secondHeader.setNeedMerge(true); + secondHeaderList.add(secondHeader); + if (!item2.getItemType().equals("radio") && com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(item2.getOptions())){ + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } + + }); + header.setList(secondHeaderList); + otherSheetHeaderList.add(header); } } }); - List firstSheetHeaderList = new ArrayList<>(); + //List firstSheetHeaderList = new ArrayList<>(); groupList.forEach(item->{ /* if (!"兴趣爱好".equals(item.getLabel()) && !"宗教信仰".equals(item.getLabel())){ return; @@ -212,13 +233,13 @@ public class IcResiUserController { header.setNeedMerge(true); List secondHeaderList = new ArrayList<>(); item.getItemList().forEach(item2->{ - ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum())),30); + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); secondHeader.setNeedMerge(true); secondHeaderList.add(secondHeader); - if (CollectionUtils.isNotEmpty(item2.getOptions())){ + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(item2.getOptions())){ List thirdHeaderList = new ArrayList<>(); item2.getOptions().forEach(child->{ - ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel(),child.getValue()+ new Random(1).nextInt(2),30); + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel(),child.getValue()+ new Random(1).nextInt(2)); thirdHeader.setNeedMerge(true); thirdHeaderList.add(thirdHeader); }); @@ -234,7 +255,6 @@ public class IcResiUserController { } private void buildHeader(Map> everySheetHeaderMap, FormItem item, ExcelExportEntity header) { - List firstSheetHeaderList = new ArrayList<>(); List secondHeaderList = new ArrayList<>(); item.getChildGroup().getItemList().forEach(item2->{ @@ -256,6 +276,7 @@ public class IcResiUserController { }); header.setList(secondHeaderList); firstSheetHeaderList.add(header); + everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); } } From 40d6250116a50dd6ee2f89dcd4c6a2d0d74b6abd Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 1 Nov 2021 10:55:45 +0800 Subject: [PATCH 071/253] =?UTF-8?q?=E7=BB=84=E7=BB=87=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E5=8F=91=E7=8E=B0=E5=8F=AF=E7=9B=B4=E6=8E=A5=E5=A4=8D?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/service/impl/AgencyServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 9de97fafbb..f794ea229f 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 @@ -582,8 +582,8 @@ public class AgencyServiceImpl implements AgencyService { if (null == staffInfo){ return result; } - formDTO.setOrgId(staffInfo.getFromOrgId()); - formDTO.setLevel(staffInfo.getFromOrgType()); + formDTO.setOrgId(staffInfo.getAgencyId()); + formDTO.setLevel(OrgInfoConstant.AGENCY); } if (formDTO.getLevel().equals(OrgInfoConstant.AGENCY)){ CustomerAgencyEntity entity = customerAgencyDao.selectById(formDTO.getOrgId()); From aed6962927204256b14a0703caf1847bcbdb7de8 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Mon, 1 Nov 2021 12:41:23 +0800 Subject: [PATCH 072/253] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=A3=E6=9E=90exc?= =?UTF-8?q?el=E7=9A=84=E4=B8=B4=E6=97=B6=E5=B7=A5=E5=85=B7:ExcelPaseTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet-demo/epmet-demo-server/pom.xml | 5 ++ .../java/com/epmet/utils/ExcelPaseTest.java | 58 +++++++++++++ .../java/com/epmet/utils/IndexOrNameData.java | 20 +++++ .../utils/TempDynamicEasyExcelListener.java | 82 +++++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/ExcelPaseTest.java create mode 100644 epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/IndexOrNameData.java create mode 100644 epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/TempDynamicEasyExcelListener.java diff --git a/epmet-module/epmet-demo/epmet-demo-server/pom.xml b/epmet-module/epmet-demo/epmet-demo-server/pom.xml index 00a03e4aab..8ef89773a9 100644 --- a/epmet-module/epmet-demo/epmet-demo-server/pom.xml +++ b/epmet-module/epmet-demo/epmet-demo-server/pom.xml @@ -13,6 +13,11 @@ jar + + com.alibaba + easyexcel + 2.2.6 + com.epmet epmet-commons-tools diff --git a/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/ExcelPaseTest.java b/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/ExcelPaseTest.java new file mode 100644 index 0000000000..6b277bd0d7 --- /dev/null +++ b/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/ExcelPaseTest.java @@ -0,0 +1,58 @@ +package com.epmet.utils; + +import com.alibaba.excel.EasyExcelFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @description excel解析 + * + * @return + * @author wxz + * @date 2021.10.28 13:36:26 + */ +public class ExcelPaseTest { + + public static void main(String[] args) { + new ExcelPaseTest().sqlizeGridNameAndCodeFromExcel(); + } + + /** + * @description 读取excel,生成根据网格name更新网格code的sql + * + * @param + * @return + * @author wxz + * @date 2021.10.28 13:34:31 + */ + public void sqlizeGridNameAndCodeFromExcel() { + TempDynamicEasyExcelListener readListener = new TempDynamicEasyExcelListener(); + EasyExcelFactory.read(new File("/Users/wangxianzhang/Documents/1027平阴县网格编码及人员统计表.xls"), IndexOrNameData.class, readListener).headRowNumber(4).sheet(0).doRead(); + List> headList = readListener.getHeadList(); + List dataList = readListener.getDataList(); + + List exceptList = new ArrayList<>(); + + for (IndexOrNameData data : dataList) { + String content = data.getColumn(); + + int startIndex = content.indexOf("370"); + if (startIndex == -1) { + exceptList.add(content); + } else { + String gridName = content.substring(0, startIndex).trim(); + String gridCode = content.substring(startIndex); + String sqlPattern = String.format("update customer_grid set CODE='%s' where GRID_NAME='%s';", gridCode, gridName); + System.out.println(sqlPattern); + } + } + + System.err.println("========异常行======="); + for (String s : exceptList) { + System.err.println(s); + } + } +} diff --git a/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/IndexOrNameData.java b/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/IndexOrNameData.java new file mode 100644 index 0000000000..920b9e66b5 --- /dev/null +++ b/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/IndexOrNameData.java @@ -0,0 +1,20 @@ +package com.epmet.utils; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class IndexOrNameData { + /** + * 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配 + */ + @ExcelProperty(index = 3) + private String column; + ///** + // * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据 + // */ + //@ExcelProperty("字符串标题") + //private String string; + //@ExcelProperty("日期标题") + //private Date date; +} \ No newline at end of file diff --git a/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/TempDynamicEasyExcelListener.java b/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/TempDynamicEasyExcelListener.java new file mode 100644 index 0000000000..cc870c58cc --- /dev/null +++ b/epmet-module/epmet-demo/epmet-demo-server/src/main/java/com/epmet/utils/TempDynamicEasyExcelListener.java @@ -0,0 +1,82 @@ +package com.epmet.utils; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 创建一个监听器 + */ +@Slf4j +public class TempDynamicEasyExcelListener extends AnalysisEventListener { + + /** + * 表头数据(存储所有的表头数据) + */ + private List> headList = new ArrayList<>(); + + /** + * 数据体 + */ + private List dataList = new ArrayList<>(); + + /** + * 这里会一行行的返回头 + * + * @param headMap + * @param context + */ + //@Override + //public void invokeHeadMap(IcResiUserController.IndexOrNameData headMap, AnalysisContext context) { + // log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); + // //存储全部表头数据 + // headList.add(headMap); + //} + + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); + //存储全部表头数据 + headList.add(headMap); + } + + /** + * 这个每一条数据解析都会来调用 + * + * @param data + * one row value. Is is same as {@link AnalysisContext#readRowHolder()} + * @param context + */ + @Override + public void invoke(IndexOrNameData data, AnalysisContext context) { + //log.info("解析到一条数据:{}", JSON.toJSONString(data)); + if (data.getColumn() != null) { + dataList.add(data); + } + } + + /** + * 所有数据解析完成了 都会来调用 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + log.info("所有数据解析完成!"); + } + + public List> getHeadList() { + return headList; + } + + public List getDataList() { + return dataList; + } +} \ No newline at end of file From e5f189be5cb845a90d3d4051eafd40b0875644c9 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 14:00:41 +0800 Subject: [PATCH 073/253] =?UTF-8?q?=E6=8D=A2=E4=B8=8B=E4=BD=8D=E7=BD=AE1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/result/HouseInfoDTO.java | 60 ++++++ .../epmet/feign/GovOrgOpenFeignClient.java | 7 +- .../GovOrgOpenFeignClientFallback.java | 6 + .../com/epmet/controller/HouseController.java | 16 +- .../main/java/com/epmet/dao/IcHouseDao.java | 8 +- .../java/com/epmet/service/HouseService.java | 5 +- .../epmet/service/impl/HouseServiceImpl.java | 9 +- .../src/main/resources/mapper/IcHouseDao.xml | 23 ++- .../epmet/dto/result/IcFormResColumnDTO.java | 18 ++ .../feign/OperCustomizeOpenFeignClient.java | 30 ++- .../OperCustomizeOpenFeignClientFallback.java | 17 ++ .../epmet/controller/IcFormController.java | 37 ++++ .../java/com/epmet/dao/IcFormItemDao.java | 26 +++ .../com/epmet/service/IcFormItemService.java | 8 + .../service/impl/IcFormItemServiceImpl.java | 21 ++- .../main/resources/mapper/IcFormItemDao.xml | 54 ++++++ .../epmet/dto/form/IcResiDetailFormDTO.java | 26 +++ .../epmet/dto/form/IcResiUserPageFormDTO.java | 38 ++++ .../epmet/dto/form/ResiUserQueryValueDTO.java | 20 ++ .../dto/result/IcResiUserPageResultDTO.java | 173 ++++++++++++++++++ .../java/com/epmet/constant/UserConstant.java | 4 + .../controller/IcResiUserController.java | 24 +++ .../java/com/epmet/dao/IcResiUserDao.java | 29 +++ .../com/epmet/service/IcResiUserService.java | 13 ++ .../service/impl/IcResiUserServiceImpl.java | 167 ++++++++++++++++- .../main/resources/mapper/IcResiUserDao.xml | 55 ++++++ 26 files changed, 869 insertions(+), 25 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseInfoDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcFormResColumnDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiDetailFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ResiUserQueryValueDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcResiUserPageResultDTO.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseInfoDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseInfoDTO.java new file mode 100644 index 0000000000..3221ee3647 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseInfoDTO.java @@ -0,0 +1,60 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/11/1 1:42 下午 + */ +@Data +public class HouseInfoDTO implements Serializable { + private static final long serialVersionUID = -419899682683323110L; + /** + * 所属家庭Id + */ + private String homeId; + + + /** + * 小区id + */ + private String neighborHoodId; + /** + * 小区名称 + */ + private String neighborHoodName; + + + /** + * 所属楼栋id + */ + private String buildingId; + /** + * 楼栋名称 + */ + private String buildingName; + + + /** + * 所属单元id + */ + private String buildingUnitId; + /** + * 单元名 + */ + private String unitName; + + + /** + * 门牌号 + */ + private String doorName; + + /** + * 房屋类型,1楼房,2平房,3别墅 + */ + private String houseType; +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index dbf264940b..df0707bedd 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -21,8 +21,8 @@ import java.util.Set; * @author yinzuomei@elink-cn.com * @date 2020/6/4 13:37 */ -//@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class, url = "localhost:8092") -@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class) +@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class, url = "localhost:8092") +//@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class) public interface GovOrgOpenFeignClient { /** @@ -450,4 +450,7 @@ public interface GovOrgOpenFeignClient { */ @PostMapping("/gov/org/grid/getbaseinfo") Result getGridBaseInfoByGridId(CustomerGridFormDTO customerGridFormDTO); + + @PostMapping(value = "/gov/org/house/queryListHouseInfo",consumes = MediaType.APPLICATION_JSON_VALUE) + Result> queryListHouseInfo(@RequestBody Set houseIds); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 8c66ac8787..98d3d64927 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -271,8 +271,14 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getGridBaseInfoByGridId", customerGridFormDTO); } + @Override + public Result> queryListHouseInfo(Set houseIds) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "queryListHouseInfo", houseIds); + } + @Override public Result selectPidsByGridId(String gridId) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectPidsByGridId", gridId); } + } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index 3e96997238..9f8f92188a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -20,37 +20,29 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.epmet.commons.tools.annotation.LoginUser; -import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; -import com.epmet.constant.NeighborhoodConstant; import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.HouseInfoDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; -import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcHouseExcel; -import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.service.HouseService; import com.epmet.service.NeighborHoodService; import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -165,4 +157,8 @@ public class HouseController { return new Result().ok("导入成功"); } + @PostMapping( "queryListHouseInfo") + Result> queryListHouseInfo(@RequestBody Set houseIds){ + return new Result>().ok(houseService.queryListHouseInfo(houseIds)); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java index e82789db12..fd07309c02 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java @@ -17,19 +17,17 @@ package com.epmet.dao; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.epmet.commons.mybatis.dao.BaseDao; -import com.epmet.entity.IcBuildingEntity; +import com.epmet.dto.result.HouseInfoDTO; import com.epmet.entity.IcHouseEntity; -import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.excel.IcHouseExcel; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; +import java.util.Set; /** * 房屋信息 @@ -52,4 +50,6 @@ public interface IcHouseDao extends BaseDao { @Param("house") IcHouseEntity house); List searchAllHouse(@Param("house") IcHouseEntity house); + + List queryHouseInfo(@Param("houseIdList") Set houseIdList); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java index 20978c60b2..5bd4a78b65 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java @@ -19,12 +19,13 @@ package com.epmet.service; import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.HouseInfoDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.excel.IcHouseExcel; -import com.epmet.excel.IcNeighborHoodExcel; import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.Set; /** * 小区表 @@ -51,4 +52,6 @@ public interface HouseService { IcNeighborHoodResultDTO listNeighborhood(ListIcNeighborHoodFormDTO formDTO); void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception; + + List queryListHouseInfo(Set houseIds); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index ce495c0ebc..77f621e2ac 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -13,6 +13,7 @@ import com.epmet.dto.IcBuildingUnitDTO; import com.epmet.dto.IcHouseDTO; import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.HouseInfoDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; @@ -223,5 +224,11 @@ public class HouseServiceImpl implements HouseService { return icHouseDao.searchHouseByPage(page,house); } - + @Override + public List queryListHouseInfo(Set houseIdList) { + if(org.apache.commons.collections4.CollectionUtils.isEmpty(houseIdList)){ + return new ArrayList<>(); + } + return icHouseDao.queryHouseInfo(houseIdList); + } } diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index 01764d05ad..370595a935 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -229,5 +229,26 @@ --> - + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcFormResColumnDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcFormResColumnDTO.java new file mode 100644 index 0000000000..52a3374449 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcFormResColumnDTO.java @@ -0,0 +1,18 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description 列表展示列返参结构 + * @Author yinzuomei + * @Date 2021/11/1 12:49 下午 + */ +@Data +public class IcFormResColumnDTO implements Serializable { + private String tableName; + private String columnName; + private String label; +} + diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 34d02086a4..49f166d0db 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -10,6 +10,7 @@ import com.epmet.dto.form.CustomerFunctionListFormDTO; import com.epmet.dto.result.CheckFloatFootBarResultDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.DefaultFunctionListResultDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; @@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; +import java.util.Set; /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 @@ -24,7 +26,8 @@ import java.util.List; * @author yinzuomei@elink-cn.com * @date 2020/6/4 13:16 */ -@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class) +@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class,url = "http://localhost:8089") +//@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class) public interface OperCustomizeOpenFeignClient { @PostMapping(value = "/oper/customize/customerfootbar/customerfootbars", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @@ -52,4 +55,29 @@ public interface OperCustomizeOpenFeignClient { */ @PostMapping(value = "/oper/customize/icform/getcustomerform", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) Result getCustomerForm(@RequestBody CustomerFormQueryDTO formDto); + + /** + * 返回用于列表展示的列 + * + * @param queryDTO + * @return com.epmet.commons.tools.utils.Result> + * @author yinzuomei + * @date 2021/11/1 12:53 下午 + */ + @PostMapping(value = "/oper/customize/icform/queryConditions", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + Result> queryConditions(@RequestBody CustomerFormQueryDTO queryDTO); + + /** + * 构造出所有的子表连接语句格式:left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') + * + * @param queryDTO + * @return com.epmet.commons.tools.utils.Result> + * @author yinzuomei + * @date 2021/11/1 1:07 下午 + */ + @PostMapping(value = "/oper/customize/icform/querySubTables", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + Result> querySubTables(@RequestBody CustomerFormQueryDTO queryDTO); + + @PostMapping(value = "/oper/customize/icform/queryIcResiSubTables", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + Result> queryIcResiSubTables(@RequestBody CustomerFormQueryDTO queryDTO); } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 8b8bda2a13..8a300aeb19 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -11,9 +11,11 @@ import com.epmet.dto.form.CustomerFunctionListFormDTO; import com.epmet.dto.result.CheckFloatFootBarResultDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.DefaultFunctionListResultDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.feign.OperCustomizeOpenFeignClient; import java.util.List; +import java.util.Set; /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 @@ -55,4 +57,19 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result getCustomerForm(CustomerFormQueryDTO formDto) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getCustomerForm", formDto); } + + @Override + public Result> queryConditions(CustomerFormQueryDTO formDto) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "queryConditions", formDto); + } + + @Override + public Result> querySubTables(CustomerFormQueryDTO formDto) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "querySubTables", formDto); + } + + @Override + public Result> queryIcResiSubTables(CustomerFormQueryDTO queryDTO) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "queryIcResiSubTables", queryDTO); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index d3fdcc532c..5443b382a8 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -31,6 +31,7 @@ import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.ConditionResultDTO; import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.excel.IcFormExcel; import com.epmet.service.IcFormItemService; @@ -42,6 +43,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; +import java.util.Set; /** @@ -142,4 +144,39 @@ public class IcFormController { ValidatorUtils.validateEntity(formDto,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result>().ok(icFormItemService.queryTableHeaderList(formDto)); } + + + /** + * feigin:返回用于列表展示的列 + * + * @param formQueryDTO + * @return com.epmet.commons.tools.utils.Result> + * @author yinzuomei + * @date 2021/11/1 12:54 下午 + */ + @PostMapping(value = "queryConditions") + Result> queryConditions(@RequestBody CustomerFormQueryDTO formQueryDTO) { + ValidatorUtils.validateEntity(formQueryDTO,CustomerFormQueryDTO.AddUserInternalGroup.class); + return new Result>().ok(icFormItemService.queryConditions(formQueryDTO.getCustomerId(),formQueryDTO.getFormCode())); + } + + /** + * 构造出所有子表关联语句 + * + * @param formQueryDTO + * @return com.epmet.commons.tools.utils.Result> + * @author yinzuomei + * @date 2021/11/1 1:25 下午 + */ + @PostMapping(value = "querySubTables") + Result> querySubTables(@RequestBody CustomerFormQueryDTO formQueryDTO){ + ValidatorUtils.validateEntity(formQueryDTO,CustomerFormQueryDTO.AddUserInternalGroup.class); + return new Result>().ok(icFormItemService.querySubTables(formQueryDTO.getCustomerId(),formQueryDTO.getFormCode())); + } + + @PostMapping(value = "queryIcResiSubTables") + Result> queryIcResiSubTables(@RequestBody CustomerFormQueryDTO queryDTO){ + ValidatorUtils.validateEntity(queryDTO,CustomerFormQueryDTO.AddUserInternalGroup.class); + return new Result>().ok(icFormItemService.queryIcResiSubTables(queryDTO.getCustomerId(),queryDTO.getFormCode())); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java index befdc98c06..b07c41ef84 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java @@ -19,12 +19,14 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.result.ConditionResultDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.entity.IcFormItemEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Set; /** * 表单项 @@ -38,4 +40,28 @@ public interface IcFormItemDao extends BaseDao { List selectConditionList(@Param("customerId") String customerId, @Param("formCode") String formCode); List queryTableHeaderList(@Param("customerId") String customerId, @Param("formCode") String formCode); + + /** + * 返回用于列表展示的列有哪些:table.列名 + * + * @param customerId + * @param formCode + * @return java.util.List + * @author yinzuomei + * @date 2021/11/1 12:58 下午 + */ + List queryConditions(@Param("customerId") String customerId, @Param("formCode")String formCode); + + /** + * 构造出所有子表关联语句 + * + * @param customerId + * @param formCode + * @return java.util.List + * @author yinzuomei + * @date 2021/11/1 1:25 下午 + */ + List querySubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); + + Set queryIcResiSubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java index 9a5ce5c9a6..15967aef43 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java @@ -22,11 +22,13 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormItemDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.ConditionResultDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.entity.IcFormItemEntity; import java.util.List; import java.util.Map; +import java.util.Set; /** * 表单项 @@ -107,4 +109,10 @@ public interface IcFormItemService extends BaseService { List queryConditionList(CustomerFormQueryDTO formDto); List queryTableHeaderList(CustomerFormQueryDTO formDto); + + List queryConditions(String customerId,String formCode); + + List querySubTables(String customerId, String formCode); + + Set queryIcResiSubTables(String customerId, String formCode); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java index 1c62d14ed7..c79d2e8fa0 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java @@ -28,6 +28,7 @@ import com.epmet.dao.IcFormItemDao; import com.epmet.dto.IcFormItemDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.ConditionResultDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; import com.epmet.entity.IcFormItemEntity; import com.epmet.service.IcFormItemService; @@ -36,10 +37,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 表单项 @@ -140,4 +138,19 @@ public class IcFormItemServiceImpl extends BaseServiceImpl queryConditions(String customerId,String formCode) { + return baseDao.queryConditions(customerId,formCode); + } + + @Override + public List querySubTables(String customerId, String formCode) { + return baseDao.querySubTables(customerId,formCode); + } + + @Override + public Set queryIcResiSubTables(String customerId, String formCode) { + return baseDao.queryIcResiSubTables(customerId,formCode); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index e369303a80..e8e67a4ba3 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -87,4 +87,58 @@ and m.CUSTOMER_ID=#{customerId} order by m.SORT asc + + + + + + + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiDetailFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiDetailFormDTO.java new file mode 100644 index 0000000000..72518091bd --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiDetailFormDTO.java @@ -0,0 +1,26 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 查看详情,回显表单 + * @Author yinzuomei + * @Date 2021/10/27 10:22 下午 + */ +@Data +public class IcResiDetailFormDTO implements Serializable { + public interface AddUserInternalGroup { + } + @NotBlank(message = "icResiUserId不能为空",groups = AddUserInternalGroup.class) + private String icResiUserId; + + @NotBlank(message = "formCode不能为空", groups = AddUserInternalGroup.class) + private String formCode; + + @NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class) + private String customerId; +} + diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java new file mode 100644 index 0000000000..44eb3bf105 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java @@ -0,0 +1,38 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * @Description 居民信息,分页查询入参 + * @Author yinzuomei + * @Date 2021/10/27 2:06 下午 + */ +@Data +public class IcResiUserPageFormDTO implements Serializable { + public interface AddUserInternalGroup { + } + + @NotNull(message = "pageNo不能为空", groups = AddUserInternalGroup.class) + private Integer pageNo; + + @NotNull(message = "pageSize不能为空", groups = AddUserInternalGroup.class) + private Integer pageSize; + + @NotBlank(message = "formCode不能为空", groups = AddUserInternalGroup.class) + private String formCode; + + @NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class) + private String customerId; + + /** + * 表对应的字段及值 + */ + private List conditions; + private Boolean pageFlag; +} + diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ResiUserQueryValueDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ResiUserQueryValueDTO.java new file mode 100644 index 0000000000..cc654145c8 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ResiUserQueryValueDTO.java @@ -0,0 +1,20 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/10/27 6:02 下午 + */ +@Data +public class ResiUserQueryValueDTO implements Serializable { + private String queryType; + private List columnValue; + private String columnName; + private String tableName; +} + diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcResiUserPageResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcResiUserPageResultDTO.java new file mode 100644 index 0000000000..0c5f5ab0bf --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcResiUserPageResultDTO.java @@ -0,0 +1,173 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description TODO + * @Author yinzuomei + * @Date 2021/11/1 10:34 上午 + */ +@Data +public class IcResiUserPageResultDTO implements Serializable { + private static final long serialVersionUID = 5621052927788129250L; + private String icResiUserId; + private String gridId; + private String gridName; + /** + * 所属小区ID + */ + private String villageId; + private String vallageName; + + + /** + * 所属楼宇Id + */ + private String buildId; + private String buildName; + + /** + * 单元id + */ + private String unitId; + private String unitName; + + /** + * 所属家庭Id + */ + private String homeId; + private String homeName; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String mobile; + + /** + * 性别 + */ + private String gender; + + /** + * 身份证号 + */ + private String idCard; + + /** + * 出生日期 + */ + private String birthday; + + /** + * 备注 + */ + private String remarks; + + /** + * 是否党员 + */ + private Boolean isParty; + + /** + * 是否低保户 + */ + private Boolean isDbh; + + /** + * 是否保障房 + */ + private Boolean isEnsureHouse; + + /** + * 是否失业 + */ + private Boolean isUnemployed; + + /** + * 是否育龄妇女 + */ + private Boolean isYlfn; + + /** + * 是否退役军人 + */ + private Boolean isVeterans; + + /** + * 是否统战人员 + */ + private Boolean isUnitedFront; + + /** + * 是否信访人员 + */ + private Boolean isXfry; + + /** + * 是否志愿者 + */ + private Boolean isVolunteer; + + /** + * 是否老年人 + */ + private Boolean isOldPeople; + + /** + * 是否空巢 + */ + private Boolean isKc; + + /** + * 是否失独 + */ + private Boolean isSd; + + /** + * 是否失能 + */ + private Boolean isSn; + + /** + * 是否失智 + */ + private Boolean isSz; + + /** + * 是否残疾 + */ + private Boolean isCj; + + /** + * 是否大病 + */ + private Boolean isDb; + + /** + * 是否慢病 + */ + private Boolean isMb; + + /** + * 是否特殊人群 + */ + private Boolean isSpecial; + + + // 以下属性都需要单独处理,不是直接取数据库的字段 + private String demandCategoryIds; + + private String demandName; + + /** + * 房屋类型,1楼房,2平房,3别墅 + */ + private String houseType;} + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java index 1e91d3cb14..69046a3f84 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java @@ -97,4 +97,8 @@ public interface UserConstant { * 先生/女士 */ String MAN_WOMAN = "先生/女士"; + + String GRID_ID="GRID_ID"; + String GENDER="GENDER"; + String HOUSE_TYPE_KEY="HOUSE_TYPE"; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 753b3e5fe4..e00e092d1b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -36,7 +36,9 @@ import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; +import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; import com.epmet.dto.result.FormItem; @@ -279,4 +281,26 @@ public class IcResiUserController { everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); } + @PostMapping("listresi") + public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ + //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + pageFormDTO.setCustomerId(tokenDto.getCustomerId()); + ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); + return new Result>>().ok(icResiUserService.pageResiMap(pageFormDTO)); + } + /** + * 编辑页面,显示居民信息详情 + * + * @param pageFormDTO + * @return com.epmet.commons.tools.utils.Result + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ + @PostMapping("detail") + public Result queryIcResiDetail(@LoginUser TokenDto tokenDto,@RequestBody IcResiDetailFormDTO pageFormDTO){ + //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + pageFormDTO.setCustomerId(tokenDto.getCustomerId()); + ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); + return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 3ddc71fec4..ab959cb80a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -18,10 +18,13 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.form.ResiUserQueryValueDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.entity.IcResiUserEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; import java.util.Map; /** @@ -44,4 +47,30 @@ public interface IcResiUserDao extends BaseDao { * @Description 更新或新增居民信息各表数据 **/ void upTable(@Param("tableName") String tableName, @Param("id") String id, @Param("map") Map map); + + List> selectListResiMap(@Param("customerId") String customerId, + @Param("formCode") String formCode, + @Param("conditions") List conditions, + @Param("resultColumns") List resultColumns, + @Param("subTables") List subTables); + /** + * 查询主表 + * + * @param icResiUserId + * @return java.util.List> + * @author yinzuomei + * @date 2021/10/28 11:20 上午 + */ + List> selectListMapById(String icResiUserId); + + /** + * 根据ic_resi_user.id去查询各个子表记录,动态传入表名 + * + * @param icResiUserId + * @param tableName + * @return java.util.List> + * @author yinzuomei + * @date 2021/10/28 11:19 上午 + */ + List> selectSubTableRecords(@Param("icResiUserId") String icResiUserId,@Param("tableName") String tableName); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index fe66ec72e6..e1e7713c61 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -21,7 +21,9 @@ import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; +import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.entity.IcResiUserEntity; import java.util.List; @@ -106,4 +108,15 @@ public interface IcResiUserService extends BaseService { * @Description 党建互联平台--修改居民信息 **/ void edit(TokenDto tokenDto, List formDTO); + + PageData> pageResiMap(IcResiUserPageFormDTO formDTO); + /** + * 编辑页面,显示居民信息详情 + * + * @param pageFormDTO + * @return java.util.Map + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ + Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 9ca0788099..b3a0ba0439 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -17,33 +17,50 @@ package com.epmet.service.impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.enums.GenderEnum; +import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; +import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.result.AllGridsByUserIdResultDTO; +import com.epmet.dto.result.HouseInfoDTO; +import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.entity.IcResiUserEntity; import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.redis.IcResiUserRedis; import com.epmet.service.IcResiUserService; -import oracle.sql.NUMBER; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 用户基础信息 @@ -51,6 +68,7 @@ import java.util.*; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-26 */ +@Slf4j @Service public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService { private Logger logger = LogManager.getLogger(IcResiUserServiceImpl.class); @@ -58,6 +76,10 @@ public class IcResiUserServiceImpl extends BaseServiceImpl page(Map params) { @@ -216,4 +238,147 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> pageResiMap(IcResiUserPageFormDTO formDTO) { + // 查询列表展示项,如果没有,直接返回 + CustomerFormQueryDTO queryDTO1=new CustomerFormQueryDTO(); + queryDTO1.setCustomerId(formDTO.getCustomerId()); + queryDTO1.setFormCode(queryDTO1.getFormCode()); + Result> resultColumnRes=operCustomizeOpenFeignClient.queryConditions(queryDTO1); + if (!resultColumnRes.success() || CollectionUtils.isEmpty(resultColumnRes.getData())) { + log.warn("没有配置列表展示列"); + return new PageData(new ArrayList(), NumConstant.ZERO); + } + List resultColumns = resultColumnRes.getData(); + // 查询列表展示项需要用到哪些子表 + Result> subTablesRes=operCustomizeOpenFeignClient.querySubTables(queryDTO1); + List subTables =subTablesRes.getData(); + PageInfo> pageInfo=new PageInfo<>(); + if (null == formDTO.getPageFlag()||formDTO.getPageFlag()) { + //分页 + pageInfo= PageHelper.startPage(formDTO.getPageNo(), + formDTO.getPageSize()).doSelectPageInfo(() -> baseDao.selectListResiMap(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + resultColumns, + subTables)); + }else{ + List> list=baseDao.selectListResiMap(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + resultColumns, + subTables); + pageInfo.setTotal(CollectionUtils.isEmpty(list)?NumConstant.ZERO:list.size()); + pageInfo.setList(list); + } + + List> list = pageInfo.getList(); + //查询网格名称 + List gridIds = new ArrayList<>(); + Set houseIds = new HashSet<>(); + for (Map map : list) { + log.warn(JSON.toJSONString(map)); + if (map.containsKey(UserConstant.GRID_ID) && null != map.get(UserConstant.GRID_ID) && StringUtils.isNotBlank(map.get(UserConstant.GRID_ID).toString())) { + gridIds.add(map.get(UserConstant.GRID_ID).toString()); + } + if (map.containsKey("HOME_ID") && null != map.get("HOME_ID") && StringUtils.isNotBlank(map.get("HOME_ID").toString())) { + houseIds.add(map.get("HOME_ID").toString()); + } + } + Result> gridInfoRes=govOrgOpenFeignClient.getGridListByGridIds(gridIds); + List gridInfoList = gridInfoRes.success() && !CollectionUtils.isEmpty(gridInfoRes.getData()) ? gridInfoRes.getData() : new ArrayList<>(); + Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(AllGridsByUserIdResultDTO::getGridId, Function.identity())); + + //查询房子名称 + Result> houseInfoRes=govOrgOpenFeignClient.queryListHouseInfo(houseIds); + List houseInfoDTOList = houseInfoRes.success() && !CollectionUtils.isEmpty(houseInfoRes.getData()) ? houseInfoRes.getData() : new ArrayList<>(); + Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); + for (Map resultMap : list) { + String gridIdValue = null != resultMap.get(UserConstant.GRID_ID) ? resultMap.get(UserConstant.GRID_ID).toString() : StrConstant.EPMETY_STR; + resultMap.put("GRID_ID_VALUE", gridIdValue); + if (null != gridInfoMap && gridInfoMap.containsKey(gridIdValue) && null != gridInfoMap.get(gridIdValue)) { + //GRID_NAME + resultMap.put(UserConstant.GRID_ID, gridInfoMap.get(gridIdValue).getGridName()); + } + + String homeId = null != resultMap.get("HOME_ID") ? resultMap.get("HOME_ID").toString() : StrConstant.EPMETY_STR; + resultMap.put("HOME_ID_VALUE", homeId); + if (null != houseInfoMap && houseInfoMap.containsKey(homeId) && null != houseInfoMap.get(homeId)) { + HouseInfoDTO houseInfoDTO = houseInfoMap.get(homeId); + String buildName = StringUtils.isNotBlank(houseInfoDTO.getBuildingName()) ? houseInfoDTO.getBuildingName() : StrConstant.EPMETY_STR; + resultMap.put("BUILD_NAME", buildName); + + String neighBorName = StringUtils.isNotBlank(houseInfoDTO.getNeighborHoodName()) ? houseInfoDTO.getNeighborHoodName() : StrConstant.EPMETY_STR; + resultMap.put("VILLAGE_NAME", neighBorName); + + String unitName = StringUtils.isNotBlank(houseInfoDTO.getUnitName()) ? houseInfoDTO.getUnitName() : StrConstant.EPMETY_STR; + resultMap.put("UNIT_NAME", unitName); + + String doorName = StringUtils.isNotBlank(houseInfoDTO.getDoorName()) ? houseInfoDTO.getDoorName() : StrConstant.EPMETY_STR; + resultMap.put("DOOR_NAME", doorName); + + String houseType = StringUtils.isNotBlank(houseInfoDTO.getHouseType()) ? houseInfoDTO.getHouseType() : StrConstant.EPMETY_STR; + //房屋类型,1楼房,2平房,3别墅 + resultMap.put(UserConstant.HOUSE_TYPE_KEY, ""); + if (HouseTypeEnum.LOUFANG.getCode().equals(houseType)) { + resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.LOUFANG.getName()); + } else if (HouseTypeEnum.PINGFANG.getCode().equals(houseType)) { + resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.PINGFANG.getName()); + } else if (HouseTypeEnum.BIESHU.getCode().equals(houseType)) { + resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.BIESHU.getName()); + } + + resultMap.put("HOME_ID", neighBorName.concat(buildName).concat(unitName).concat(doorName)); + } + + if (resultMap.containsKey(UserConstant.GENDER)) { + String genderValue = null != resultMap.get(UserConstant.GENDER) ? resultMap.get(UserConstant.GENDER).toString() : StrConstant.EPMETY_STR; + if (GenderEnum.MAN.getCode().equals(genderValue)) { + resultMap.put(UserConstant.GENDER, GenderEnum.MAN.getName()); + } else if (GenderEnum.WOMAN.getCode().equals(genderValue)) { + resultMap.put(UserConstant.GENDER, GenderEnum.WOMAN.getName()); + } else if (GenderEnum.UN_KNOWN.getCode().equals(genderValue)) { + resultMap.put(UserConstant.GENDER, GenderEnum.UN_KNOWN.getName()); + } + } + } + pageInfo.setList(list); + return new PageData<>(pageInfo.getList(), pageInfo.getTotal()); + } + + /** + * 编辑页面,显示居民信息详情 + * + * @param pageFormDTO + * @return java.util.Map + * @author yinzuomei + * @date 2021/10/28 10:29 上午 + */ + @Override + public Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO) { + Map resultMap = new HashMap(); + // 先查询主表,主表没有记录,直接返回空 + List> icResiUserMapList = baseDao.selectListMapById(pageFormDTO.getIcResiUserId()); + if (CollectionUtils.isEmpty(icResiUserMapList)) { + return new HashMap(); + } + resultMap.put("ic_resi_user", icResiUserMapList); + CustomerFormQueryDTO queryDTO=ConvertUtils.sourceToTarget(pageFormDTO,CustomerFormQueryDTO.class); + //循环查询每个子表的记录 + Result> subTableRes=operCustomizeOpenFeignClient.queryIcResiSubTables(queryDTO); + if(subTableRes.success()&&!CollectionUtils.isEmpty(subTableRes.getData())){ + for (String subTalbeName : subTableRes.getData()) { + List> list = baseDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(), subTalbeName); + if (!CollectionUtils.isEmpty(list)) { + resultMap.put(subTalbeName, list); + } + //else{ + // resultMap.put(subTalbeName,new ArrayList<>()); + //} + } + } + return resultMap; + } } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index a80df030b9..c3d73a3fe1 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -35,4 +35,59 @@ WHERE id = #{id} + + + + + + + \ No newline at end of file From 36754d8f996b5285580e5c02f4ffc6c5b5aa2a9b Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 14:04:00 +0800 Subject: [PATCH 074/253] =?UTF-8?q?=E6=8D=A2=E4=B8=8B=E4=BD=8D=E7=BD=AE2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java | 4 ++-- .../java/com/epmet/feign/OperCustomizeOpenFeignClient.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index df0707bedd..8abaab3de7 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -21,8 +21,8 @@ import java.util.Set; * @author yinzuomei@elink-cn.com * @date 2020/6/4 13:37 */ -@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class, url = "localhost:8092") -//@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class) +//@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class, url = "localhost:8092") +@FeignClient(name = ServiceConstant.GOV_ORG_SERVER, fallbackFactory = GovOrgOpenFeignClientFallbackFactory.class) public interface GovOrgOpenFeignClient { /** diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 49f166d0db..5a02a97f13 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -26,8 +26,8 @@ import java.util.Set; * @author yinzuomei@elink-cn.com * @date 2020/6/4 13:16 */ -@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class,url = "http://localhost:8089") -//@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class) +//@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class,url = "http://localhost:8089") +@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class) public interface OperCustomizeOpenFeignClient { @PostMapping(value = "/oper/customize/customerfootbar/customerfootbars", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) From 11cbc73d92afbcafb1c031001906e0c00972d984 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 14:05:41 +0800 Subject: [PATCH 075/253] =?UTF-8?q?=E6=8D=A2=E4=B8=8B=E4=BD=8D=E7=BD=AE3qu?= =?UTF-8?q?chulink?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java | 1 - .../resources/mapper/opercustomize/CustomerFootBarDao.xml | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java index 2679aa595b..9ea3d41328 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/IcFormResColumnDTO.java @@ -12,6 +12,5 @@ public class IcFormResColumnDTO { private String tableName; private String columnName; private String label; - private String link; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml index 4d83d75057..11a8d52f7c 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml @@ -43,14 +43,12 @@ select temp.table_name, concat(temp.table_name,'.',temp.columnName) as columnName, - temp.LABEL, - temp.link + temp.LABEL from ( SELECT ( CASE WHEN M.ITEM_GROUP_ID = '0' THEN 'ic_resi_user' ELSE g.TABLE_NAME END ) AS table_name, m.COLUMN_NAME AS columnName, - m.LABEL, - g.link + m.LABEL FROM ic_form_item m LEFT JOIN ic_form_item_group g ON ( m.ITEM_GROUP_ID = g.id ) From 148b0e15ad7cb2120aa6b6e73b7e92e1618cead5 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 14:50:33 +0800 Subject: [PATCH 076/253] =?UTF-8?q?=E6=8D=A2=E4=B8=8B=E4=BD=8D=E7=BD=AE4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/service/impl/IcResiUserServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index b3a0ba0439..d212421d81 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -245,7 +245,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> resultColumnRes=operCustomizeOpenFeignClient.queryConditions(queryDTO1); if (!resultColumnRes.success() || CollectionUtils.isEmpty(resultColumnRes.getData())) { log.warn("没有配置列表展示列"); From 7dc2b0a5f5213bb075d399664c1bd86307af82bd Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 1 Nov 2021 15:24:46 +0800 Subject: [PATCH 077/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E4=B8=AA=E4=BA=BA-=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=88=BF=E9=97=B4=E5=8F=B7=E6=9F=A5=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/result/HomeUserResultDTO.java | 17 ++++++++++ .../controller/IcResiUserController.java | 13 +++++++ .../com/epmet/service/IcResiUserService.java | 10 ++++++ .../service/impl/IcResiUserServiceImpl.java | 34 ++++++++++++++++++- 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/HomeUserResultDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/HomeUserResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/HomeUserResultDTO.java new file mode 100644 index 0000000000..7eefb194b4 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/HomeUserResultDTO.java @@ -0,0 +1,17 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/11/1 10:47 + */ +@Data +public class HomeUserResultDTO implements Serializable { + private static final long serialVersionUID = -8441112171986914418L; + private String userId; + private String name; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index e00e092d1b..4cfeac7dcc 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -42,6 +42,7 @@ import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; @@ -281,6 +282,18 @@ public class IcResiUserController { everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); } + /** + * @Description 根据房间号查人 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/11/1 11:04 + */ + @PostMapping("getpeoplebyroom") + public Result> getPeopleByRoom(@RequestBody IcResiUserDTO formDTO) { + return new Result>().ok(icResiUserService.getPeopleByRoom(formDTO.getHomeId())); + } + @PostMapping("listresi") public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index e1e7713c61..f6a2552a92 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -23,6 +23,7 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; +import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.entity.IcResiUserEntity; @@ -109,6 +110,15 @@ public interface IcResiUserService extends BaseService { **/ void edit(TokenDto tokenDto, List formDTO); + /** + * @Description 获取房间内人员 + * @Param homeId + * @Return {@link List< HomeUserResultDTO>} + * @Author zhaoqifeng + * @Date 2021/11/1 10:52 + */ + List getPeopleByRoom(String homeId); + PageData> pageResiMap(IcResiUserPageFormDTO formDTO); /** * 编辑页面,显示居民信息详情 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index d212421d81..49c233356f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -18,6 +18,7 @@ package com.epmet.service.impl; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; @@ -40,6 +41,7 @@ import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.dto.result.AllGridsByUserIdResultDTO; +import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.dto.result.HouseInfoDTO; import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.entity.IcResiUserEntity; @@ -50,13 +52,13 @@ import com.epmet.service.IcResiUserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import java.util.*; import java.util.function.Function; @@ -238,9 +240,39 @@ public class IcResiUserServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/11/1 10:52 + */ + @Override + public List getPeopleByRoom(String homeId) { + if(StringUtils.isBlank(homeId)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcResiUserEntity::getHomeId, homeId); + wrapper.orderByAsc(IcResiUserEntity::getYhzgx); + List list = baseDao.selectList(wrapper); + + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + return list.stream().map(item -> { + HomeUserResultDTO dto = new HomeUserResultDTO(); + dto.setUserId(item.getId()); + dto.setName(item.getName()); + return dto; + }).collect(Collectors.toList()); + } + + @Override public PageData> pageResiMap(IcResiUserPageFormDTO formDTO) { // 查询列表展示项,如果没有,直接返回 CustomerFormQueryDTO queryDTO1=new CustomerFormQueryDTO(); From db6f19fdcae1d505f6d254e43335cef8d27a7400 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 1 Nov 2021 15:49:22 +0800 Subject: [PATCH 078/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index e00e092d1b..f1100c3901 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -46,7 +46,6 @@ import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.ss.usermodel.Name; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -152,14 +151,15 @@ public class IcResiUserController { for (Map.Entry> entry : sheetHeaderMap.entrySet()) { String sheetName = entry.getKey(); List headers = entry.getValue(); - ExportParams exportParams = new ExportParams(); - exportParams.setSheetName(sheetName); - exportParams.setAutoSize(true); - new ExcelExportService().createSheetForMap(workbook, exportParams, headers,new ArrayList<>()); + System.out.println("headers:"+sheetName+JSON.toJSONString(headers)); + ExportParams exportParams = new ExportParams(null,sheetName); + //exportParams.setAutoSize(true); + List> dataSet = new ArrayList<>(); + HashMap map = new HashMap<>(); + map.put("1","2"); + dataSet.add(map); + new ExcelExportService().createSheetForMap(workbook, exportParams, headers, dataSet); } - List allNames = workbook.getAllNames(); - System.out.println("======"+allNames); - FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); workbook.write(fos); @@ -176,38 +176,38 @@ public class IcResiUserController { Map> everySheetHeaderMap = new LinkedHashMap<>(); List firstSheetHeaderList = new ArrayList<>(); + //Map groupNameMap = groupList.stream().collect(Collectors.toMap(FormGroupDTO::getGroupId,FormGroupDTO::getLabel)); itemList.forEach(item->{ if (StringUtils.isBlank(item.getColumnName())){ return; } - ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum())),30); - header.setNeedMerge(true); if (item.getChildGroup() == null){ - System.out.println(item.getLabel()); + ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum())),30); + header.setNeedMerge(true); firstSheetHeaderList.add(header); return; } everySheetHeaderMap.putIfAbsent(resultForm.getData().getFormName(),firstSheetHeaderList); + //这些是动态的 formGroup if (item.getChildGroup() != null){ //baseTableName单独的一个sheet System.out.println("childGroup:"+item.getLabel()); if (BASE_TABLE_NAME.equals(item.getTableName())){ - header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); - header.setNeedMerge(true); + // header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); + //header.setNeedMerge(true); List otherSheetHeaderList = new ArrayList<>(); - List secondHeaderList = new ArrayList<>(); //这里是设置除基础信息之外的sheet的表头 item.getChildGroup().getItemList().forEach(item2->{ if (!BASE_TABLE_NAME.equals(item2.getTableName())){ - everySheetHeaderMap.putIfAbsent(item.getLabel(),otherSheetHeaderList); } ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); - secondHeader.setNeedMerge(true); - secondHeaderList.add(secondHeader); - if (!item2.getItemType().equals("radio") && com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(item2.getOptions())){ + + otherSheetHeaderList.add(secondHeader); + if (!"radio".equals(item2.getItemType()) && CollectionUtils.isNotEmpty(item2.getOptions())){ + secondHeader.setNeedMerge(true); List thirdHeaderList = new ArrayList<>(); item2.getOptions().forEach(child->{ ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); @@ -217,18 +217,16 @@ public class IcResiUserController { } }); - header.setList(secondHeaderList); - otherSheetHeaderList.add(header); + //header.setList(secondHeaderList); + //otherSheetHeaderList.add(header); } } }); - //List firstSheetHeaderList = new ArrayList<>(); groupList.forEach(item->{ /* if (!"兴趣爱好".equals(item.getLabel()) && !"宗教信仰".equals(item.getLabel())){ return; }*/ - if (!BASE_TABLE_NAME.equals(item.getTableName())){ - System.out.println(item.getLabel()+"--"+item.getTableName()); + if (!BASE_TABLE_NAME.equals(item.getTableName())){ return; } ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getTableName()); From 2b7422da3347acefea79b26fe102425f2693a12b Mon Sep 17 00:00:00 2001 From: lzh Date: Mon, 1 Nov 2021 15:50:16 +0800 Subject: [PATCH 079/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=EF=BC=8C=E6=A5=BC?= =?UTF-8?q?=E5=AE=87=EF=BC=8C=E6=88=BF=E5=B1=8B=E7=AE=A1=E7=90=86=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=EF=BC=8C=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=EF=BC=8C=E5=AF=BC=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/BuildingTreeLevelDTO.java | 3 + .../com/epmet/dto/form/IcBulidingFormDTO.java | 5 +- .../com/epmet/dto/form/IcHouseFormDTO.java | 2 +- .../dto/result/IcNeighborHoodResultDTO.java | 4 +- .../com/epmet/enums/BuildingTypeEnums.java | 57 +++++++++++++++++ .../com/epmet/enums/HousePurposeEnums.java | 59 ++++++++++++++++++ .../com/epmet/enums/HouseRentFlagEnums.java | 58 +++++++++++++++++ .../java/com/epmet/enums/HouseTypeEnums.java | 54 ++++++++++++++++ .../epmet/controller/BuildingController.java | 15 +++++ .../java/com/epmet/excel/IcBuildingExcel.java | 4 ++ .../service/impl/BuildingServiceImpl.java | 35 +++++++++-- .../epmet/service/impl/HouseServiceImpl.java | 30 ++++++--- .../service/impl/NeighborHoodServiceImpl.java | 2 +- .../main/resources/excel/building_export.xlsx | Bin 12531 -> 12629 bytes .../resources/excel/building_template.xlsx | Bin 11756 -> 12353 bytes .../main/resources/excel/house_template.xlsx | Bin 11445 -> 11451 bytes .../main/resources/mapper/IcBuildingDao.xml | 16 ++--- .../src/main/resources/mapper/IcHouseDao.xml | 19 +++--- 18 files changed, 327 insertions(+), 36 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/BuildingTypeEnums.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HousePurposeEnums.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseRentFlagEnums.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseTypeEnums.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/BuildingTreeLevelDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/BuildingTreeLevelDTO.java index 3d7da25047..4ffa533faf 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/BuildingTreeLevelDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/BuildingTreeLevelDTO.java @@ -47,6 +47,9 @@ public class BuildingTreeLevelDTO implements Serializable { private List children; + private String longitude; + private String latitude; + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java index 592c5a4776..8ce4e063b9 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java @@ -42,14 +42,14 @@ public class IcBulidingFormDTO implements Serializable { /** * 组织id */ - @NotBlank(message = "组织id不能为空", groups = {AddGroup.class}) + @NotBlank(message = "组织id不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String agencyId; /** * 网格id */ - + @NotBlank(message = "网格不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String gridId; @@ -69,6 +69,7 @@ public class IcBulidingFormDTO implements Serializable { /** * 楼栋类型 */ + @NotBlank(message = "楼栋类型不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String type=""; /** diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java index 2f28b22eee..cb557aa572 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcHouseFormDTO.java @@ -45,7 +45,7 @@ public class IcHouseFormDTO implements Serializable { @NotBlank(message = "小区id不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String neighborHoodId; - @NotBlank(message = "所属楼栋ID不能为空", groups = { UpdateGroup.class}) + @NotBlank(message = "所属楼栋ID不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String buildingId; /** diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java index ca53315d02..51b410eaa5 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/IcNeighborHoodResultDTO.java @@ -1,6 +1,5 @@ package com.epmet.dto.result; -import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; @@ -20,7 +19,8 @@ public class IcNeighborHoodResultDTO implements Serializable { /** * 总条数 * */ - private Long total; + + private Integer total; // /** // * 数据类型【小区:neighbourHood,楼栋:building,房屋:house】 diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/BuildingTypeEnums.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/BuildingTypeEnums.java new file mode 100644 index 0000000000..f1d636a571 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/BuildingTypeEnums.java @@ -0,0 +1,57 @@ +package com.epmet.enums; + +import org.springframework.util.StringUtils; + +public enum BuildingTypeEnums { + SPF("1","商品房"), + ZJF("2","自建房"), + BS("3","别墅"); + + private String key; + private String value; + + BuildingTypeEnums(String key, String value) { + this.key = key; + this.value=value; + } + + + public static String getTypeValue(Object key){ + if(null == key){ + return null; + } + BuildingTypeEnums buildingTypeEnums = getBuildType(String.valueOf(key)); + return buildingTypeEnums == null ? null : buildingTypeEnums.getValue(); + } + + + public static String getKeyByValue(String value){ + if(StringUtils.isEmpty(value)){ + return ""; + } + for (BuildingTypeEnums e : BuildingTypeEnums.values()) { + if (e.getValue().equals(value)) { + return e.getKey(); + } + } + return ""; + } + + + private static BuildingTypeEnums getBuildType(String key) { + for (BuildingTypeEnums b :BuildingTypeEnums.values()) { + if (b.getKey().equals(key)) { + return b; + } + } + return null; + } + + public String getValue() { + return value; + } + + public String getKey() { + return key; + } +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HousePurposeEnums.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HousePurposeEnums.java new file mode 100644 index 0000000000..e1a2a14869 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HousePurposeEnums.java @@ -0,0 +1,59 @@ +package com.epmet.enums; + +import org.springframework.util.StringUtils; + +public enum HousePurposeEnums { + ZZ("1","住宅"), + SY("2","商业"), + BG("3","办公"), + GY("4","工业"), + CC("5","仓储"), + SZHY("6","商住混用"), + QT("7","其他"); + + + private String key; + private String value; + + HousePurposeEnums(String key, String value) { + this.key = key; + this.value=value; + } + + public static String getKeyByValue(String value){ + if(StringUtils.isEmpty(value)){ + return ""; + } + for (HousePurposeEnums e : HousePurposeEnums.values()) { + if (e.getValue().equals(value)) { + return e.getKey(); + } + } + return ""; + } + + public static String getTypeValue(Object key){ + if(null == key){ + return null; + } + HousePurposeEnums buildingTypeEnums = getValueByKey(String.valueOf(key)); + return buildingTypeEnums == null ? null : buildingTypeEnums.getValue(); + } + + private static HousePurposeEnums getValueByKey(String key) { + for (HousePurposeEnums b : HousePurposeEnums.values()) { + if (b.getKey().equals(key)) { + return b; + } + } + return null; + } + + public String getValue() { + return value; + } + + public String getKey() { + return key; + } +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseRentFlagEnums.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseRentFlagEnums.java new file mode 100644 index 0000000000..618be0ea9a --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseRentFlagEnums.java @@ -0,0 +1,58 @@ +package com.epmet.enums; + +import org.springframework.util.StringUtils; + +public enum HouseRentFlagEnums { + YES(1,"是"), + NO(0,"否"); + + + + private Integer code; + private String name; + + + HouseRentFlagEnums(Integer code, String name) { + this.code = code; + this.name=name; + } + + + public static String getTypeValue(Object code){ + if(code == null){ + return null; + } + HouseRentFlagEnums houseRentFlagEnums = getByKey(Integer.parseInt(code.toString())); + return houseRentFlagEnums == null ? null : houseRentFlagEnums.getName(); + } + + private static HouseRentFlagEnums getByKey(Integer code) { + for (HouseRentFlagEnums e : HouseRentFlagEnums.values()) { + if (e.getCode().equals(code)) { + return e; + } + } + return null; + } + + public static Integer getCodeByName(String name){ + if(StringUtils.isEmpty(name)){ + return 0; + } + for (HouseRentFlagEnums e : HouseRentFlagEnums.values()) { + if (e.getName().equals(name)) { + return e.getCode(); + } + } + return 0; + } + + + public Integer getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseTypeEnums.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseTypeEnums.java new file mode 100644 index 0000000000..821f3ccca7 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/enums/HouseTypeEnums.java @@ -0,0 +1,54 @@ +package com.epmet.enums; + +import org.springframework.util.StringUtils; + +public enum HouseTypeEnums { + SPF("1","楼房"), + ZJF("2","平房"), + BS("3","别墅"); + + private String key; + private String value; + + HouseTypeEnums(String key, String value) { + this.key = key; + this.value=value; + } + + public static String getKeyByValue(String value){ + if(StringUtils.isEmpty(value)){ + return ""; + } + for (HouseTypeEnums e : HouseTypeEnums.values()) { + if (e.getValue().equals(value)) { + return e.getKey(); + } + } + return ""; + } + + public static String getTypeValue(Object key){ + if(null == key){ + return null; + } + HouseTypeEnums buildingTypeEnums = getByKey(String.valueOf(key)); + return buildingTypeEnums == null ? null : buildingTypeEnums.getValue(); + } + + private static HouseTypeEnums getByKey(String key) { + for (HouseTypeEnums b : HouseTypeEnums.values()) { + if (b.getKey().equals(key)) { + return b; + } + } + return null; + } + + public String getValue() { + return value; + } + + public String getKey() { + return key; + } +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 81fccb5087..fa78b6f791 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -152,6 +152,21 @@ public class BuildingController { } + /** + * 导出 + * @param formDTO + * @param response + * @throws Exception + */ + @GetMapping("export") + public void export(HttpServletResponse response) throws Exception { + ListIcNeighborHoodFormDTO formDTO = new ListIcNeighborHoodFormDTO(); + ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + buildingService.exportBuildinginfo(formDTO,response); + + } + + /** * 导入数据 * @param file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java index d29a14942e..fbb0f28254 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java @@ -109,6 +109,10 @@ public class IcBuildingExcel extends ExcelVerifyInfo implements Serializable { @NotBlank(message = "楼栋名称不能位空") private String buildingName; + @Excel(name = "楼栋类型") + @NotBlank(message = "楼栋类型不能位空") + private String type; + @Excel(name = "单元数") @NotNull(message = "单元数不能位空") private Integer totalUnitNum; diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index d6b989fbd0..7842454149 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -14,6 +14,7 @@ import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.ExtStaffPermissionResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; +import com.epmet.enums.BuildingTypeEnums; import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.service.*; @@ -90,6 +91,9 @@ public class BuildingServiceImpl implements BuildingService { log.error("com.epmet.service.impl.BuildingServiceImpl.treeList,没有找到工作人员所属的机关信息,用户Id:{}",staffId); return new ArrayList<>(); } + +// agency = new CustomerStaffAgencyDTO(); +// agency.setAgencyId("77f6bc7f07064bf4c09ef848139a344c"); //1.获取所在组织及下级组织 CustomerAgencyEntity customerAgency = customerAgencyDao.selectById(agency.getAgencyId()); List customerAgencyList = icBuildingDao.selectAgencyChildrenList(agency.getAgencyId()); @@ -105,6 +109,8 @@ public class BuildingServiceImpl implements BuildingService { buildingTreeLevelDTO.setPId(item.getPid()); buildingTreeLevelDTO.setLabel(item.getOrganizationName()); buildingTreeLevelDTO.setLevel(item.getLevel()); + buildingTreeLevelDTO.setLongitude(item.getLongitude()); + buildingTreeLevelDTO.setLatitude(item.getLatitude()); buildingTreeLevelDTO.setChildren(new ArrayList<>()); return buildingTreeLevelDTO; }).collect(Collectors.toList()); @@ -126,6 +132,8 @@ public class BuildingServiceImpl implements BuildingService { buildingTreeLevelDTO.setLabel(item.getGridName()); buildingTreeLevelDTO.setLevel("grid"); buildingTreeLevelDTO.setPId(item.getPid()); + buildingTreeLevelDTO.setLongitude(item.getLongitude()); + buildingTreeLevelDTO.setLatitude(item.getLatitude()); buildingTreeLevelDTO.setChildren(new ArrayList<>()); return buildingTreeLevelDTO; }).collect(Collectors.toList()); @@ -134,7 +142,7 @@ public class BuildingServiceImpl implements BuildingService { //3.获取网格下的所有小区 List gridIdList = customerGridList.stream().map(a->a.getId()).collect(Collectors.toList()); List icNeighborHoodList = icNeighborHoodDao.selectList(new QueryWrapper().lambda().in(IcNeighborHoodEntity::getGridId, gridIdList)); - if(CollectionUtils.isEmpty(customerGridList)){ + if(CollectionUtils.isEmpty(icNeighborHoodList)){ agencyList.addAll(gridList); return covertToTree(customerAgency,agencyList); } @@ -144,6 +152,8 @@ public class BuildingServiceImpl implements BuildingService { buildingTreeLevelDTO.setPId(item.getGridId()); buildingTreeLevelDTO.setLabel(item.getNeighborHoodName()); buildingTreeLevelDTO.setLevel("neighbourHood"); + buildingTreeLevelDTO.setLongitude(item.getLongitude()); + buildingTreeLevelDTO.setLatitude(item.getLatitude()); buildingTreeLevelDTO.setChildren(new ArrayList<>()); return buildingTreeLevelDTO; }).collect(Collectors.toList()); @@ -165,6 +175,8 @@ public class BuildingServiceImpl implements BuildingService { buildingTreeLevelDTO.setPId(item.getNeighborHoodId()); buildingTreeLevelDTO.setLabel(item.getBuildingName()); buildingTreeLevelDTO.setLevel("building"); + buildingTreeLevelDTO.setLongitude(item.getLongitude()); + buildingTreeLevelDTO.setLatitude(item.getLatitude()); buildingTreeLevelDTO.setChildren(new ArrayList<>()); return buildingTreeLevelDTO; }).collect(Collectors.toList()); @@ -215,7 +227,7 @@ public class BuildingServiceImpl implements BuildingService { entity.setCustomerId(customerId); entity.setNeighborHoodId(Optional.ofNullable(neighborHoodMap.get(icBuildingExcel.getNeighborHoodName())).map(u->u.getId()).orElse(""));//neighborHoodMap.get(icBuildingExcel.getNeighborHoodName()).getId() entity.setBuildingName(icBuildingExcel.getBuildingName()); - entity.setType(""); + entity.setType(BuildingTypeEnums.getKeyByValue(icBuildingExcel.getType())); entity.setSort(0); entity.setTotalUnitNum(icBuildingExcel.getTotalUnitNum()); entity.setTotalFloorNum(icBuildingExcel.getTotalFloorNum()); @@ -247,7 +259,7 @@ public class BuildingServiceImpl implements BuildingService { IcNeighborHoodResultDTO result = new IcNeighborHoodResultDTO(); IPage> resultMap = searchBuilding(formDTO); - result.setTotal(resultMap.getTotal()); + result.setTotal(Long.valueOf(resultMap.getTotal()).intValue()); result.setList(resultMap.getRecords()); return result; } @@ -260,7 +272,7 @@ public class BuildingServiceImpl implements BuildingService { TemplateExportParams templatePath = new TemplateExportParams("excel/building_export.xlsx"); Map map = new HashMap<>(); map.put("maplist",icBuildingExcels); - ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"楼宇信息录入表",response); + ExcelPoiUtils.exportExcel(templatePath ,map,"楼宇信息录入表",response); return ; } private List searchAllBuilding(ListIcNeighborHoodFormDTO formDTO) { @@ -281,7 +293,11 @@ public class BuildingServiceImpl implements BuildingService { IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); building.setDelFlag("0"); IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); - return icBuildingDao.searchAllBuilding(building,house); + List icBuildingExcels = icBuildingDao.searchAllBuilding(building, house); + icBuildingExcels.forEach(item->{ + item.setType(BuildingTypeEnums.getTypeValue(item.getType())); + }); + return icBuildingExcels; } private IPage> searchBuilding(ListIcNeighborHoodFormDTO formDTO) { @@ -307,7 +323,12 @@ public class BuildingServiceImpl implements BuildingService { // .like(!StringUtils.isEmpty(formDTO.getBuildingName()),IcBuildingEntity::getBuildingName,formDTO.getBuildingName()); // buildingEntityQueryWrapper.eq("a.DEL_FLAG","0"); IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); - return icBuildingDao.searchBuildingByPage(page,building,house); + IPage> mapIPage = icBuildingDao.searchBuildingByPage(page, building, house); + List> records = mapIPage.getRecords(); + records.forEach(item->{ + item.put("buildingType", BuildingTypeEnums.getTypeValue(item.get("buildingTypeKey"))); + }); + return mapIPage; } @@ -316,6 +337,8 @@ public class BuildingServiceImpl implements BuildingService { buildingTreeLevelDTO.setId(customerAgency.getId()); buildingTreeLevelDTO.setLabel(customerAgency.getOrganizationName()); buildingTreeLevelDTO.setLevel(customerAgency.getLevel()); + buildingTreeLevelDTO.setLongitude(customerAgency.getLongitude()); + buildingTreeLevelDTO.setLatitude(customerAgency.getLatitude()); buildingTreeLevelDTO.setChildren(new ArrayList<>()); recursionCovertToTree(buildingTreeLevelDTO,agencyList); List result = new ArrayList<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index ce495c0ebc..e84a4fc01b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -3,6 +3,7 @@ package com.epmet.service.impl; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcBuildingDao; import com.epmet.dao.IcBuildingUnitDao; @@ -17,6 +18,9 @@ import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; import com.epmet.entity.IcNeighborHoodEntity; +import com.epmet.enums.HousePurposeEnums; +import com.epmet.enums.HouseRentFlagEnums; +import com.epmet.enums.HouseTypeEnums; import com.epmet.excel.IcHouseExcel; import com.epmet.service.HouseService; import com.epmet.service.IcBuildingService; @@ -143,9 +147,9 @@ public class HouseServiceImpl implements HouseService { entity.setHouseName(icHouseExcel.getBuildingName()+"-"+icHouseExcel.getBuildingUnit()+"-"+icHouseExcel.getDoorName()); entity.setDoorName(icHouseExcel.getDoorName()); - entity.setHouseType(icHouseExcel.getHouseType()); - entity.setPurpose(icHouseExcel.getPurpose()); - entity.setRentFlag("是".equals(icHouseExcel.getRentFlag())?1:0); + entity.setHouseType(HouseTypeEnums.getKeyByValue(icHouseExcel.getHouseType())); + entity.setPurpose(HousePurposeEnums.getKeyByValue(icHouseExcel.getPurpose())); + entity.setRentFlag(HouseRentFlagEnums.getCodeByName(icHouseExcel.getRentFlag())); entity.setOwnerName(icHouseExcel.getOwnerName()); entity.setOwnerPhone(icHouseExcel.getOwnerPhone()); entity.setOwnerIdCard(icHouseExcel.getOwnerIdCard()); @@ -161,7 +165,7 @@ public class HouseServiceImpl implements HouseService { IcNeighborHoodResultDTO result = new IcNeighborHoodResultDTO(); //如果类型是house 查房屋 IPage> resultMap = searchHouse(formDTO); - result.setTotal(resultMap.getTotal()); + result.setTotal(Long.valueOf(resultMap.getTotal()).intValue()); result.setList(resultMap.getRecords()); return result; } @@ -175,7 +179,7 @@ public class HouseServiceImpl implements HouseService { TemplateExportParams templatePath = new TemplateExportParams("excel/house_export.xlsx"); Map map = new HashMap<>(); map.put("maplist",icHouseExcels); - ExcelPoiUtils.exportExcel(templatePath ,new HashMap<>(),"房屋信息录入表",response); + ExcelPoiUtils.exportExcel(templatePath ,map,"房屋信息录入表",response); return ; } @@ -189,7 +193,12 @@ public class HouseServiceImpl implements HouseService { IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); house.setDelFlag("0"); - return icHouseDao.searchAllHouse(house); + List icHouseExcels = icHouseDao.searchAllHouse(house); + icHouseExcels.forEach(item->{ + item.setHouseType(HouseTypeEnums.getTypeValue(item.getHouseType())); + item.setPurpose(HousePurposeEnums.getTypeValue(item.getPurpose())); + }); + return icHouseExcels; } private IPage> searchHouse(ListIcNeighborHoodFormDTO formDTO) { @@ -220,7 +229,14 @@ public class HouseServiceImpl implements HouseService { IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); house.setDelFlag("0"); - return icHouseDao.searchHouseByPage(page,house); + IPage> mapIPage = icHouseDao.searchHouseByPage(page, house); + List> records = mapIPage.getRecords(); + records.forEach(item->{ + item.put("houseType", HouseTypeEnums.getTypeValue(item.get("houseTypeKey"))); +// item.put("rentFlag", HouseRentFlagEnums.getTypeValue(item.get("rentFlagKey") )); + item.put("purpose", HousePurposeEnums.getTypeValue(item.get("purposeKey"))); + }); + return mapIPage; } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index dc96ce0dd8..2d41fdc8fb 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -111,7 +111,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { IcNeighborHoodResultDTO result = new IcNeighborHoodResultDTO(); IPage> resultMap = searchNeighborhood(formDTO); - result.setTotal(resultMap.getTotal()); + result.setTotal(Long.valueOf(resultMap.getTotal()).intValue()); result.setList(resultMap.getRecords()); return result; diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_export.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_export.xlsx index 2e2fbd53a4687a1b712d03e47607025fb7c5c251..226101af0a2ee33947c5e1074963f20a26a2f1c5 100644 GIT binary patch delta 4328 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 Srb=R!` diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_template.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_template.xlsx index 1334d9dcd9725eb8aa7068115831d8d29f884b95..7950169c04a51b0d75d1b1c4d06aabb044c941b6 100644 GIT binary patch delta 5303 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 delta 4689 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 diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_template.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_template.xlsx index a095e3e0f5fcc4b93eaf764066d069a9bb5c9889..26ced342a16a611060d265a91c1c154b4a435739 100644 GIT binary patch delta 1838 zcmV+}2hsSoS-V-V?FN5Sx^{f&0ssKi1^@sL0001ZY%h0ja%*C5Z)+}iZEU1f-*4J5 z5PqMu{~_{wnivvFBSOWX)sVKSTDSHkQsp{^SU7fOJ3v+Sf8RNf(3U-PZ3O<2yL|cX z{M}`AzAc5fX4-HiQ-n`KP?m#pX!~%U&@XEAkC4CEAN%X3&e5%R{Anv)~_MrhqUP+VrQYuaE1%$oD zvA5Om8^9ljF!X=gH-YKsRVAld8MUw{03GZ|AH|Qu0OJ=a*dFKLZAej|*_yjE>{#i+ zJ6R1ntib^chaX16Agx9#2_)~GXmQ7_hsL7?7wl#yU5`}N4^q05637$8*o&N7mZ#_x zwray(+|YIPrRD;xy(sF3C>VEgzS5p4)MhSM6DgH#gq44y#sw5H5teC5ESoB6L4f;! zJ}S2H2(YJx0%?0c*`Jzg1{DRuf*@feG$HrqirB)dwMfw{$z1iBicpp@!R5+-wy#QN zeJWI)`#D?Rae7xleYir**ul16mnyFX%a&^GLy5MtZ}X2^n0T7_R(?ZJ9J`v#|cP1bPcpsak~66SEIxPK?9 zPVn91w_N6GlOi8Oe?;CxyC1}^ zd^U~smglwr>Biw%+}``j__6@X7)S0os4zz@MK37Lc9bsR^4;))Qt*sZ)1!e~GkdbB zt83S{F?Iqf?3Uo8q!JY&F0Ferl91$6RF)ny*Y@CzZj@uv*hVLu&9T4|1 zCZ}$!IIF6ws4L~7YI?XPcpRgEaRG0VR()-J1Evfhf8~MzemJj+qgvrUydiZeiH6R1zMnYz@@m0CAv2K>xl{ zjX%+hyai{3+q6wjTGJq6rL+qB4oZoU+2gvlPOLQMz2ie6$3$7gVo>Bf^l4IF>) zq~Z^}p!%<~#7AdV{{kDl5;i`=;&!>LRYgvJrN^s>ZyuZU(wydg)7i98_=jUw#6g+U z_dHvSDVt5Z`uV0{>tFOq5UV9}?z3BAiUI#$)xatlh++ zM_iGjpzqd4K_P>Bf)Ai|P8UNw06%{^3yVR9Uuc1yJ-qCn{LH(O|KvykrD%2dY_}gl zt*e0A!=yjLy@75fM95~~>H6F!PyX*E)?B}T>Lh*cT{OmOTROIF~+Tty3%$kqpIz8{Exa^4*|sPhj+j=R`N#?CR8^JEen^ZRdE ze#(@O2X}wXmUY|n46|wuA`=C8(UC`7vymYt0e|00!!Q)a?*-qXs4(-K7X%u(X-;+Zc2$Ap|=1&&MZIBtMp)f3SUDMgR0)~09yQeY@Rfp!+t zh~giw1EcJp4XrY8s@!cWKhrMmkS#?g_U?_%dt+VKQ9Wv7`1}+<&Tj77QNvs}yApu1 zL<%Mha95h_>*MY7{neiY530=u3vS)aFH(DvgS^~kR`H?;ihP~m-=ZhB19VuBfse$x z0rtwn=<0etMOjSfSxDoM#B(xcrzeb%r{?X0{w88qP`d>G5@Q-t8WK7u=PbTpqakq* z$lBb8vj`;A1qoBSc6{jq007jJaWRp%SKmlNrk1IL?3LujoAQqEkD-aua(UC`70RRAF0ssIJ000000000000000 c0ELqbEIt7klS?c;0rZoJEG7n6DF6Tf08pq|0ssI2 delta 1826 zcmV+-2i^F)S+!ZP?FN6kBy`B+0ssKe1^@sL0001ZY%h0ja%*C5Z)+}iZEU1fU2obj z6n&qx{}A~-%?E+D5uqwDG^A~+)~$Vsgp6Z|g=1&715{Q2`>q2CQ1;NZ5%?qb>iFF2 zb8q@L+k!i5sx*@#LBWNO94d&+m{=z0_pgb2g&b|L$S{|JCg^{OYIHOB{Hec@YBiT~ z)^8dfeU+69620o^Ce@3W(m54 zt=!O)7pf|U72{wHqp0H}Z_vv5PB}W4o2gjc3L#A`tOS46E})28Zm1I2(2*1d1h^0A zqhcHM0eh57khb%a{;8OvP*ET(2ogq2Vm#M(*yK*7c!I`pYO7C|n9!7RCRXmzzAUJ5 z371voW^_GcWL83b*g{O{!M0x)GOIXEmvZewi8iyVse+!6YDH38qABo^l_FH9bW12t zkF<}^3+;bD)Q^cxzSoAoTfa^-WI@G^!tac7U_BjwgIm7GYq)bzR<>^mQ@GTiGZRF` z!R&c_edYJUaO6glap*?F;iY>!8C|*K%dq2rxr~OPKY4**R4*nHS0>-f$wDV60_~ic zzT<6U3H-QX*@4EhzkggizZx3biw)Q|&Id*}`XGNiyLGmYOk{FXNA%RJBWRV#+0>Rt zmYE!6+x4%z&AYFZEpwn71d(-w>aw&FbV6smqcefWwZjP=?}$&`pMh6BJEE?sd)u=E z_z>8+&MZY7$Y@4ZF2R z^DzS&`~{OS3>32i3PJ)2+x!VBoCE*>kdsafBY)E{5QguOcn8b(jpLr!Mom|URbi#Q zK$OF^>r5J}b{uS{2N3VhI6W<@5M`^>aqRK;|1+6P?{`L%4LGlCol~Bqlt3+Qq3Tsm zzkHte?kMp=)P>NthMexf)BD-$SJSO^YhM8bf`r=Vvf?WKlIhm3l#G(jdRvAB$?V|yI{gWo zFd@&R>-=xR@F8=sQSk*{Q2m!#;-fRGe}91uUI-hXVX<5;YgLicpXu?}!#j^ddKpf8 zzvygQD15^)E8?Kc>06#XjVYT=yZ-sAVC$dFNf65gXpjL=gH!UuTCn5bQZQkG`_g7#A8()Uui>QlsM>6>;Lgv(Q?eHdsC9~e zi-FhBUnTnF@RK?!EgakY2`QWe0058* z000;O000000000000000G7OUsD;1NNDlY;A5t9!q6_eg7F9EQV4l6|hT^5so78R3f zD=Gn5la(tv0RxlJD<>QHHZ=2H0RRAF0ssIJ0000000000000000DhAaEIt7elTj=^ Q0q&EJEG7n0DF6Tf09}e=^Z)<= diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index 1226c7ec74..bd82c907ec 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -33,7 +33,7 @@ a.TOTAL_FLOOR_NUM as totalFloorNum, a.TOTAL_UNIT_NUM as totalUnitNum, a.BUILDING_NAME as buildingType, - b.NEIGHBOR_HOOD_NAME as neighbourHoodName + b.NEIGHBOR_HOOD_NAME as neighborHoodName from ic_building a LEFT JOIN ic_neighbor_hood b on a.NEIGHBOR_HOOD_ID = b.ID @@ -50,12 +50,12 @@ select a.HOUSE_NAME as houseName, - c.NEIGHBOR_HOOD_NAME as neighbourHoodName, + c.NEIGHBOR_HOOD_NAME as neighborHoodName, b.BUILDING_NAME as buildingName, d.UNIT_NUM as unitNum, a.DOOR_NAME as doorName, - a.HOUSE_TYPE as houseType, + if(a.RENT_FLAG=1,'是','否') as rentFlag, a.OWNER_NAME as ownerName, - a.RENT_FLAG as rentFlag, - a.PURPOSE as purpose, + /*a.RENT_FLAG as rentFlag, + a.PURPOSE as purpose,*/ a.OWNER_PHONE as ownerPhone, a.OWNER_ID_CARD as ownerIdCard, @@ -122,7 +122,8 @@ b.ID as buildingId, a.BUILDING_UNIT_ID as unitNumKey, a.HOUSE_TYPE as houseTypeKey, - a.PURPOSE as purposeKey + a.PURPOSE as purposeKey, + a.RENT_FLAG as rentFlagKey from ic_house a LEFT JOIN ic_building b on a.BUILDING_ID = b.ID and b.DEL_FLAG = '0' LEFT JOIN ic_neighbor_hood c on a.NEIGHBOR_HOOD_ID = c.ID and c.DEL_FLAG = '0' @@ -155,7 +156,7 @@ a.OWNER_PHONE as ownerPhone, a.OWNER_ID_CARD as ownerIdCard, b.BUILDING_NAME as buildingName, - c.NEIGHBOR_HOOD_NAME as neighbourHoodName, + c.NEIGHBOR_HOOD_NAME as neighborHoodName, d.UNIT_NUM as unitName from ic_house a INNER JOIN ic_building b on a.BUILDING_ID = b.ID and b.DEL_FLAG = '0' @@ -188,7 +189,7 @@ a.OWNER_PHONE as ownerPhone, a.OWNER_ID_CARD as ownerIdCard, b.BUILDING_NAME as buildingName, - c.NEIGHBOR_HOOD_NAME as neighbourHoodName, + c.NEIGHBOR_HOOD_NAME as neighborHoodName, d.UNIT_NUM as unitName from ic_house a INNER JOIN ic_building b on a.BUILDING_ID = b.ID From ae76b39e78db3ecdd36d3e3c7846d24c2de78a9c Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 16:32:03 +0800 Subject: [PATCH 080/253] list-for-export --- .../epmet/dto/form/ListForExportFormDTO.java | 26 ++++++ .../controller/IcResiUserController.java | 11 ++- .../java/com/epmet/dao/IcResiUserDao.java | 5 ++ .../com/epmet/service/IcResiUserService.java | 3 + .../service/impl/IcResiUserServiceImpl.java | 89 ++++++++++++++++++- .../main/resources/mapper/IcResiUserDao.xml | 41 +++++++++ 6 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ListForExportFormDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ListForExportFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ListForExportFormDTO.java new file mode 100644 index 0000000000..fb95fc9dd1 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/ListForExportFormDTO.java @@ -0,0 +1,26 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @Description 不分页,导出查询 + * @Author yinzuomei + * @Date 2021/11/1 3:33 下午 + */ +@Data +public class ListForExportFormDTO implements Serializable { + @NotBlank(message = "formCode不能为空", groups = IcResiUserPageFormDTO.AddUserInternalGroup.class) + private String formCode; + + @NotBlank(message = "customerId不能为空", groups = IcResiUserPageFormDTO.AddUserInternalGroup.class) + private String customerId; + /** + * 表对应的字段及值 + */ + private List conditions; +} + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index e00e092d1b..0198fd403b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -35,10 +35,7 @@ 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.IcResiUserDTO; -import com.epmet.dto.form.CustomerFormQueryDTO; -import com.epmet.dto.form.IcResiDetailFormDTO; -import com.epmet.dto.form.IcResiUserFormDTO; -import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; import com.epmet.dto.result.FormItem; @@ -303,4 +300,10 @@ public class IcResiUserController { ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); } + + @PostMapping("list-for-export") + public Result>> queryListForExport(@RequestHeader(required = false) String customerId,@RequestBody ListForExportFormDTO formDTO){ + formDTO.setCustomerId(customerId); + return new Result>>().ok(icResiUserService.queryListForExport(formDTO)); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index ab959cb80a..0f40d25f08 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -73,4 +73,9 @@ public interface IcResiUserDao extends BaseDao { * @date 2021/10/28 11:19 上午 */ List> selectSubTableRecords(@Param("icResiUserId") String icResiUserId,@Param("tableName") String tableName); + + List> selectListResiMapForExport(@Param("customerId") String customerId, + @Param("formCode")String formCode, + @Param("conditions")List conditions, + @Param("subTables")List subTables); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index e1e7713c61..3e2e7270fa 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -24,6 +24,7 @@ import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.form.ListForExportFormDTO; import com.epmet.entity.IcResiUserEntity; import java.util.List; @@ -119,4 +120,6 @@ public interface IcResiUserService extends BaseService { * @date 2021/10/28 10:29 上午 */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); + + List> queryListForExport(ListForExportFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index d212421d81..97eb862afe 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -35,10 +35,7 @@ import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.IcResiUserDTO; -import com.epmet.dto.form.CustomerFormQueryDTO; -import com.epmet.dto.form.IcResiDetailFormDTO; -import com.epmet.dto.form.IcResiUserFormDTO; -import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.AllGridsByUserIdResultDTO; import com.epmet.dto.result.HouseInfoDTO; import com.epmet.dto.result.IcFormResColumnDTO; @@ -381,4 +378,88 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> queryListForExport(ListForExportFormDTO formDTO) { + // 查询列表展示项需要用到哪些子表 + CustomerFormQueryDTO queryDTO1=new CustomerFormQueryDTO(); + queryDTO1.setCustomerId(formDTO.getCustomerId()); + queryDTO1.setFormCode(formDTO.getFormCode()); + Result> subTablesRes=operCustomizeOpenFeignClient.querySubTables(queryDTO1); + List subTables =subTablesRes.success()&&!CollectionUtils.isEmpty(subTablesRes.getData())?subTablesRes.getData():new ArrayList<>(); + List> list=baseDao.selectListResiMapForExport(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getConditions(), + subTables); + //查询网格名称 + List gridIds = new ArrayList<>(); + Set houseIds = new HashSet<>(); + for (Map map : list) { + log.warn(JSON.toJSONString(map)); + if (map.containsKey(UserConstant.GRID_ID) && null != map.get(UserConstant.GRID_ID) && StringUtils.isNotBlank(map.get(UserConstant.GRID_ID).toString())) { + gridIds.add(map.get(UserConstant.GRID_ID).toString()); + } + if (map.containsKey("HOME_ID") && null != map.get("HOME_ID") && StringUtils.isNotBlank(map.get("HOME_ID").toString())) { + houseIds.add(map.get("HOME_ID").toString()); + } + } + Result> gridInfoRes=govOrgOpenFeignClient.getGridListByGridIds(gridIds); + List gridInfoList = gridInfoRes.success() && !CollectionUtils.isEmpty(gridInfoRes.getData()) ? gridInfoRes.getData() : new ArrayList<>(); + Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(AllGridsByUserIdResultDTO::getGridId, Function.identity())); + + //查询房子名称 + Result> houseInfoRes=govOrgOpenFeignClient.queryListHouseInfo(houseIds); + List houseInfoDTOList = houseInfoRes.success() && !CollectionUtils.isEmpty(houseInfoRes.getData()) ? houseInfoRes.getData() : new ArrayList<>(); + Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); + for (Map resultMap : list) { + String gridIdValue = null != resultMap.get(UserConstant.GRID_ID) ? resultMap.get(UserConstant.GRID_ID).toString() : StrConstant.EPMETY_STR; + resultMap.put("GRID_ID_VALUE", gridIdValue); + if (null != gridInfoMap && gridInfoMap.containsKey(gridIdValue) && null != gridInfoMap.get(gridIdValue)) { + //GRID_NAME + resultMap.put(UserConstant.GRID_ID, gridInfoMap.get(gridIdValue).getGridName()); + } + + String homeId = null != resultMap.get("HOME_ID") ? resultMap.get("HOME_ID").toString() : StrConstant.EPMETY_STR; + resultMap.put("HOME_ID_VALUE", homeId); + if (null != houseInfoMap && houseInfoMap.containsKey(homeId) && null != houseInfoMap.get(homeId)) { + HouseInfoDTO houseInfoDTO = houseInfoMap.get(homeId); + String buildName = StringUtils.isNotBlank(houseInfoDTO.getBuildingName()) ? houseInfoDTO.getBuildingName() : StrConstant.EPMETY_STR; + resultMap.put("BUILD_NAME", buildName); + + String neighBorName = StringUtils.isNotBlank(houseInfoDTO.getNeighborHoodName()) ? houseInfoDTO.getNeighborHoodName() : StrConstant.EPMETY_STR; + resultMap.put("VILLAGE_NAME", neighBorName); + + String unitName = StringUtils.isNotBlank(houseInfoDTO.getUnitName()) ? houseInfoDTO.getUnitName() : StrConstant.EPMETY_STR; + resultMap.put("UNIT_NAME", unitName); + + String doorName = StringUtils.isNotBlank(houseInfoDTO.getDoorName()) ? houseInfoDTO.getDoorName() : StrConstant.EPMETY_STR; + resultMap.put("DOOR_NAME", doorName); + + String houseType = StringUtils.isNotBlank(houseInfoDTO.getHouseType()) ? houseInfoDTO.getHouseType() : StrConstant.EPMETY_STR; + //房屋类型,1楼房,2平房,3别墅 + resultMap.put(UserConstant.HOUSE_TYPE_KEY, ""); + if (HouseTypeEnum.LOUFANG.getCode().equals(houseType)) { + resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.LOUFANG.getName()); + } else if (HouseTypeEnum.PINGFANG.getCode().equals(houseType)) { + resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.PINGFANG.getName()); + } else if (HouseTypeEnum.BIESHU.getCode().equals(houseType)) { + resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.BIESHU.getName()); + } + + resultMap.put("HOME_ID", neighBorName.concat(buildName).concat(unitName).concat(doorName)); + } + + if (resultMap.containsKey(UserConstant.GENDER)) { + String genderValue = null != resultMap.get(UserConstant.GENDER) ? resultMap.get(UserConstant.GENDER).toString() : StrConstant.EPMETY_STR; + if (GenderEnum.MAN.getCode().equals(genderValue)) { + resultMap.put(UserConstant.GENDER, GenderEnum.MAN.getName()); + } else if (GenderEnum.WOMAN.getCode().equals(genderValue)) { + resultMap.put(UserConstant.GENDER, GenderEnum.WOMAN.getName()); + } else if (GenderEnum.UN_KNOWN.getCode().equals(genderValue)) { + resultMap.put(UserConstant.GENDER, GenderEnum.UN_KNOWN.getName()); + } + } + } + return list; + } } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index c3d73a3fe1..90d4b25c3d 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -90,4 +90,45 @@ group by IC_RESI_USER.id order by ic_resi_user.CREATED_TIME desc + + \ No newline at end of file From 05abf515b1ac27c6bd3d0576b5954c7e54573e46 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 17:11:05 +0800 Subject: [PATCH 081/253] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dao/IcResiUserDao.java | 9 +- .../service/impl/IcResiUserServiceImpl.java | 4 +- .../main/resources/mapper/IcResiUserDao.xml | 84 +++++++++---------- 3 files changed, 46 insertions(+), 51 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 0f40d25f08..5a37057427 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -61,18 +61,21 @@ public interface IcResiUserDao extends BaseDao { * @author yinzuomei * @date 2021/10/28 11:20 上午 */ - List> selectListMapById(String icResiUserId); + List> selectListMapById(@Param("customerId") String customerId, + @Param("icResiUserId")String icResiUserId); /** * 根据ic_resi_user.id去查询各个子表记录,动态传入表名 * * @param icResiUserId - * @param tableName + * @param subTableName * @return java.util.List> * @author yinzuomei * @date 2021/10/28 11:19 上午 */ - List> selectSubTableRecords(@Param("icResiUserId") String icResiUserId,@Param("tableName") String tableName); + List> selectSubTableRecords(@Param("customerId")String customerId, + @Param("icResiUserId") String icResiUserId, + @Param("subTableName") String subTableName); List> selectListResiMapForExport(@Param("customerId") String customerId, @Param("formCode")String formCode, diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 1d41753926..537e910e61 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -389,7 +389,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> icResiUserMapList = baseDao.selectListMapById(pageFormDTO.getIcResiUserId()); + List> icResiUserMapList = baseDao.selectListMapById(pageFormDTO.getCustomerId(),pageFormDTO.getIcResiUserId()); if (CollectionUtils.isEmpty(icResiUserMapList)) { return new HashMap(); } @@ -399,7 +399,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> subTableRes=operCustomizeOpenFeignClient.queryIcResiSubTables(queryDTO); if(subTableRes.success()&&!CollectionUtils.isEmpty(subTableRes.getData())){ for (String subTalbeName : subTableRes.getData()) { - List> list = baseDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(), subTalbeName); + List> list = baseDao.selectSubTableRecords(pageFormDTO.getCustomerId(),pageFormDTO.getIcResiUserId(), subTalbeName); if (!CollectionUtils.isEmpty(list)) { resultMap.put(subTalbeName, list); } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 90d4b25c3d..7579bddfc9 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -36,15 +36,40 @@ - + select * from ic_resi_user where del_flag='0' and id=#{icResiUserId} and customer_id=#{customerId} + + + ic_resi_user.DEL_FLAG = '0' + and ic_resi_user.customer_id=#{customerId} + + + + + + and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} + + + + and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + + + + and ${subCondition.tableName}.${subCondition.columnName} between #{subCondition.columnValue[0]} and #{subCondition.columnValue[1]} + + + + + + + + - WHERE - ic_resi_user.DEL_FLAG = '0' - and ic_resi_user.customer_id=#{customerId} - - - - - and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} - - - and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') - - - and ${subCondition.tableName}.${subCondition.columnName} between #{subCondition.columnValue[0]} and #{subCondition.columnValue[1]} - - - - - group by IC_RESI_USER.id - order by ic_resi_user.CREATED_TIME desc - From bf85e4f37d72c12da8d38c7c26941d1fe2a05907 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Mon, 1 Nov 2021 17:20:08 +0800 Subject: [PATCH 082/253] =?UTF-8?q?=E5=88=A0=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 5 -- .../java/com/epmet/dao/IcResiUserDao.java | 4 - .../com/epmet/service/IcResiUserService.java | 4 +- .../service/impl/IcResiUserServiceImpl.java | 83 ------------------- .../main/resources/mapper/IcResiUserDao.xml | 25 ------ 5 files changed, 1 insertion(+), 120 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 649e7966bc..2b3c2ece98 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -312,9 +312,4 @@ public class IcResiUserController { return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); } - @PostMapping("list-for-export") - public Result>> queryListForExport(@RequestHeader(required = false) String customerId,@RequestBody ListForExportFormDTO formDTO){ - formDTO.setCustomerId(customerId); - return new Result>>().ok(icResiUserService.queryListForExport(formDTO)); - } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 5a37057427..43bb030012 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -77,8 +77,4 @@ public interface IcResiUserDao extends BaseDao { @Param("icResiUserId") String icResiUserId, @Param("subTableName") String subTableName); - List> selectListResiMapForExport(@Param("customerId") String customerId, - @Param("formCode")String formCode, - @Param("conditions")List conditions, - @Param("subTables")List subTables); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index c7a8a31870..8e762e3239 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -23,9 +23,8 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; -import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.dto.form.IcResiUserPageFormDTO; -import com.epmet.dto.form.ListForExportFormDTO; +import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.entity.IcResiUserEntity; import java.util.List; @@ -131,5 +130,4 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); - List> queryListForExport(ListForExportFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 537e910e61..0f20619b1e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -411,87 +411,4 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> queryListForExport(ListForExportFormDTO formDTO) { - // 查询列表展示项需要用到哪些子表 - CustomerFormQueryDTO queryDTO1=new CustomerFormQueryDTO(); - queryDTO1.setCustomerId(formDTO.getCustomerId()); - queryDTO1.setFormCode(formDTO.getFormCode()); - Result> subTablesRes=operCustomizeOpenFeignClient.querySubTables(queryDTO1); - List subTables =subTablesRes.success()&&!CollectionUtils.isEmpty(subTablesRes.getData())?subTablesRes.getData():new ArrayList<>(); - List> list=baseDao.selectListResiMapForExport(formDTO.getCustomerId(), - formDTO.getFormCode(), - formDTO.getConditions(), - subTables); - //查询网格名称 - List gridIds = new ArrayList<>(); - Set houseIds = new HashSet<>(); - for (Map map : list) { - log.warn(JSON.toJSONString(map)); - if (map.containsKey(UserConstant.GRID_ID) && null != map.get(UserConstant.GRID_ID) && StringUtils.isNotBlank(map.get(UserConstant.GRID_ID).toString())) { - gridIds.add(map.get(UserConstant.GRID_ID).toString()); - } - if (map.containsKey("HOME_ID") && null != map.get("HOME_ID") && StringUtils.isNotBlank(map.get("HOME_ID").toString())) { - houseIds.add(map.get("HOME_ID").toString()); - } - } - Result> gridInfoRes=govOrgOpenFeignClient.getGridListByGridIds(gridIds); - List gridInfoList = gridInfoRes.success() && !CollectionUtils.isEmpty(gridInfoRes.getData()) ? gridInfoRes.getData() : new ArrayList<>(); - Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(AllGridsByUserIdResultDTO::getGridId, Function.identity())); - - //查询房子名称 - Result> houseInfoRes=govOrgOpenFeignClient.queryListHouseInfo(houseIds); - List houseInfoDTOList = houseInfoRes.success() && !CollectionUtils.isEmpty(houseInfoRes.getData()) ? houseInfoRes.getData() : new ArrayList<>(); - Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); - for (Map resultMap : list) { - String gridIdValue = null != resultMap.get(UserConstant.GRID_ID) ? resultMap.get(UserConstant.GRID_ID).toString() : StrConstant.EPMETY_STR; - resultMap.put("GRID_ID_VALUE", gridIdValue); - if (null != gridInfoMap && gridInfoMap.containsKey(gridIdValue) && null != gridInfoMap.get(gridIdValue)) { - //GRID_NAME - resultMap.put(UserConstant.GRID_ID, gridInfoMap.get(gridIdValue).getGridName()); - } - - String homeId = null != resultMap.get("HOME_ID") ? resultMap.get("HOME_ID").toString() : StrConstant.EPMETY_STR; - resultMap.put("HOME_ID_VALUE", homeId); - if (null != houseInfoMap && houseInfoMap.containsKey(homeId) && null != houseInfoMap.get(homeId)) { - HouseInfoDTO houseInfoDTO = houseInfoMap.get(homeId); - String buildName = StringUtils.isNotBlank(houseInfoDTO.getBuildingName()) ? houseInfoDTO.getBuildingName() : StrConstant.EPMETY_STR; - resultMap.put("BUILD_NAME", buildName); - - String neighBorName = StringUtils.isNotBlank(houseInfoDTO.getNeighborHoodName()) ? houseInfoDTO.getNeighborHoodName() : StrConstant.EPMETY_STR; - resultMap.put("VILLAGE_NAME", neighBorName); - - String unitName = StringUtils.isNotBlank(houseInfoDTO.getUnitName()) ? houseInfoDTO.getUnitName() : StrConstant.EPMETY_STR; - resultMap.put("UNIT_NAME", unitName); - - String doorName = StringUtils.isNotBlank(houseInfoDTO.getDoorName()) ? houseInfoDTO.getDoorName() : StrConstant.EPMETY_STR; - resultMap.put("DOOR_NAME", doorName); - - String houseType = StringUtils.isNotBlank(houseInfoDTO.getHouseType()) ? houseInfoDTO.getHouseType() : StrConstant.EPMETY_STR; - //房屋类型,1楼房,2平房,3别墅 - resultMap.put(UserConstant.HOUSE_TYPE_KEY, ""); - if (HouseTypeEnum.LOUFANG.getCode().equals(houseType)) { - resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.LOUFANG.getName()); - } else if (HouseTypeEnum.PINGFANG.getCode().equals(houseType)) { - resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.PINGFANG.getName()); - } else if (HouseTypeEnum.BIESHU.getCode().equals(houseType)) { - resultMap.put(UserConstant.HOUSE_TYPE_KEY, HouseTypeEnum.BIESHU.getName()); - } - - resultMap.put("HOME_ID", neighBorName.concat(buildName).concat(unitName).concat(doorName)); - } - - if (resultMap.containsKey(UserConstant.GENDER)) { - String genderValue = null != resultMap.get(UserConstant.GENDER) ? resultMap.get(UserConstant.GENDER).toString() : StrConstant.EPMETY_STR; - if (GenderEnum.MAN.getCode().equals(genderValue)) { - resultMap.put(UserConstant.GENDER, GenderEnum.MAN.getName()); - } else if (GenderEnum.WOMAN.getCode().equals(genderValue)) { - resultMap.put(UserConstant.GENDER, GenderEnum.WOMAN.getName()); - } else if (GenderEnum.UN_KNOWN.getCode().equals(genderValue)) { - resultMap.put(UserConstant.GENDER, GenderEnum.UN_KNOWN.getName()); - } - } - } - return list; - } } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 7579bddfc9..086ae1b1f4 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -98,29 +98,4 @@ - - - - - \ No newline at end of file From 8b9879aaeba5b22179dfd0fabcba9d9f4428491e Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 1 Nov 2021 18:17:18 +0800 Subject: [PATCH 083/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 42 ++++++++++++++++++- pom.xml | 6 +-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 2b3c2ece98..02b2068020 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -17,7 +17,9 @@ package com.epmet.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.afterturn.easypoi.excel.export.ExcelExportService; import com.alibaba.fastjson.JSON; @@ -35,7 +37,10 @@ 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.IcResiUserDTO; -import com.epmet.dto.form.*; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.form.IcResiDetailFormDTO; +import com.epmet.dto.form.IcResiUserFormDTO; +import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; import com.epmet.dto.result.FormItem; @@ -43,7 +48,9 @@ import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -51,6 +58,8 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URLEncoder; import java.util.*; @@ -60,6 +69,7 @@ import java.util.*; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-26 */ +@Slf4j @RestController @RequestMapping("icresiuser") public class IcResiUserController { @@ -312,4 +322,34 @@ public class IcResiUserController { return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); } + @RequestMapping(value = "/exportExcel") + public void exportExcel(/*@LoginUser TokenDto tokenDto,*/ @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { + pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + pageFormDTO.setPageFlag(false); + PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); + List> list = mapPageData.getList(); + Map mapData = new HashMap<>(); + log.info("list:{}", JSON.toJSONString(list)); + + mapData.put("list", list); + String templatePath = "excel/ic_resi_info_cid.xls"; + + + Workbook workbook = ExcelExportUtil.exportExcel(new TemplateExportParams(templatePath), mapData); + //header + response.setHeader("content-Type", "application/vnd.ms-excel"); + response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("继续追踪导出详情-" + ".xlsx", "UTF-8")); + workbook.write(response.getOutputStream()); + + /* + //方式1 通过mv导出 + ModelAndView mv = new ModelAndView(new EasypoiTemplateExcelView()); + mv.addObject(TemplateExcelConstants.FILE_NAME, "继续追踪导出详情-".concat(DateUtils.formatDate())); + mv.addObject(TemplateExcelConstants.PARAMS, new TemplateExportParams(templatePath,dataType)); + mv.addObject(TemplateExcelConstants.MAP_DATA, mapData); + return mv; + */ + + } + } diff --git a/pom.xml b/pom.xml index 0cbc5c73fa..2a30af4cf9 100644 --- a/pom.xml +++ b/pom.xml @@ -97,11 +97,11 @@ - + public aliyun nexus From 01aac4ae9180661380b15f46f6e38c7d90e4fa4c Mon Sep 17 00:00:00 2001 From: lzh Date: Mon, 1 Nov 2021 21:48:22 +0800 Subject: [PATCH 084/253] =?UTF-8?q?=E6=A5=BC=E5=AE=87=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/exception/EpmetErrorCode.java | 5 ++- .../epmet/dto/form/IcBulidingUnitFormDTO.java | 42 +++++++++++++++++++ .../epmet/controller/BuildingController.java | 40 ++++++++++++++---- .../com/epmet/controller/HouseController.java | 11 +++-- .../controller/NeighborHoodController.java | 13 +++--- .../service/impl/BuildingServiceImpl.java | 17 ++++---- .../service/impl/NeighborHoodServiceImpl.java | 3 -- 7 files changed, 100 insertions(+), 31 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingUnitFormDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index fa30ff3a3c..92c190c7ec 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -214,8 +214,11 @@ public enum EpmetErrorCode { SAME_RULE_NAME(8916,"该积分事件已存在,请重新调整保存"), UP_LIMIT_POINT(8917,"积分上限需为单位积分倍数,请重新调整保存"), - BADGE_CHECK(8918,""); + BADGE_CHECK(8918,""), + ORG_ADD_FAILED(8919,"添加失败"), + ORG_EDIT_FAILED(8920,"编辑失败"), + ORG_DEL_FAILED(8921,"删除失败"); private int code; private String msg; diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingUnitFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingUnitFormDTO.java new file mode 100644 index 0000000000..74a38b8e2b --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingUnitFormDTO.java @@ -0,0 +1,42 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +@Data +public class IcBulidingUnitFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotBlank(message = "楼栋ID不能为空") + private String buildingId; + + + + +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index fa78b6f791..2e65729cab 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -19,6 +19,8 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; @@ -28,12 +30,15 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.constant.NeighborhoodConstant; +import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.dto.form.IcBulidingFormDTO; +import com.epmet.dto.form.IcBulidingUnitFormDTO; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; +import com.epmet.entity.IcBuildingUnitEntity; import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcHouseExcel; import com.epmet.excel.IcNeighborHoodExcel; @@ -77,13 +82,15 @@ public class BuildingController { private IcBuildingService icBuildingService; @Autowired private BuildingService buildingService; + @Autowired + private IcBuildingUnitDao icBuildingUnitDao; @PostMapping("buildinglist") public Result houseList(@RequestBody ListIcNeighborHoodFormDTO formDTO){ //效验数据 - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); IcNeighborHoodResultDTO icNeighborHoodResultDTO = buildingService.listBuilding(formDTO); return new Result().ok(icNeighborHoodResultDTO); @@ -126,13 +133,12 @@ public class BuildingController { } /** * 导出模板 - * @param formDTO * @param response * @throws Exception */ @PostMapping("exporttemplate") - public void exportTemplate(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + public void exportTemplate( HttpServletResponse response) throws Exception { + TemplateExportParams templatePath = new TemplateExportParams("excel/building_template.xlsx"); Map map = new HashMap<>(); map.put("maplist",new ArrayList()); @@ -147,7 +153,7 @@ public class BuildingController { */ @RequestMapping("exportbuildinginfo") public void exportbuildinginfo(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); buildingService.exportBuildinginfo(formDTO,response); } @@ -161,7 +167,7 @@ public class BuildingController { @GetMapping("export") public void export(HttpServletResponse response) throws Exception { ListIcNeighborHoodFormDTO formDTO = new ListIcNeighborHoodFormDTO(); - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); buildingService.exportBuildinginfo(formDTO,response); } @@ -186,7 +192,7 @@ public class BuildingController { for ( IcBuildingExcel entity : failList) { log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 } - return new Result().error(8000,failList.get(0).getErrorMsg()); + return new Result().error(8001,failList.get(0).getErrorMsg()); } List result =importResult.getList(); @@ -194,5 +200,25 @@ public class BuildingController { return new Result().ok("导入成功"); } + /** + * 查看楼宇单元列表 + * @param tokenDTO + * @return + * @throws IOException + */ + @PostMapping("buildingunitlist") + public Result buildingunitlist(@LoginUser TokenDto tokenDTO,@RequestBody IcBulidingUnitFormDTO icBulidingUnitFormDTO ){ + ValidatorUtils.validateEntity(icBulidingUnitFormDTO); + List icBuildingUnitEntityList = icBuildingUnitDao.selectList(new QueryWrapper().lambda().eq(IcBuildingUnitEntity::getBuildingId, icBulidingUnitFormDTO.getBuildingId())); + List result = new ArrayList<>(); + icBuildingUnitEntityList.forEach(item->{ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id",item.getId()); + jsonObject.put("unitName",item.getUnitName()); + jsonObject.put("unitNum",item.getUnitNum()); + result.add(jsonObject); + }); + return new Result().ok(result); + } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index 9f8f92188a..8bc4378e8f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -67,7 +67,7 @@ public class HouseController { @PostMapping("houselist") public Result houseList(@RequestBody ListIcNeighborHoodFormDTO formDTO){ //效验数据 - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); IcNeighborHoodResultDTO icNeighborHoodResultDTO = houseService.listNeighborhood(formDTO); return new Result().ok(icNeighborHoodResultDTO); @@ -103,13 +103,12 @@ public class HouseController { } /** * 导出模板 - * @param formDTO * @param response * @throws Exception */ @PostMapping("exporttemplate") - public void exportTemplate(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + public void exportTemplate(HttpServletResponse response) throws Exception { +// ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); TemplateExportParams templatePath = new TemplateExportParams("excel/house_template.xlsx"); Map map = new HashMap<>(); map.put("maplist",new ArrayList()); @@ -124,7 +123,7 @@ public class HouseController { */ @RequestMapping("exporthouseinfo") public void exporthouseinfo(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); houseService.exportBuildinginfo(formDTO,response); } @@ -149,7 +148,7 @@ public class HouseController { for ( IcHouseExcel entity : failList) { log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 } - return new Result().error(8000,failList.get(0).getErrorMsg()); + return new Result().error(8001,failList.get(0).getErrorMsg()); } List result =importResult.getList(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index 8d98ad3c8a..823363814a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -80,7 +80,7 @@ public class NeighborHoodController { @PostMapping("neighborhoodlist") public Result neighborhoodlist(@RequestBody ListIcNeighborHoodFormDTO formDTO){ //效验数据 - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); IcNeighborHoodResultDTO icNeighborHoodResultDTO = neighborHoodService.listNeighborhood(formDTO); return new Result().ok(icNeighborHoodResultDTO); @@ -115,7 +115,7 @@ public class NeighborHoodController { //判断是否存在楼宇,如果存在不能删除 List icBuildingEntities = icBuildingDao.selectList(new QueryWrapper().lambda().eq(IcBuildingEntity::getNeighborHoodId, neighborHoodId)); if(!CollectionUtils.isEmpty(icBuildingEntities)){ - return new Result().error(8000,"小区下已存在楼宇,无法删除"); + return new Result().error(8001,"小区下已存在楼宇,无法删除"); } neighborHoodService.DelNeighborhood(neighborHoodId); return new Result().ok("删除成功"); @@ -130,19 +130,18 @@ public class NeighborHoodController { */ @PostMapping("exportneighborhoodinfo") public void exportneighborhoodinfo(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + ValidatorUtils.validateEntity(formDTO); neighborHoodService.exportNeighborhoodinfo(formDTO,response); } /** * 导出模板 - * @param formDTO * @param response * @throws Exception */ @PostMapping("exporttemplate") - public void exportTemplate(@RequestBody ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception { - ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); + public void exportTemplate( HttpServletResponse response) throws Exception { +// ValidatorUtils.validateEntity(ListIcNeighborHoodFormDTO.class); TemplateExportParams templatePath = new TemplateExportParams("excel/neighbor_template.xlsx"); Map map = new HashMap<>(); map.put("maplist",new ArrayList()); @@ -211,7 +210,7 @@ public class NeighborHoodController { for ( IcNeighborHoodExcel entity : failList) { log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 } - return new Result().error(8000,failList.get(0).getErrorMsg()); + return new Result().error(8001,failList.get(0).getErrorMsg()); } List result =importResult.getList(); // log.info(JSON.toJSONString(result)); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 7842454149..10371e3369 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -8,16 +8,19 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.*; -import com.epmet.dto.*; +import com.epmet.dto.BuildingTreeLevelDTO; +import com.epmet.dto.CustomerStaffAgencyDTO; +import com.epmet.dto.IcBuildingDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; -import com.epmet.dto.result.ExtStaffPermissionResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; import com.epmet.enums.BuildingTypeEnums; import com.epmet.excel.IcBuildingExcel; -import com.epmet.excel.IcNeighborHoodExcel; -import com.epmet.service.*; +import com.epmet.service.BuildingService; +import com.epmet.service.IcBuildingService; +import com.epmet.service.IcBuildingUnitService; +import com.epmet.service.IcHouseService; import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -374,7 +377,7 @@ public class BuildingServiceImpl implements BuildingService { List icHouseEntities = icHouseDao.selectList(new QueryWrapper().lambda().eq(IcHouseEntity::getBuildingId, formDTO.getBuildingId())); if(!CollectionUtils.isEmpty(icHouseEntities)){ // - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(),"楼宇单元下存在房屋,无法更新"); + throw new RenException(EpmetErrorCode.ORG_EDIT_FAILED.getCode(),"楼宇单元下存在房屋,无法更新"); // icHouseEntities.forEach(item->{ // item.setNeighborHoodId(formDTO.getNeighborHoodId()); // }); @@ -403,7 +406,7 @@ public class BuildingServiceImpl implements BuildingService { icBuildingUnitService.insertBatch(unitList); }else{ //如果小于,判断是否存在房屋,如果存在就提示不能更改 - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(),"楼宇单元下存在房屋,无法更新"); + throw new RenException(EpmetErrorCode.ORG_EDIT_FAILED.getCode(),"楼宇单元下存在房屋,无法更新"); } @@ -420,7 +423,7 @@ public class BuildingServiceImpl implements BuildingService { //如果存在房屋,无法删除 List icHouseEntities = icHouseDao.selectList(new QueryWrapper().lambda().eq(IcHouseEntity::getBuildingId, buildingId)); if(!CollectionUtils.isEmpty(icHouseEntities)){ - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(),"楼宇单元下存在房屋,无法删除"); + throw new RenException(EpmetErrorCode.ORG_DEL_FAILED.getCode(),"楼宇单元下存在房屋,无法删除"); } //删除楼宇 icBuildingService.deleteById(buildingId); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index 2d41fdc8fb..00d96f74f6 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.NeighborhoodConstant; import com.epmet.dao.*; @@ -18,8 +17,6 @@ import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; -import com.epmet.excel.IcBuildingExcel; -import com.epmet.excel.IcHouseExcel; import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.service.IcNeighborHoodPropertyService; From 57b335d545532bdeae29dc7c4da6f26eff76092b Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 2 Nov 2021 09:15:22 +0800 Subject: [PATCH 085/253] =?UTF-8?q?=E7=94=9F=E6=88=90=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-user/epmet-user-server/pom.xml | 10 ++++ .../controller/IcResiUserController.java | 52 ++++++++++-------- .../main/resources/excel/ic_resi_info_cid.xls | Bin 0 -> 79872 bytes 3 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index a70950c101..c6417f095f 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -140,6 +140,16 @@ true + + org.apache.maven.plugins + maven-resources-plugin + + + xls + xlsx + + + ${project.basedir}/src/main/java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 02b2068020..2aaeba1cb0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -144,14 +144,7 @@ public class IcResiUserController { @GetMapping("download/template") public void downloadTemplate(@RequestParam String customerId) throws Exception { - CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); - queryDTO.setFormCode("resi_base_info"); - queryDTO.setCustomerId(customerId); - Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); - if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); - } - System.out.println(JSON.toJSONString(resultForm.getData())); + CustomerFormResultDTO resultForm = getResiFormItems(customerId); XSSFWorkbook workbook = new XSSFWorkbook(); Map> sheetHeaderMap = buildHeaderByItem(resultForm); @@ -175,11 +168,24 @@ public class IcResiUserController { } @NotNull - private Map> buildHeaderByItem(Result resultForm) { + private CustomerFormResultDTO getResiFormItems(String customerId) { + CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); + queryDTO.setFormCode("resi_base_info"); + queryDTO.setCustomerId(customerId); + Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); + if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } + System.out.println(JSON.toJSONString(resultForm.getData())); + return resultForm.getData(); + } + + @NotNull + private Map> buildHeaderByItem(CustomerFormResultDTO resultForm) { //form中的itemlist 为一级表头 但是要排除每个item中含有childGroup的 - List itemList = resultForm.getData().getItemList(); - List groupList = resultForm.getData().getGroupList(); + List itemList = resultForm.getItemList(); + List groupList = resultForm.getGroupList(); Map> everySheetHeaderMap = new LinkedHashMap<>(); @@ -196,7 +202,7 @@ public class IcResiUserController { firstSheetHeaderList.add(header); return; } - everySheetHeaderMap.putIfAbsent(resultForm.getData().getFormName(),firstSheetHeaderList); + everySheetHeaderMap.putIfAbsent(resultForm.getFormName(),firstSheetHeaderList); //这些是动态的 formGroup if (item.getChildGroup() != null){ @@ -326,29 +332,31 @@ public class IcResiUserController { public void exportExcel(/*@LoginUser TokenDto tokenDto,*/ @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setPageFlag(false); - PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); - List> list = mapPageData.getList(); + //PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); + //List> list = mapPageData.getList(); + List> list = (List>)JSON.parse("[{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]" + ); Map mapData = new HashMap<>(); log.info("list:{}", JSON.toJSONString(list)); mapData.put("list", list); - String templatePath = "excel/ic_resi_info_cid.xls"; + CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); + String templatePath = "excel/ic_resi_info_cid.xls"; + TemplateExportParams params = new TemplateExportParams(templatePath, 0,1); Workbook workbook = ExcelExportUtil.exportExcel(new TemplateExportParams(templatePath), mapData); //header response.setHeader("content-Type", "application/vnd.ms-excel"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("继续追踪导出详情-" + ".xlsx", "UTF-8")); + response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("继续追踪导出详情-" + ".xls", "UTF-8")); workbook.write(response.getOutputStream()); - /* - //方式1 通过mv导出 + /* //方式1 通过mv导出 ModelAndView mv = new ModelAndView(new EasypoiTemplateExcelView()); - mv.addObject(TemplateExcelConstants.FILE_NAME, "继续追踪导出详情-".concat(DateUtils.formatDate())); - mv.addObject(TemplateExcelConstants.PARAMS, new TemplateExportParams(templatePath,dataType)); + mv.addObject(TemplateExcelConstants.FILE_NAME, "继续追踪导出详情-")); + mv.addObject(TemplateExcelConstants.PARAMS, new TemplateExportParams(templatePath)); mv.addObject(TemplateExcelConstants.MAP_DATA, mapData); - return mv; - */ + return mv;*/ } diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls new file mode 100644 index 0000000000000000000000000000000000000000..51a5d41a945f26f68fb9b5b5e7fb36b05ed6d092 GIT binary patch literal 79872 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 Date: Tue, 2 Nov 2021 09:34:40 +0800 Subject: [PATCH 086/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E5=AE=B6=E5=BA=AD=20=E5=B7=A6=E4=BE=A7?= =?UTF-8?q?=E6=A5=BC=E6=A0=8B=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/BaseInfoFamilyBuildingFormDTO.java | 22 ++++++++++++++++ .../BaseInfoFamilyBuildingResultDTO.java | 26 +++++++++++++++++++ .../epmet/controller/AgencyController.java | 12 +++++++++ .../java/com/epmet/dao/IcBuildingDao.java | 9 +++++++ .../java/com/epmet/service/AgencyService.java | 9 +++++++ .../epmet/service/impl/AgencyServiceImpl.java | 18 +++++++++++++ .../main/resources/mapper/IcBuildingDao.xml | 10 +++++++ 7 files changed, 106 insertions(+) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/BaseInfoFamilyBuildingFormDTO.java create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BaseInfoFamilyBuildingResultDTO.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/BaseInfoFamilyBuildingFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/BaseInfoFamilyBuildingFormDTO.java new file mode 100644 index 0000000000..94bc0a05ab --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/BaseInfoFamilyBuildingFormDTO.java @@ -0,0 +1,22 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/11/2 9:13 上午 + * @DESC + */ +@Data +public class BaseInfoFamilyBuildingFormDTO implements Serializable { + + private static final long serialVersionUID = 2009866136409462441L; + + public interface BaseInfoFamilyBuildingForm{} + + @NotBlank(message = "neighborHoodId不能为空",groups = BaseInfoFamilyBuildingForm.class) + private String neighborHoodId; +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BaseInfoFamilyBuildingResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BaseInfoFamilyBuildingResultDTO.java new file mode 100644 index 0000000000..ea5b86e2e6 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BaseInfoFamilyBuildingResultDTO.java @@ -0,0 +1,26 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/11/2 9:15 上午 + * @DESC + */ +@Data +public class BaseInfoFamilyBuildingResultDTO implements Serializable { + + private static final long serialVersionUID = 6084090841200733630L; + + /** + * 楼栋ID + */ + private String buildingId; + + /** + * 楼栋名字 + */ + private String buildingName; +} 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 5d3ecedfbe..1cb9c525da 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 @@ -290,4 +290,16 @@ public class AgencyController { return new Result().ok(agencyService.mapOrg(formDTO,tokenDto)); } + /** + * @Description 查询楼栋信息 + * @param formDTO + * @author zxc + * @date 2021/11/2 9:18 上午 + */ + @PostMapping("baseinfofamilybuilding") + public Result> baseInfoFamilyBuilding(@RequestBody BaseInfoFamilyBuildingFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, BaseInfoFamilyBuildingFormDTO.BaseInfoFamilyBuildingForm.class); + return new Result>().ok(agencyService.baseInfoFamilyBuilding(formDTO)); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java index 511daa2fad..ddae0aca45 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.result.BaseInfoFamilyBuildingResultDTO; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; @@ -60,4 +61,12 @@ public interface IcBuildingDao extends BaseDao { List> selectListByName(@Param("neighborNameList")ArrayList strings, @Param("buildingNameList") ArrayList strings1, @Param("buildingUnitList") ArrayList integers); + + /** + * @Description 根据neighborHoodId查询楼 + * @param neighborHoodId + * @author zxc + * @date 2021/11/2 9:25 上午 + */ + List baseInfoFamilyBuilding(@Param("neighborHoodId")String neighborHoodId); } \ No newline at end of file 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 b0153239fd..e9c092fed5 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 @@ -139,4 +139,13 @@ public interface AgencyService { * @date 2021/10/25 10:50 上午 */ MapOrgResultDTO mapOrg(MapOrgFormDTO formDTO, TokenDto tokenDto); + + /** + * @Description 查询楼栋信息 + * @param formDTO + * @author zxc + * @date 2021/11/2 9:18 上午 + */ + List baseInfoFamilyBuilding(BaseInfoFamilyBuildingFormDTO formDTO); + } \ No newline at end of file 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 f794ea229f..f95f2486ea 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 @@ -35,6 +35,7 @@ import com.epmet.constant.OrgInfoConstant; import com.epmet.constant.RoleKeyConstants; import com.epmet.dao.CustomerAgencyDao; import com.epmet.dao.CustomerGridDao; +import com.epmet.dao.IcBuildingDao; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.GovStaffRoleDTO; import com.epmet.dto.form.*; @@ -92,6 +93,8 @@ public class AgencyServiceImpl implements AgencyService { private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient; @Autowired private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; + @Autowired + private IcBuildingDao icBuildingDao; /** @@ -644,6 +647,21 @@ public class AgencyServiceImpl implements AgencyService { return result; } + /** + * @Description 查询楼栋信息 + * @param formDTO + * @author zxc + * @date 2021/11/2 9:18 上午 + */ + @Override + public List baseInfoFamilyBuilding(BaseInfoFamilyBuildingFormDTO formDTO) { + List result = icBuildingDao.baseInfoFamilyBuilding(formDTO.getNeighborHoodId()); + if (CollectionUtils.isEmpty(result)){ + return new ArrayList<>(); + } + return result; + } + private CustomerAgencyEntity constructInsertEntity(AddAgencyV2FormDTO formDTO, CustomerAgencyDTO parent) { CustomerAgencyEntity insertEntity = ConvertUtils.sourceToTarget(formDTO, CustomerAgencyEntity.class); insertEntity.setOrganizationName(formDTO.getAgencyName()); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index bd82c907ec..3f9fc515cf 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -289,5 +289,15 @@ + + + \ No newline at end of file From b07b3c6d0812a301f1919abc528ca5d26ec96f64 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 2 Nov 2021 09:51:09 +0800 Subject: [PATCH 087/253] =?UTF-8?q?=E5=88=A0=E6=8E=89=E5=B1=85=E6=B0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/form/DelIcResiUserFormDTO.java | 26 +++++++++++++++++++ .../controller/IcResiUserController.java | 16 +++++------- .../java/com/epmet/dao/IcResiUserDao.java | 3 +++ .../com/epmet/service/IcResiUserService.java | 6 ++--- .../service/impl/IcResiUserServiceImpl.java | 12 ++++++--- .../main/resources/mapper/IcResiUserDao.xml | 6 +++++ 6 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DelIcResiUserFormDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DelIcResiUserFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DelIcResiUserFormDTO.java new file mode 100644 index 0000000000..3b6ff7d195 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DelIcResiUserFormDTO.java @@ -0,0 +1,26 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 删除居民 + * @Author yinzuomei + * @Date 2021/11/2 9:45 上午 + */ +@Data +public class DelIcResiUserFormDTO implements Serializable { + private static final long serialVersionUID = 2455694966457219261L; + + public interface IdGroup { + } + + @NotBlank(message = "icResiUserId不能为空", groups = IdGroup.class) + private String icResiUserId; + @NotBlank(message = "token获取的customerId不能为空", groups = IdGroup.class) + private String customerId; + private String formCode="resi_base_info"; +} + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 2aaeba1cb0..a03b43299d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -31,16 +31,12 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ExcelUtils; 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.IcResiUserDTO; -import com.epmet.dto.form.CustomerFormQueryDTO; -import com.epmet.dto.form.IcResiDetailFormDTO; -import com.epmet.dto.form.IcResiUserFormDTO; -import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; import com.epmet.dto.result.FormItem; @@ -108,11 +104,11 @@ public class IcResiUserController { return new Result(); } - @DeleteMapping - public Result delete(@RequestBody String[] ids){ - //效验数据 - AssertUtils.isArrayEmpty(ids, "id"); - icResiUserService.delete(ids); + @PostMapping("delete") + public Result delete(@LoginUser TokenDto tokenDto,@RequestBody DelIcResiUserFormDTO formDTO){ + formDTO.setCustomerId(tokenDto.getCustomerId()); + ValidatorUtils.validateEntity(formDTO,DelIcResiUserFormDTO.IdGroup.class); + icResiUserService.delete(formDTO); return new Result(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 43bb030012..47b63f6eec 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -77,4 +77,7 @@ public interface IcResiUserDao extends BaseDao { @Param("icResiUserId") String icResiUserId, @Param("subTableName") String subTableName); + int updateToDel(String icResiUserId); + + int updateSubTableToDel(@Param("subTalbeName") String subTalbeName, @Param("icResiUserId")String icResiUserId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 8e762e3239..3e582adbb5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -21,6 +21,7 @@ import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.form.DelIcResiUserFormDTO; import com.epmet.dto.form.IcResiDetailFormDTO; import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.dto.form.IcResiUserPageFormDTO; @@ -89,14 +90,13 @@ public interface IcResiUserService extends BaseService { void update(IcResiUserDTO dto); /** - * 批量删除 + * 单个删除 * - * @param ids * @return void * @author generator * @date 2021-10-26 */ - void delete(String[] ids); + void delete(DelIcResiUserFormDTO formDTO); /** * @Author sun diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 0f20619b1e..25b86988b1 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -127,9 +127,15 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> subTableRes = operCustomizeOpenFeignClient.queryIcResiSubTables(queryDTO); + if (subTableRes.success() && !CollectionUtils.isEmpty(subTableRes.getData())) { + for (String subTalbeName : subTableRes.getData()) { + baseDao.updateSubTableToDel(subTalbeName, formDTO.getIcResiUserId()); + } + } } /** diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 086ae1b1f4..26e20f7407 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -97,5 +97,11 @@ order by ic_resi_user.CREATED_TIME desc + + update ic_resi_user set del_flag='1' where id=#{icResiUserId} + + + update ${subTalbeName} set del_flag='1' where IC_RESI_USER=#{icResiUserId} + \ No newline at end of file From 9ace9a94c678615c447ed838fdec4199485b9938 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 2 Nov 2021 10:17:26 +0800 Subject: [PATCH 088/253] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=8E=89=E5=8E=9F?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=E6=96=B9=E6=B3=95=EF=BC=8C=E5=90=8E=E9=9D=A2?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dataaggre/controller/IcResiUserController.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java index 2d0a8270c6..4058ff5293 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java @@ -10,7 +10,6 @@ import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; import com.epmet.dataaggre.service.epmetuser.IcResiUserService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -39,7 +38,7 @@ public class IcResiUserController { * @author yinzuomei * @date 2021/10/28 10:29 上午 */ - @PostMapping("listresi1") + //@PostMapping("listresi1") public Result> queryListResi(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setCustomerId(tokenDto.getCustomerId()); @@ -47,7 +46,7 @@ public class IcResiUserController { return new Result>().ok(icResiUserService.pageResi(pageFormDTO)); } - @PostMapping("listresi") + //@PostMapping("listresi") public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setCustomerId(tokenDto.getCustomerId()); @@ -62,7 +61,7 @@ public class IcResiUserController { * @author yinzuomei * @date 2021/10/28 10:29 上午 */ - @PostMapping("detail") + //@PostMapping("detail") public Result queryIcResiDetail(@LoginUser TokenDto tokenDto,@RequestBody IcResiDetailFormDTO pageFormDTO){ //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setCustomerId(tokenDto.getCustomerId()); From 9621b2366364bed8d52625b82fdd5258428f5668 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 2 Nov 2021 10:27:52 +0800 Subject: [PATCH 089/253] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=EF=BC=9A=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5excel=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/form/CustomerFormQueryDTO.java | 5 +- .../java/com/epmet/dto/result/FormItem.java | 10 + .../feign/OperCustomizeOpenFeignClient.java | 16 +- .../OperCustomizeOpenFeignClientFallback.java | 10 +- .../epmet/controller/IcFormController.java | 21 +- .../main/java/com/epmet/dao/IcFormDao.java | 10 + .../java/com/epmet/service/IcFormService.java | 12 + .../epmet/service/impl/IcFormServiceImpl.java | 15 + .../src/main/resources/mapper/IcFormDao.xml | 29 ++ epmet-user/epmet-user-server/pom.xml | 5 + .../controller/IcResiUserController.java | 6 + .../handler/DynamicEasyExcelListener.java | 73 ++++ .../handler/IcResiExcelImportHandler.java | 12 + .../com/epmet/service/IcResiUserService.java | 1 + .../service/impl/IcResiUserServiceImpl.java | 311 +++++++++++++++++- 15 files changed, 518 insertions(+), 18 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcResiExcelImportHandler.java diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java index 55e1160110..8759909f38 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/CustomerFormQueryDTO.java @@ -13,7 +13,10 @@ import java.io.Serializable; @Data public class CustomerFormQueryDTO implements Serializable { public interface AddUserInternalGroup {} - @NotBlank(message = "formCode不能为空,居民信息默认传:resi_base_info",groups =AddUserInternalGroup.class ) + // 获取表单相关信息 + public interface GetFormInfoGroup {} + + @NotBlank(message = "formCode不能为空,居民信息默认传:resi_base_info",groups = { AddUserInternalGroup.class, GetFormInfoGroup.class} ) private String formCode; diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java index 552ddbe880..7e3abbaa0e 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java @@ -120,5 +120,15 @@ public class FormItem implements Serializable { * 1可以多选,0单选,默认0 */ private Boolean multiSelect; + + /** + * @description 分组label + * + * @param null + * @return + * @author wxz + * @date 2021.10.28 22:57:15 + */ + private String groupLabel; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 5a02a97f13..58def540a4 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -7,10 +7,7 @@ import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.CustomerFunctionListFormDTO; -import com.epmet.dto.result.CheckFloatFootBarResultDTO; -import com.epmet.dto.result.CustomerFormResultDTO; -import com.epmet.dto.result.DefaultFunctionListResultDTO; -import com.epmet.dto.result.IcFormResColumnDTO; +import com.epmet.dto.result.*; import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; @@ -80,4 +77,15 @@ public interface OperCustomizeOpenFeignClient { @PostMapping(value = "/oper/customize/icform/queryIcResiSubTables", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) Result> queryIcResiSubTables(@RequestBody CustomerFormQueryDTO queryDTO); + + /** + * @description item列表 + * + * @param formDto + * @return + * @author wxz + * @date 2021.10.28 15:19:59 + */ + @PostMapping("/oper/customize/icform/items") + Result> listItems(@RequestBody CustomerFormQueryDTO formDto); } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 8a300aeb19..2420adb817 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -8,10 +8,7 @@ import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.CustomerFunctionListFormDTO; -import com.epmet.dto.result.CheckFloatFootBarResultDTO; -import com.epmet.dto.result.CustomerFormResultDTO; -import com.epmet.dto.result.DefaultFunctionListResultDTO; -import com.epmet.dto.result.IcFormResColumnDTO; +import com.epmet.dto.result.*; import com.epmet.feign.OperCustomizeOpenFeignClient; import java.util.List; @@ -72,4 +69,9 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result> queryIcResiSubTables(CustomerFormQueryDTO queryDTO) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "queryIcResiSubTables", queryDTO); } + + @Override + public Result> listItems(CustomerFormQueryDTO formDto) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "listItems", formDto); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 5443b382a8..8c506cfe74 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -29,10 +29,7 @@ import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; -import com.epmet.dto.result.ConditionResultDTO; -import com.epmet.dto.result.CustomerFormResultDTO; -import com.epmet.dto.result.IcFormResColumnDTO; -import com.epmet.dto.result.TableHeaderResultDTO; +import com.epmet.dto.result.*; import com.epmet.excel.IcFormExcel; import com.epmet.service.IcFormItemService; import com.epmet.service.IcFormService; @@ -179,4 +176,20 @@ public class IcFormController { ValidatorUtils.validateEntity(queryDTO,CustomerFormQueryDTO.AddUserInternalGroup.class); return new Result>().ok(icFormItemService.queryIcResiSubTables(queryDTO.getCustomerId(),queryDTO.getFormCode())); } + + /** + * @description item列表 + * + * @param tokenDto + * @param formDto + * @return + * @author wxz + * @date 2021.10.28 15:19:59 + */ + @PostMapping("items") + public Result> listItems(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto) { + ValidatorUtils.validateEntity(formDto, CustomerFormQueryDTO.GetFormInfoGroup.class); + List rst = icFormService.listItems(tokenDto.getCustomerId(), formDto.getFormCode()); + return new Result>().ok(rst); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java index 846e59ad72..6cd4fa7188 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java @@ -55,4 +55,14 @@ public interface IcFormDao extends BaseDao { List selectListGroup(String formId); FormGroupDTO selectChildGroup(String itemId); + + /** + * @description 通用查询item列表,无固定条件 + * + * @param formId + * @return + * @author wxz + * @date 2021.10.28 16:43:00 + */ + List listItems(@Param("formId") String formId); } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java index 08ae71841b..b1d0dddaf1 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java @@ -22,6 +22,7 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.FormItem; import com.epmet.entity.IcFormEntity; import java.util.List; @@ -104,4 +105,15 @@ public interface IcFormService extends BaseService { * @date 2021/10/26 2:41 下午 */ CustomerFormResultDTO getCustomerForm(CustomerFormQueryDTO formDto); + + /** + * @description 查询item列表 + * + * @param customerId + * @param formCode + * @return + * @author wxz + * @date 2021.10.27 17:41:59 + */ + List listItems(String customerId, String formCode); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index f7cf1fe235..23088c3024 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -131,4 +131,19 @@ public class IcFormServiceImpl extends BaseServiceImpl customerFootBarRedis.setCustomerFormResultDTO(formDto.getFormCode(),formDto.getCustomerId(),resultDTO); return resultDTO; } + + @Override + public List listItems(String customerId, String formCode) { + CustomerFormResultDTO formResultDto=baseDao.selectByCode(customerId, formCode); + if (null == formResultDto) { + throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); + } + + List formItems = baseDao.listItems(formResultDto.getFormId()); + formItems.forEach(i -> { + i.setOptions(baseDao.selectListOption(i.getItemId())); + }); + + return formItems; + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 6310a06195..44d23cda3f 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -210,4 +210,33 @@ g.SORT ASC + diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index c6417f095f..0d8854d5ff 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -13,6 +13,11 @@ jar + + com.alibaba + easyexcel + 2.2.6 + com.epmet epmet-user-client diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index a03b43299d..2f89248a3e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -356,4 +356,10 @@ public class IcResiUserController { } + @PostMapping("import/excel") + public Result importExcelByEasyExcel() { + Object header = icResiUserService.importExcel(); + return new Result().ok(header); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java new file mode 100644 index 0000000000..0abf0f28d0 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java @@ -0,0 +1,73 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 创建一个监听器 + */ +@Slf4j +public class DynamicEasyExcelListener extends AnalysisEventListener> { + + /** + * 表头数据(存储所有的表头数据) + */ + private List> headList = new ArrayList<>(); + + /** + * 数据体 + */ + private List> dataList = new ArrayList<>(); +// Map dataList = new HashMap<>(); + + /** + * 这里会一行行的返回头 + * + * @param headMap + * @param context + */ + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); + //存储全部表头数据 + headList.add(headMap); + } + + /** + * 这个每一条数据解析都会来调用 + * + * @param data + * one row value. Is is same as {@link AnalysisContext#readRowHolder()} + * @param context + */ + @Override + public void invoke(Map data, AnalysisContext context) { + log.info("解析到一条数据:{}", JSON.toJSONString(data)); + dataList.add(data); + } + + /** + * 所有数据解析完成了 都会来调用 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + log.info("所有数据解析完成!"); + } + + public List> getHeadList() { + return headList; + } + + public List> getDataList() { + return dataList; + } +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcResiExcelImportHandler.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcResiExcelImportHandler.java new file mode 100644 index 0000000000..8ae901cd51 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcResiExcelImportHandler.java @@ -0,0 +1,12 @@ +package com.epmet.excel.handler; + +import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl; + +import java.util.Map; + +public class IcResiExcelImportHandler extends ExcelDataHandlerDefaultImpl> { + @Override + public Object importHandler(Map obj, String name, Object value) { + return super.importHandler(obj, name, value); + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 3e582adbb5..cb1f9e748d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -130,4 +130,5 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); + Object importExcel(); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 25b86988b1..587e34a03f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -17,6 +17,7 @@ package com.epmet.service.impl; +import com.alibaba.excel.EasyExcelFactory; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -24,10 +25,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; +import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; @@ -37,17 +41,16 @@ import com.epmet.dao.IcResiUserDao; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; -import com.epmet.dto.result.AllGridsByUserIdResultDTO; -import com.epmet.dto.result.HomeUserResultDTO; -import com.epmet.dto.result.HouseInfoDTO; -import com.epmet.dto.result.IcFormResColumnDTO; +import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; +import com.epmet.excel.handler.DynamicEasyExcelListener; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.redis.IcResiUserRedis; import com.epmet.service.IcResiUserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -57,6 +60,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -69,7 +73,7 @@ import java.util.stream.Collectors; */ @Slf4j @Service -public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService { +public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService, ResultDataResolver { private Logger logger = LogManager.getLogger(IcResiUserServiceImpl.class); @Autowired private IcResiUserRedis icResiUserRedis; @@ -417,4 +421,301 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> headList = readListener.getHeadList(); + List> dataList = readListener.getDataList(); + + Map> headers = mergeHead(headList); + + // 查询form相关信息 + CustomerFormQueryDTO form = new CustomerFormQueryDTO(); + form.setFormCode("resi_base_info"); + Result> result = operCustomizeOpenFeignClient.listItems(form); + List customerItems = getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); + + // 清洗表头数据 + Map abandonedHeaders = washHeaders(headers, customerItems); + + //合并多级表头 + HashMap> combinedHeaders = combineHeaders(headers); + + // 得到客户配置item数据 + Map formItemMap = customerItems.stream().collect( + Collectors.toMap(formItem -> { + String groupLabel = formItem.getGroupLabel(); + String label = formItem.getLabel(); + if (StringUtils.isNotBlank(groupLabel)) { + return groupLabel.concat(":").concat(label); + } else { + return label; + } + }, formItem -> formItem) + ); + HashMap> headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders); + + return headerColumnWrapper; + } + + /** + * @description 合并头 + * + * @param headers + * @return + * @author wxz + * @date 2021.10.28 21:27:18 + */ + private HashMap> combineHeaders(Map> headers) { + HashMap> itemAndColIndexs = new HashMap<>(); + + headers.forEach((k, v) -> { + String tempKey = String.join(":", v); + List colIndexs = itemAndColIndexs.get(tempKey); + if (colIndexs == null) { + colIndexs = new ArrayList<>(); + itemAndColIndexs.put(tempKey, colIndexs); + } + colIndexs.add(k); + }); + + return itemAndColIndexs; + } + + /** + * @description 清洗headers + * + * @param headers + * @param items + * @return + * @author wxz + * @date 2021.10.28 21:07:12 + */ + private Map washHeaders(Map> headers, List items) { + List itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList()); + Map abandonedHeaders = new HashMap<>(); + for (Map.Entry> entry:headers.entrySet()) { + Integer colIdx = entry.getKey(); + List v = entry.getValue(); + int lastPartIndex = v.size() - 1; + String lastValuePart = v.get(lastPartIndex); + if (itemLabels.indexOf(lastValuePart) == -1) { + // 该部分为options,它的上一级是item,那么去掉options这一级 + v.remove(lastPartIndex); + abandonedHeaders.put(colIdx, lastValuePart); + } + } + + return abandonedHeaders; + //headers.forEach((k, v) -> { + // + //}); + } + + /** + * @description 数据整合 + * + * @return + * @author wxz + * @date 2021.10.28 17:08:51 + */ + private HashMap> integrate(Map formItemMap, Map> combinedHeaders, + List> datas, Map abandonedHeaders) { + HashMap> data = new HashMap<>(); + + for (Map.Entry> entry : combinedHeaders.entrySet()) { + String combinedHeader = entry.getKey(); + + FormItem item = formItemMap.get(combinedHeader); + + if (item == null) { + // 如果数据库中没有该项,可能是用户自己定义的项,忽略 + continue; + } + + ColumnWrapper columnWrapper = new ColumnWrapper(); + + // 填充options + columnWrapper.setItemType(item.getItemType()); + String groupLabel = item.getGroupLabel(); + String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel()); + columnWrapper.setCombinedLabel(combinedLabel); + columnWrapper.setColumnName(item.getColumnName()); + columnWrapper.setColIndexs(entry.getValue()); + + if ("remote".equals(item.getOptionSourceType())) { + Map options = listRemoteOptions(item.getOptionSourceValue()); + columnWrapper.setOptions(options); + } else { + Map options = item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue)); + columnWrapper.setOptions(options); + } + + /*switch (item.getItemType()) { + case "input": + case "textarea": + case "datepicker": + case "timerange": + //输入性的 + break; + case "checkbox": + break; + }*/ + + } + return data; + } + + /** + * 获取checkbox列值 + * @param options + * @param writedColIdxs + * @param abandonedHeaders + * @return + */ + private String getCheckBoxColValue(List options, List writedColIdxs, Map abandonedHeaders) { + + Map optionMap = options.stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue)); + + List optionValues = writedColIdxs.stream().map(i -> { + String optionName = abandonedHeaders.get(i); + return optionMap.get(optionName); + }).collect(Collectors.toList()); + + return String.join(",", optionValues); + } + + /** + * 远程获取options + * @param uri + * @return + */ + private Map listRemoteOptions(String uri) { + + return null; + + // 通用api调用,无法实现 + /*if (!uri.startsWith("/api")) uri = "/api".concat(uri); + + NamingService namingService = discoveryProperties.namingServiceInstance(); + ResponseEntity>> response = null; + try { + // 调用gateway服务,查询相关接口 + Instance gatewayInstance = namingService.getAllInstances(ServiceConstant.EPMET_GATEWAY).get(0); + String ip = gatewayInstance.getIp(); + int port = gatewayInstance.getPort(); + + String url = String.format("http://%s:%s%s", ip, port, uri); + + ParameterizedTypeReference>> tr = new ParameterizedTypeReference>>() {}; + response = new RestTemplate().exchange(url, HttpMethod.POST, null, tr); + } catch (NacosException e) { + e.printStackTrace(); + } + + if (response != null && (response.getStatusCode() == HttpStatus.OK)) { + List options = response.getBody().getData(); + if (options == null) { + System.out.println(6); + } + return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue)); + } else { + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + }*/ + + } + + /** + * @description 合并表头 + * + * @param headList + * @return + * @author wxz + * @date 2021.10.27 16:17:34 + */ + private Map> mergeHead(List> headList) { + Map l1 = headList.get(0); + Map l2 = headList.get(1); + Map l3 = headList.get(2); + + String l1LastHeadName = ""; + String l2LastHeadName = ""; + + //Map resultMap = new HashMap<>(); + HashMap> result = new HashMap<>(); + + for (Map.Entry entry : l1.entrySet()) { + + StringBuilder headerNameConcatStr = new StringBuilder(); + + Integer key = entry.getKey(); + String l1TempValue = entry.getValue(); + + String l2TempValue = l2.get(key); + String l3TempValue = l3.get(key); + + if (StringUtils.isNotBlank(l1TempValue)) { + l1LastHeadName = l1TempValue; + } + + if (StringUtils.isNotBlank(l2TempValue)) { + l2LastHeadName = l2TempValue; + } + + // 开始拼接 + if (StringUtils.isNotBlank(l3TempValue)) { + //headerNameConcatStr.append(l1LastHeadName).append(":").append(l2LastHeadName).append(":").append(l3TempValue); + //resultMap.put(key, headerNameConcatStr.toString()); + ArrayList parts = new ArrayList<>(); + parts.add(l1LastHeadName); + parts.add(l2LastHeadName); + parts.add(l3TempValue); + result.put(key, parts); + continue; + } + + if (StringUtils.isNotBlank(l2TempValue)) { + //headerNameConcatStr.append(l1LastHeadName).append(":").append(l2LastHeadName); + //resultMap.put(key, headerNameConcatStr.toString()); + ArrayList parts = new ArrayList<>(); + parts.add(l1LastHeadName); + parts.add(l2LastHeadName); + result.put(key, parts); + continue; + } + + if (StringUtils.isNotBlank(l1TempValue)) { + //headerNameConcatStr.append(l1LastHeadName); + //resultMap.put(key, headerNameConcatStr.toString()); + ArrayList parts = new ArrayList<>(); + parts.add(l1LastHeadName); + result.put(key, parts); + continue; + } + + } + return result; + } + + /** + * @description 列信息封装 + * + * @return + * @author wxz + * @date 2021.10.28 22:18:05 + */ + @Data + public static class ColumnWrapper { + private String combinedLabel; + private String columnName; + private String itemType; + private List colIndexs; + //private List colContents; + private String colValue; + + // key:label,value:value + private Map options; + } } \ No newline at end of file From 5a397acffa91632e50363f72a4e50f16537e410d Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 2 Nov 2021 10:53:16 +0800 Subject: [PATCH 090/253] test --- .../epmet/dto/form/DynamicQueryFormDTO.java | 22 +++++++++++++++++++ .../controller/IcResiUserController.java | 8 +++++++ .../java/com/epmet/dao/IcResiUserDao.java | 15 +++++++++++++ .../com/epmet/service/IcResiUserService.java | 10 +++++---- .../service/impl/IcResiUserServiceImpl.java | 14 ++++++++++++ 5 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DynamicQueryFormDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DynamicQueryFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DynamicQueryFormDTO.java new file mode 100644 index 0000000000..42e163838b --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/DynamicQueryFormDTO.java @@ -0,0 +1,22 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @Description test + * @Author yinzuomei + * @Date 2021/11/2 10:38 上午 + */ +@Data +public class DynamicQueryFormDTO implements Serializable { + private String customerId; + private String formCode="resi_base_info"; + @NotBlank(message = "resultTableName不能为空") + private String resultTableName; + private List conditions; +} + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index a03b43299d..78b281e44d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -356,4 +356,12 @@ public class IcResiUserController { } + @PostMapping("test") + public Result>> test(@LoginUser TokenDto tokenDto,@RequestBody DynamicQueryFormDTO formDTO){ + formDTO.setCustomerId(tokenDto.getCustomerId()); + return new Result>>().ok(icResiUserService.dynamicQuery(formDTO.getCustomerId(), + formDTO.getFormCode(), + formDTO.getResultTableName(), + formDTO.getConditions())); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 47b63f6eec..1d4f66a4cb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -80,4 +80,19 @@ public interface IcResiUserDao extends BaseDao { int updateToDel(String icResiUserId); int updateSubTableToDel(@Param("subTalbeName") String subTalbeName, @Param("icResiUserId")String icResiUserId); + + /** + * 接口名称 + * + * @param customerId 客户id + * @param resultTableName 获取哪个表的数据??? + * @param conditions 前端传入的查询入参 + * @return java.util.List> + * @author yinzuomei + * @date 2021/11/2 10:35 上午 + */ + List> dynamicQuery(@Param("customerId")String customerId, + @Param("resultTableName")String resultTableName, + @Param("conditions") List conditions, + @Param("subTables") List subTables); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 3e582adbb5..129dd16df0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -21,10 +21,7 @@ import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; -import com.epmet.dto.form.DelIcResiUserFormDTO; -import com.epmet.dto.form.IcResiDetailFormDTO; -import com.epmet.dto.form.IcResiUserFormDTO; -import com.epmet.dto.form.IcResiUserPageFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.entity.IcResiUserEntity; @@ -130,4 +127,9 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); + + List> dynamicQuery(String customerId, + String formCode, + String resultTableName, + List conditions); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 25b86988b1..109ae5b3a5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -417,4 +417,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> dynamicQuery(String customerId, + String formCode, + String resultTableName, + List conditions){ + CustomerFormQueryDTO queryDTO=new CustomerFormQueryDTO(); + queryDTO.setCustomerId(customerId); + queryDTO.setFormCode(formCode); + Result> subTablesRes=operCustomizeOpenFeignClient.querySubTables(queryDTO); + List subTables=new ArrayList<>(); + if(subTablesRes.success()&&CollectionUtils.isNotEmpty(subTablesRes.getData())){ + subTables =subTablesRes.getData(); + } + return baseDao.dynamicQuery(customerId,resultTableName,conditions,subTables); + } } \ No newline at end of file From 4155550ea5d07b3b3992e1c41f53d748587f9fda Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 2 Nov 2021 11:07:32 +0800 Subject: [PATCH 091/253] test1 --- .../main/resources/mapper/IcResiUserDao.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 26e20f7407..616d55e711 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -104,4 +104,22 @@ update ${subTalbeName} set del_flag='1' where IC_RESI_USER=#{icResiUserId} + + \ No newline at end of file From 249caedb55470f676721c68e14fe168f1f73b917 Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 2 Nov 2021 11:20:04 +0800 Subject: [PATCH 092/253] =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 34 ++++++++++++++---- .../main/resources/excel/ic_resi_info_cid.xls | Bin 79872 -> 79872 bytes 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 6f6c955a42..f93c505efb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -57,6 +57,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.URLEncoder; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; /** @@ -330,21 +331,40 @@ public class IcResiUserController { pageFormDTO.setPageFlag(false); //PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); //List> list = mapPageData.getList(); - List> list = (List>)JSON.parse("[{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]" - ); - Map mapData = new HashMap<>(); + List> list = icResiUserService.dynamicQuery(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + //list = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("list:{}", JSON.toJSONString(list)); - mapData.put("list", list); + CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); String templatePath = "excel/ic_resi_info_cid.xls"; - TemplateExportParams params = new TemplateExportParams(templatePath, 0,1); + TemplateExportParams params = new TemplateExportParams(templatePath,true); + + Map> sheetMap = new HashMap<>(); + Map mapData = new HashMap<>(); + mapData.put("list", list); + sheetMap.put(0,mapData); + AtomicInteger n = new AtomicInteger(); + resiFormItems.getItemList().forEach(item->{ + if (item.getChildGroup() != null){ + if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { + sheetMap.put( n.incrementAndGet(),mapData); + System.out.println(n.get()); + } + } + }); + for (FormGroupDTO group : resiFormItems.getGroupList()) { + + } + + + - Workbook workbook = ExcelExportUtil.exportExcel(new TemplateExportParams(templatePath), mapData); + Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); //header response.setHeader("content-Type", "application/vnd.ms-excel"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("继续追踪导出详情-" + ".xls", "UTF-8")); + response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("居民信息.xls", "UTF-8")); workbook.write(response.getOutputStream()); /* //方式1 通过mv导出 diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index 51a5d41a945f26f68fb9b5b5e7fb36b05ed6d092..b6a67b92057a4a34c4e65381aaa929e24b3f3344 100644 GIT binary patch delta 5896 zcmchbdvsLQ6~_0ucP5$1OeT|=kc@edfEdC zlXHLjy!ZLeKIf(-YHNwwcKl1zlSs(_Xf>ik2K6lUcb;A-x9b`5k}X%R(*x3D%aqOd z)!4G-2|ZiBj=X{PT=|wQAUEOnfh|MsLfJw*Ka5|4-76o{9kK#;pFJR7&~s&#-D}LX zXV}9|BKo+)OSGFPSP(2ATV}yY%Allf_H5JMz5ETPy;r>a+Vu2@E8-$saS!cuXa~w$h0TP9CvZJ zyW?`qTz|aQJ2W#`P!b?IXxicW%NF2z)1DQ#uWf8>&u`Bs+i=sKrtInImfaey$Fko< z^bTPigQ|m+c!l$^6^?b>eW2NLTWX%{n;H;FvOKjooZdrCR}c2?Em|JV?4f-3m9?~i zp|eY-5^YRR&va!%OqTe%cQDZON%w|^nfC7Gtq$DMm3oc5-IF;pIX<+@oYuW&zS&}G z*YcQ|wTj(GP-cxl{>0PQ_}KHgusN3X{<-mqcS@1=!DuK&s=%Dcd;p$YWLh zu}th4w(ugwKXH2{xuR@eCPrb1?ZQi5Iw*p8?hp=g&}X#YwG)+(8EbAV7cLu#NAAj; zP(aa;Ck z)TxGbI!&N)G>R(m9BZtS>R_tH-x?UDdt{MT+-Q`J+^0z`G|8@$C~lPXp>ijlnkT-$ zaO5m0Lq~Whb(3xzUwV6Xb@NY4r({>}t*)?hqbD3G_tX*HKZU5^j$Ks` zy2B0d*ykvx!&@Qhr1UQ2>q7o6l+lHHb)ihqbk##vm%IRIMp$KD1DvS{lA&3OazL{c z<$~^1ln1&?QEyPAqI}TZiV8qYiu#y@{;k>f?UH$I7wQN4uBvz)=pIFdpgD^AgPIi; zfjT`p0Q5bTHxM+JC>-m45b$1=IT$og(eO`y(2{uZc3 z7i1);vy~udnJPI7wA>h87jW8Ov&)k$*&Z9m5<~+VzG-R3qK3ybC$={o5R-`_6Wzi; z3S@qgA#V;U{8u+CaB4?5;WQavP94}VR?z7{nGQgQTytWKYa>?l4BT43m?FpA;(6J= ze4ZTMctJa=8Krmo^ze^Rjr~ZJip{@5kq7jUqBPLMioBpl6s3b!D)NDTtjG^q6(gQs zkj5(#pb2u(=KNIdpM4QR_#%1gi@ca685a0M9(%b`PMT8?v!=lcWy-~K@_Jb{d56dQ z6y%RA@`)U|v^B{%JjZ8Gc@IZSvlb8mAxjsIF!Jv^m?mo)at0s*Vk`pj1y5oFM{MUV z;lnuMpALLbCbGRy^cN&wS$3rJ4#LZ<8SlJMQZoFO+2thBF7jsCA9LW2Q%5&nNI<QgJ0#(MCnA#HSRo5;rMg zC2m&4N^Di+qbhn@5i9W*iZVdY#E7SYg^O==p4(MlIjSdlW^+;aSv4kJx-E)4*elN| zN&~@-F&TJ4zfzPAdR`Ilj29I7kr$8Y0&J*uOfiZenDEu! z>rhNw04Z2H8Qq*ad$%&BVr^ek#Om3jh}F}kh}H93MXa8e6!}2#d`xGoo|hwGpU5&E z+c!pYIRw5h zz%BGUMIO3^UR9I^I;6-8dQDL}-cMdvZh+wI6pOLs51&9#DL=Gr-oS4d45`< z3l|4drdpTtQ$v*LJU=zW8uLOCE19@F8s2(B@~P8(!W=?0TnRd_zZ!IuNPLdQ!>ERf zTp}gDh-j4fBBD{^i-<;vFCrXDgY*XGAf#;d8<$QO+TFFdlr?K7a1s^@xg$Elxbtj* zxAa4L7F}vlJ|7Fn5p^Kd@U!^K1+eGQ$BF$+~_KH38d!7F6GFY$98PmmqQ<6%ko{c_ud zRjE879>^6BA1=q)obutrDIY$Z^5MfN4xfnEEe6Z`FO~~kZogQa;=m1hf=$plN93qm zTrj@4v`G*D0WDcK&Z`tkRDY&aIS5$YTX(%d;?0EMG1?3sduY$)!NcP>9mh+^j^ppw z8kwEPGXy=6E2y^ZZMS$v;DXmS-y?9tI~<#U^{#P55uebA=H}#Bo0asIB0iztjuB7c zD_pTht7g919Xl`UC|WvTDwyL${OfI7<`Xa4oPWih5V!XYBw{^Bp|ibTLxdi|D<+H#A;&vfsh2hO{ykBcDM YXc_v+$v?I2A0*1{qHo*95|NzzKelEmd;kCd delta 5203 zcmbW53v`sl702&8lnV30Ku?8wh0EY8uB10Nk~X&LMRYlfMSsi zsHmLaMy}3(6-SWw`{B?xAIJ9LCiX&HB)PK zCgew{DH@)DN%m^;l!RQ)HcpcV67u_6TleJb$szMpP41WSloVaATbr)Sv5cbxKSrej zPh!BAhKCKs)`VOt);*le9j*dqi_&;M2wD(d=^7?sTa&{*7L={R#-kdA(>x3P|u z4ZF(EY|EfW`OIl^Z2zW0$9;_Guo{X)m{lRxTDP%UZJxeKu`prm*G8T`#E+v{KSU&?-rjK&wHe z`sybGZ;*`_fo_yE1++%eRM1V5E(ZOKzgLsFc&(I0AiG)8bkI6UGe83_p9vapNHJ(& zmMEx0j{6a4y*hV((8iMZwsl!<3z~=+Sx|^n-guYd5QjxCi_M|5j&qfjTr6{7FgCgq7P(=M>6cg2x8D$~$_lsI^9*U?v zlnx6D=oaRLZLlx?or7gNM3WVzm#yb)e_E^#P3ifAvYjYW-ModUtR{|p@osJ3I_=6R zLjH}Gja!K>UzWY0u(qOHmsQ5bAd&Bi?W{{*v2ukj%UShQ`L?RRE@X2v$}u~%3#Cq! zUe+{VkJiGy`;#gn!iLZpM+{L`)i{j(oB zUz_%Qf4-0;hGbC|hQx%H_DV?8$1q`vrM(uZIJG%ap1))l48G#t)fGe)b=NN-nsVJ? zq@r3c>Ok}I%CcIb`D+YmZ49)aPVc$8^7j}^q-dKqjizaJF%_R}rMp}VaL$`67IxE# zg+zb9?vi>jRP1*HMNoR#CBn+dIgqBi*@a7Lp((3Md|zH8zMCt>*R?==6U&=U(=l+8 z7?|x611+qjBJWBJsSaqS>HeHSGx)Z?aHb7e^RYPQ43lTlOwHsljpp9irS@a(L?e;U z_pejmZT2Zj8&h*%$YZLr^%EA`fMFu*VFS|P7D;Zj zy3-($0#Vu|iGeEks(Q*hfMc}nRUdlXF4-|y2V>+kn-ckD9zK`f~H9-_i6*v<^bpNo5WXU74t zt@GEptvNgogR?nrORondiQNxO|}zO zvHDYVLM^=WaVH+`Gxmj?;sK3U1d7)ymmUAY!Lq~&C>|J8&zrg@I0hDcg$T5Z$6#Q( zk1enKXiaf5QhqaQXt`tZW}Dtc=>N(0(#73!vcWRg&1c9g>72UXUal@uDOj zs7I0?^b)^zX{P%2&RL2b+ozo$Ud9)_I<2RIv6D9D(elWTF?t^P{rqrO5D#j?X`7E- z7e|#DXKkIxBgWz(Co6Y!y+hP@lxWK_QkzcOnA&+@tto4#p;-_4UD6KiBs^C@dR~_O z#a`@|cH6E>5_Z21QPZmtVfL3c-nGu0{=h)|h`i*|bNJ8;_*Dl02YSC3!)wNlL*p>bH`7px61qk4DD^?gaeJ zf_37`)?!k@7Dq{3?;>8sZ5+j)IeLmJaDbj*3Z8sX!VAdgl?1Ahy>N>d@?^+ygBoN5 z;r$|ruljg|rI!Mv@b$;jT)Hliv~R%S|2&kYhL7i39A9av`vK0W1N``@LVnH3WOdWY zus1&5!7|;7k*>nz)Kvb)*P9&u_@_XF{;~;)#I>2wEG#$kgMHHxP<8QaC%fGKWIxd< zGowzMy6E&4vuB@S<_|o#*#3dQn63rJi}YL~Fut`p#s78ak>GTmI}*z66Vn)d6JoSu zG+%VOFTUKxp5Z6H@%7}nnPQrKz%WjKFT5#9oF8vV66eQ3N#guCWY7;=RMCiDa>HsT z{HGU><~iJIe8tkto+&=I&20NHS-$}H#*YVB5x;D^JwDIFygd`s+0AaZpRgI2!;g}b z#5W(y*50L>D@K^KEiv*~%V%*PI)}ana^-8lZSq39Hx}+W4@WrLlE;GPI~#U?+Y`!T k_nN%7R-8O=#Ss>T&W`R;_UfKj# Date: Tue, 2 Nov 2021 15:43:04 +0800 Subject: [PATCH 093/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A1=86=E6=9F=A5=E8=AF=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcBuildingController.java | 2 +- .../java/com/epmet/controller/IcBuildingUnitController.java | 2 +- .../java/com/epmet/controller/IcNeighborHoodController.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java index 565b66c23f..15ba83ef46 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingController.java @@ -91,7 +91,7 @@ public class IcBuildingController { * @Date 2021/10/26 14:46 */ @PostMapping("buildingoption") - public Result> getBuildingOptions(IcBuildingDTO dto) { + public Result> getBuildingOptions(@RequestBody IcBuildingDTO dto) { return new Result>().ok(icBuildingService.getBuildingOptions(dto.getNeighborHoodId())); } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java index 6d0a832a3c..7ee2138893 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcBuildingUnitController.java @@ -90,7 +90,7 @@ public class IcBuildingUnitController { * @Date 2021/10/26 14:46 */ @PostMapping("unitoption") - public Result> getUnitOptions(IcBuildingUnitDTO dto) { + public Result> getUnitOptions(@RequestBody IcBuildingUnitDTO dto) { return new Result>().ok(icBuildingUnitService.getUnitOptions(dto.getBuildingId())); } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java index cdddab91c8..8af8c48978 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -91,7 +91,7 @@ public class IcNeighborHoodController { * @Date 2021/10/26 14:38 */ @PostMapping("neighborhoodoption") - public Result> getNeighborHoodOptions(IcNeighborHoodDTO dto) { + public Result> getNeighborHoodOptions(@RequestBody IcNeighborHoodDTO dto) { return new Result>().ok(icNeighborHoodService.getNeighborHoodOptions(dto.getAgencyId(), dto.getGridId())); } From 5fe1ea51fba01515133b870145be95ff6b7f9722 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Tue, 2 Nov 2021 16:26:55 +0800 Subject: [PATCH 094/253] =?UTF-8?q?=E5=90=8D=E5=AD=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcBuildingDao.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index 3f9fc515cf..2b55aaaeb8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -292,11 +292,12 @@ From 1be87cef4c657bf7970c53f9cb295a6ccb0be817 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 2 Nov 2021 16:41:37 +0800 Subject: [PATCH 095/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E7=AE=A1=E7=90=86=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=20=E6=A8=A1=E7=B3=8A=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E6=A5=BC=E5=AE=87=E5=8D=95=E5=85=83=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/controller/BuildingController.java | 2 +- .../src/main/resources/mapper/IcBuildingDao.xml | 4 ++-- .../src/main/resources/mapper/IcHouseDao.xml | 8 ++++---- .../src/main/resources/mapper/IcNeighborHoodDao.xml | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 2e65729cab..e576abec7c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -209,7 +209,7 @@ public class BuildingController { @PostMapping("buildingunitlist") public Result buildingunitlist(@LoginUser TokenDto tokenDTO,@RequestBody IcBulidingUnitFormDTO icBulidingUnitFormDTO ){ ValidatorUtils.validateEntity(icBulidingUnitFormDTO); - List icBuildingUnitEntityList = icBuildingUnitDao.selectList(new QueryWrapper().lambda().eq(IcBuildingUnitEntity::getBuildingId, icBulidingUnitFormDTO.getBuildingId())); + List icBuildingUnitEntityList = icBuildingUnitDao.selectList(new QueryWrapper().lambda().eq(IcBuildingUnitEntity::getBuildingId, icBulidingUnitFormDTO.getBuildingId()).orderByAsc(IcBuildingUnitEntity::getUnitNum)); List result = new ArrayList<>(); icBuildingUnitEntityList.forEach(item->{ JSONObject jsonObject = new JSONObject(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index 2b55aaaeb8..3d110df7bd 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -122,10 +122,10 @@ AND a.ID in (select distinct BUILDING_ID from ic_house e - AND e.OWNER_NAME = #{house.ownerName} + AND e.OWNER_NAME like concat('%',#{house.ownerName},'%') - AND e.OWNER_PHONE = #{house.ownerPhone} + AND e.OWNER_PHONE like concat('%',#{house.ownerPhone},'%') and e.DEL_FLAG='0' diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index f287cd7370..22aea14603 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -134,10 +134,10 @@ AND a.BUILDING_ID = #{house.buildingId} - AND a.OWNER_NAME = #{house.ownerName} + AND a.OWNER_NAME like concat('%',#{house.ownerName},'%') - AND a.OWNER_PHONE = #{house.ownerPhone} + AND a.OWNER_PHONE like concat('%',#{house.ownerPhone},'%') AND a.DEL_FLAG = #{house.delFlag} @@ -167,10 +167,10 @@ AND a.BUILDING_ID = #{house.buildingId} - AND a.OWNER_NAME = #{house.ownerName} + AND a.OWNER_NAME like concat('%',#{house.ownerName},'%') - AND a.OWNER_PHONE = #{house.ownerPhone} + AND a.OWNER_PHONE like concat('%',#{house.ownerPhone},'%') AND a.DEL_FLAG = #{house.delFlag} diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index 8c00a943d6..342b567ba7 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -91,10 +91,10 @@ AND a.ID in (select NEIGHBOR_HOOD_ID from ic_house e - AND e.OWNER_NAME = #{house.ownerName} + AND e.OWNER_NAME like concat('%',#{house.ownerName},'%') - AND e.OWNER_PHONE = #{house.ownerPhone} + AND e.OWNER_PHONE like concat('%',#{house.ownerPhone},'%') and e.DEL_FLAG='0' @@ -134,10 +134,10 @@ AND a.ID in (select distinct NEIGHBOR_HOOD_ID from ic_house e - AND e.OWNER_NAME = #{house.ownerName} + AND e.OWNER_NAME like concat('%',#{house.ownerName},'%') - AND e.OWNER_PHONE = #{house.ownerPhone} + AND e.OWNER_PHONE like concat('%',#{house.ownerPhone},'%') and e.DEL_FLAG='0' From 4f3bcda0a60030e32b377780593694788231ce7c Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Tue, 2 Nov 2021 16:50:36 +0800 Subject: [PATCH 096/253] =?UTF-8?q?=E6=88=BF=E5=B1=8B=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A1=86=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcHouseServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index a1811351c2..0a6f7f50c4 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -115,12 +115,12 @@ public class IcHouseServiceImpl extends BaseServiceImpl getHouseOption(HouseFormDTO formDTO) { - if (StringUtils.isBlank(formDTO.getUnitId())) { - log.error("单元ID为空"); + if (StringUtils.isBlank(formDTO.getBuildingId()) && StringUtils.isBlank(formDTO.getUnitId())) { + log.error("楼栋和单元ID为空"); return Collections.emptyList(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - //wrapper.eq(StringUtils.isNotBlank(formDTO.getBuildingId()), IcHouseEntity::getBuildingId, formDTO.getBuildingId()); + wrapper.eq(StringUtils.isNotBlank(formDTO.getBuildingId()), IcHouseEntity::getBuildingId, formDTO.getBuildingId()); wrapper.eq(StringUtils.isNotBlank(formDTO.getUnitId()), IcHouseEntity::getBuildingUnitId, formDTO.getUnitId()); wrapper.last("ORDER BY CONVERT ( HOUSE_NAME USING gbk ) ASC"); List list = baseDao.selectList(wrapper); From d2deb8cbf598f51f0aef69b7e4b4067cd0402aed Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 2 Nov 2021 17:07:14 +0800 Subject: [PATCH 097/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=B1=85=E6=B0=91=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/EpmetAdminOpenFeignClient.java | 51 ++++ .../EpmetAdminOpenFeignClientFallback.java | 26 ++ .../epmet/feign/GovOrgOpenFeignClient.java | 60 ++++- .../GovOrgOpenFeignClientFallback.java | 35 ++- .../epmet/feign/EpmetUserOpenFeignClient.java | 4 + .../EpmetUserOpenFeignClientFallback.java | 6 + epmet-user/epmet-user-server/pom.xml | 5 + .../controller/IcResiUserController.java | 22 +- .../com/epmet/service/IcResiUserService.java | 3 +- .../service/impl/IcResiUserServiceImpl.java | 245 ++++++++++++++---- 10 files changed, 398 insertions(+), 59 deletions(-) diff --git a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java index 65b73cdad3..9faf6cabaf 100644 --- a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java +++ b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java @@ -1,6 +1,7 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.result.CorsConfigResultDTO; import com.epmet.feign.fallback.EpmetAdminOpenFeignClientFallbackFactory; @@ -21,4 +22,54 @@ public interface EpmetAdminOpenFeignClient { */ @PostMapping("/sys/cors-config/list") Result> list(); + + /** + * @Description 文化程度 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("/sys/dict/data/education") + Result> getEducationOption(); + + /** + * @Description 住房性质 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("/sys/dict/data/house") + Result> getHouseOption(); + + /** + * @Description 民族 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("/sys/dict/data/nation") + Result> getNationOption(); + + /** + * @Description 九小场所 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("/sys/dict/data/ninesmallplaces") + Result> getNineSmallPlacesOption(); + + /** + * @Description 人员关系 + * @Param + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 17:27 + */ + @PostMapping("/sys/dict/data/relationship") + Result> getRelationshipOption(); } diff --git a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java index 69d8a45bbc..6ba1f8bee7 100644 --- a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java +++ b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java @@ -1,6 +1,7 @@ package com.epmet.feign.fallback; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.result.CorsConfigResultDTO; @@ -15,4 +16,29 @@ public class EpmetAdminOpenFeignClientFallback implements EpmetAdminOpenFeignCli public Result> list() { return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "list", null); } + + @Override + public Result> getEducationOption() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getEducationOption", null); + } + + @Override + public Result> getHouseOption() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getHouseOption", null); + } + + @Override + public Result> getNationOption() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getNationOption", null); + } + + @Override + public Result> getNineSmallPlacesOption() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getNineSmallPlacesOption", null); + } + + @Override + public Result> getRelationshipOption() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getRelationshipOption", null); + } } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index 8abaab3de7..d7621bd88b 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -1,10 +1,9 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.utils.Result; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.CustomerGridDTO; -import com.epmet.dto.CustomerPartyBranchDTO; +import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.feign.fallback.GovOrgOpenFeignClientFallbackFactory; @@ -453,4 +452,59 @@ public interface GovOrgOpenFeignClient { @PostMapping(value = "/gov/org/house/queryListHouseInfo",consumes = MediaType.APPLICATION_JSON_VALUE) Result> queryListHouseInfo(@RequestBody Set houseIds); + + + + /** + * @Description 获取组织下网格选项 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:02 + */ + @PostMapping("/gov/org/customergrid/gridoption") + Result> getGridOption(@RequestBody AgencyIdFormDTO formDTO); + + /** + * 获取网格下支部小组 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/27 9:58 + */ + @PostMapping("/gov/org/customerpartybranch/branchoption") + Result> getBranchOption(@RequestBody CustomerPartyBranchDTO formDTO); + + /** + * @Description 获取小区内的楼栋 + * @Param dto + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:46 + */ + @PostMapping("/gov/org/icbuilding/buildingoption") + Result> getBuildingOptions(IcBuildingDTO dto); + + /** + * @Description 获取楼栋内单元 + * @Param dto + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:46 + */ + @PostMapping("/gov/org/icbuildingunit/unitoption") + Result> getUnitOptions(IcBuildingUnitDTO dto); + + @PostMapping("/gov/org/ichouse/houseoption") + Result> getHouseOption(@RequestBody HouseFormDTO formDTO); + + /** + * @Description 获取网格下小区列表 + * @Param dto + * @Return {@link Result< List< OptionResultDTO>>} + * @Author zhaoqifeng + * @Date 2021/10/26 14:38 + */ + @PostMapping("/gov/org/icneighborhood/neighborhoodoption") + Result> getNeighborHoodOptions(IcNeighborHoodDTO dto); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 98d3d64927..7e53823382 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -1,11 +1,10 @@ package com.epmet.feign.fallback; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.CustomerGridDTO; -import com.epmet.dto.CustomerPartyBranchDTO; +import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.feign.GovOrgOpenFeignClient; @@ -276,6 +275,36 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "queryListHouseInfo", houseIds); } + @Override + public Result> getGridOption(AgencyIdFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getGridOption", formDTO); + } + + @Override + public Result> getBranchOption(CustomerPartyBranchDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getBranchOption", formDTO); + } + + @Override + public Result> getBuildingOptions(IcBuildingDTO dto) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getBuildingOptions", dto); + } + + @Override + public Result> getUnitOptions(IcBuildingUnitDTO dto) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getUnitOptions", dto); + } + + @Override + public Result> getHouseOption(HouseFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getHouseOption", formDTO); + } + + @Override + public Result> getNeighborHoodOptions(IcNeighborHoodDTO dto) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getNeighborHoodOptions", dto); + } + @Override public Result selectPidsByGridId(String gridId) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectPidsByGridId", gridId); diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index cbec879b5b..47567c16f7 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -2,6 +2,7 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.*; @@ -646,4 +647,7 @@ public interface EpmetUserOpenFeignClient { */ @GetMapping(value = "/epmetuser/user/queryUserClient/{userId}") Result queryUserClient(@PathVariable("userId") String userId); + + @PostMapping("/epmetuser/icresidemanddict/demandoption/demandoption") + Result> getDemandOptions(); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index 183196dad8..c32f26501b 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -1,6 +1,7 @@ package com.epmet.feign.fallback; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; @@ -463,4 +464,9 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien public Result queryUserClient(String userId) { return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "queryUserClient", userId); } + + @Override + public Result> getDemandOptions() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getDemandOptions", null); + } } diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index 0d8854d5ff..8b47abc5ee 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -13,6 +13,11 @@ jar + + com.epmet + epmet-admin-client + 2.0.0 + com.alibaba easyexcel diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 2f89248a3e..07a88ee80e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -37,11 +37,9 @@ import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; -import com.epmet.dto.result.CustomerFormResultDTO; -import com.epmet.dto.result.FormGroupDTO; -import com.epmet.dto.result.FormItem; -import com.epmet.dto.result.HomeUserResultDTO; +import com.epmet.dto.result.*; import com.epmet.excel.IcResiUserExcel; +import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; import lombok.extern.slf4j.Slf4j; @@ -75,6 +73,8 @@ public class IcResiUserController { private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @Autowired private IcResiUserService icResiUserService; + @Autowired + private EpmetUserOpenFeignClient epmetUserOpenFeignClient; @GetMapping("page") public Result> page(@RequestParam Map params){ @@ -357,9 +357,17 @@ public class IcResiUserController { } @PostMapping("import/excel") - public Result importExcelByEasyExcel() { - Object header = icResiUserService.importExcel(); - return new Result().ok(header); + public Result importExcelByEasyExcel(@LoginUser TokenDto loginUser) { + + LoginUserDetailsFormDTO userForm = new LoginUserDetailsFormDTO(); + userForm.setApp(loginUser.getApp()); + userForm.setClient(loginUser.getClient()); + userForm.setUserId(loginUser.getUserId()); + + Result loginUserDetails = epmetUserOpenFeignClient.getLoginUserDetails(userForm); + + Object result = icResiUserService.importExcel(loginUserDetails.getData().getAgencyId()); + return new Result().ok(result); } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index cb1f9e748d..b442e4223f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -27,6 +27,7 @@ import com.epmet.dto.form.IcResiUserFormDTO; import com.epmet.dto.form.IcResiUserPageFormDTO; import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.entity.IcResiUserEntity; +import com.epmet.service.impl.IcResiUserServiceImpl; import java.util.List; import java.util.Map; @@ -130,5 +131,5 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); - Object importExcel(); + Object importExcel(String currUserAgencyId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 587e34a03f..5cc8c10a05 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.exception.EpmetErrorCode; @@ -38,12 +39,13 @@ import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.IcResiUserDTO; +import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; import com.epmet.excel.handler.DynamicEasyExcelListener; +import com.epmet.feign.EpmetAdminOpenFeignClient; +import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.redis.IcResiUserRedis; @@ -81,9 +83,13 @@ public class IcResiUserServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( @@ -422,9 +428,21 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> headList = readListener.getHeadList(); List> dataList = readListener.getDataList(); @@ -455,11 +473,69 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formItem) ); - HashMap> headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders); + Map headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders); + + // 持久化 + persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders); return headerColumnWrapper; } + /** + * 持久化 + * @param headerColumnWrapper 数据库列包装信息 + * @param dataRows 数据行集合 + * @param currUserAgencyId 当前用户的组织id + * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 + */ + private void persist(Map headerColumnWrapper, List> dataRows, String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel) { + for (Map row : dataRows) { + + for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { + + String itemId = columnWrapperEntry.getKey(); + ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); + if ("input".equals(columnWrapper.getItemType()) + || "textarea".equals(columnWrapper.getItemType()) + || "datepicker".equals(columnWrapper.getItemType()) + || "timerange".equals(columnWrapper.getItemType()) + ) { + + String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + columnWrapper.setCellContent(cellContent); + columnWrapper.setColValue(cellContent); + + } else if ("select".equals(columnWrapper.getItemType()) + || "radio".equals(columnWrapper.getItemType())){ + + String optionSourceType = columnWrapper.getOptionSourceType(); + // 取单元格的内容 + String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + columnWrapper.setCellContent(cellContent); + + if ("local".equals(optionSourceType)) { + // 根据单元格内容,取到指定的option + Map options = columnWrapper.getOptions(); + String colValue = options.get(cellContent); + columnWrapper.setColValue(colValue); + } else { + // remote类型 + + Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId); + String colValue = options.get(cellContent); + columnWrapper.setColValue(colValue); + } + } else if ("checkbox".equals(columnWrapper.getItemType())) { + String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel); + columnWrapper.setColValue(checkBoxColValue); + } + + + + } + } + } + /** * @description 合并头 * @@ -509,9 +585,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { - // - //}); } /** @@ -521,9 +594,11 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> integrate(Map formItemMap, Map> combinedHeaders, + private Map integrate(Map formItemMap, Map> combinedHeaders, List> datas, Map abandonedHeaders) { - HashMap> data = new HashMap<>(); + +// HashMap> tables = new HashMap<>(); + Map columns = new HashMap<>(combinedHeaders.size()); for (Map.Entry> entry : combinedHeaders.entrySet()) { String combinedHeader = entry.getKey(); @@ -539,49 +614,41 @@ public class IcResiUserServiceImpl extends BaseServiceImpl options = listRemoteOptions(item.getOptionSourceValue()); - columnWrapper.setOptions(options); - } else { - Map options = item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue)); - columnWrapper.setOptions(options); - } - - /*switch (item.getItemType()) { - case "input": - case "textarea": - case "datepicker": - case "timerange": - //输入性的 - break; - case "checkbox": - break; - }*/ + columnWrapper.setOptionSourceType(item.getOptionSourceType()); + columnWrapper.setOptionSourceValue(item.getOptionSourceValue()); + columnWrapper.setOptions(item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue))); + columns.put(item.getItemId(), columnWrapper); } - return data; + return columns; } /** * 获取checkbox列值 - * @param options - * @param writedColIdxs - * @param abandonedHeaders + * @param columnWrapper 数据库列包装信息,每一列跳数据对应数据库的一个列 + * @param dataRow 数据行,每一条都是一行中的一个单元格 + * @param checkboxOptions 复选框的选项。k: 列号, value: checkboxlabel中文 * @return */ - private String getCheckBoxColValue(List options, List writedColIdxs, Map abandonedHeaders) { - - Map optionMap = options.stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue)); - - List optionValues = writedColIdxs.stream().map(i -> { - String optionName = abandonedHeaders.get(i); - return optionMap.get(optionName); + private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map dataRow, Map checkboxOptions) { + + Map options = columnWrapper.getOptions(); + List colIndexs = columnWrapper.getColIndexs(); + + List optionValues = colIndexs.stream().filter(i -> { + String cellContent = dataRow.get(i); + if (StringUtils.isNotBlank(cellContent) && cellContent.equals("是")) return true; + return false; + }).map(i -> { + String checkboxOptionLabel = checkboxOptions.get(i); + return options.get(checkboxOptionLabel); }).collect(Collectors.toList()); return String.join(",", optionValues); @@ -589,12 +656,86 @@ public class IcResiUserServiceImpl extends BaseServiceImpl listRemoteOptions(String uri) { + private Map listRemoteOptions(Map columnWrappers, String fullUri, String currUserAgencyId) { + String pureUri = null; + String cascadeItemId = null; + String cascadeItemColumnValue = null; + + if (fullUri.indexOf("?") != -1) { + String[] uriParts = fullUri.split("\\?"); + pureUri = uriParts[0]; + cascadeItemId = uriParts[1]; + + // 根据uri上的id,找到关联的itemid,从而找到关联的item的值 + ColumnWrapper cascadeItemColumnWrapper = columnWrappers.get(cascadeItemId); + cascadeItemColumnValue = cascadeItemColumnWrapper.getColValue(); + } else { + pureUri = fullUri; + } - return null; + List options = null; + + switch (pureUri) { + case "/epmetuser/icresidemanddict/demandoption": + options = getResultDataOrThrowsException(epmetUserOpenFeignClient.getDemandOptions(), ServiceConstant.EPMET_USER_SERVER, + EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/customergrid/gridoption": + AgencyIdFormDTO form = new AgencyIdFormDTO(); + form.setAgencyId(currUserAgencyId); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/customerpartybranch/branchoption": + + CustomerPartyBranchDTO bform = new CustomerPartyBranchDTO(); + bform.setGridId(cascadeItemColumnValue); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/icbuilding/buildingoption": + IcBuildingDTO buildingform = new IcBuildingDTO(); + buildingform.setNeighborHoodId(cascadeItemColumnValue); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/icbuildingunit/unitoption": + IcBuildingUnitDTO buForm = new IcBuildingUnitDTO(); + buForm.setBuildingId(cascadeItemColumnValue); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/ichouse/houseoption": + HouseFormDTO hform = new HouseFormDTO(); + hform.setUnitId(cascadeItemColumnValue); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/icneighborhood/neighborhoodoption": + IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); + nform.setAgencyId(currUserAgencyId); + nform.setGridId(cascadeItemId); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/education": + options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/house": + options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/nation": + options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/ninesmallplaces": + options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/relationship": + options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + + } + + if (options == null) return null; + + return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue)); // 通用api调用,无法实现 /*if (!uri.startsWith("/api")) uri = "/api".concat(uri); @@ -711,11 +852,25 @@ public class IcResiUserServiceImpl extends BaseServiceImpl colIndexs; //private List colContents; + // 单元格内容 + private String cellContent; + // 数据库中列的值 private String colValue; // key:label,value:value private Map options; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; } } \ No newline at end of file From 6ab79e6c526f2e52191e2b948f8dc48873202495 Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 2 Nov 2021 18:27:50 +0800 Subject: [PATCH 098/253] =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-statistical-server/pom.xml | 16 ++++- .../epmet-demo/epmet-demo-server/pom.xml | 16 ++++- epmet-user/epmet-user-server/pom.xml | 16 ++++- .../java/com/epmet/constant/UserConstant.java | 2 + .../controller/IcResiUserController.java | 27 +++----- .../com/epmet/service/IcResiUserService.java | 13 +++- .../service/impl/IcResiUserServiceImpl.java | 59 ++++++++++++++++-- .../main/resources/excel/ic_resi_info_cid.xls | Bin 79872 -> 79872 bytes 8 files changed, 121 insertions(+), 28 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/pom.xml b/epmet-module/data-statistical/data-statistical-server/pom.xml index cf2f0f200b..687c01b462 100644 --- a/epmet-module/data-statistical/data-statistical-server/pom.xml +++ b/epmet-module/data-statistical/data-statistical-server/pom.xml @@ -97,7 +97,21 @@ com.alibaba easyexcel - 2.2.6 + 2.2.10 + + + poi + org.apache.poi + + + poi-ooxml + org.apache.poi + + + poi-ooxml-schemas + org.apache.poi + + io.github.wnjustdoit diff --git a/epmet-module/epmet-demo/epmet-demo-server/pom.xml b/epmet-module/epmet-demo/epmet-demo-server/pom.xml index 8ef89773a9..4f6c0b6021 100644 --- a/epmet-module/epmet-demo/epmet-demo-server/pom.xml +++ b/epmet-module/epmet-demo/epmet-demo-server/pom.xml @@ -16,7 +16,21 @@ com.alibaba easyexcel - 2.2.6 + 2.2.10 + + + poi + org.apache.poi + + + poi-ooxml + org.apache.poi + + + poi-ooxml-schemas + org.apache.poi + + com.epmet diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index 0d8854d5ff..cbf241f718 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -16,7 +16,21 @@ com.alibaba easyexcel - 2.2.6 + 2.2.10 + + + poi + org.apache.poi + + + poi-ooxml + org.apache.poi + + + poi-ooxml-schemas + org.apache.poi + + com.epmet diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java index 69046a3f84..31d86dadf7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java @@ -101,4 +101,6 @@ public interface UserConstant { String GRID_ID="GRID_ID"; String GENDER="GENDER"; String HOUSE_TYPE_KEY="HOUSE_TYPE"; + String HOME_ID = "HOME_ID"; + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index f93c505efb..1f61e9f683 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -331,7 +331,7 @@ public class IcResiUserController { pageFormDTO.setPageFlag(false); //PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); //List> list = mapPageData.getList(); - List> list = icResiUserService.dynamicQuery(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + List> list = icResiUserService.getDataForExport(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //list = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("list:{}", JSON.toJSONString(list)); @@ -350,30 +350,18 @@ public class IcResiUserController { if (item.getChildGroup() != null){ if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { sheetMap.put( n.incrementAndGet(),mapData); - System.out.println(n.get()); } } }); - for (FormGroupDTO group : resiFormItems.getGroupList()) { - - } - - - Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); + workbook.setActiveSheet(0); + //header + String fileName = "居民信息.xls"; response.setHeader("content-Type", "application/vnd.ms-excel"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("居民信息.xls", "UTF-8")); + response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); - - /* //方式1 通过mv导出 - ModelAndView mv = new ModelAndView(new EasypoiTemplateExcelView()); - mv.addObject(TemplateExcelConstants.FILE_NAME, "继续追踪导出详情-")); - mv.addObject(TemplateExcelConstants.PARAMS, new TemplateExportParams(templatePath)); - mv.addObject(TemplateExcelConstants.MAP_DATA, mapData); - return mv;*/ - } @PostMapping("import/excel") @@ -383,8 +371,9 @@ public class IcResiUserController { } @PostMapping("test") - public Result>> test(@LoginUser TokenDto tokenDto,@RequestBody DynamicQueryFormDTO formDTO){ - formDTO.setCustomerId(tokenDto.getCustomerId()); + public Result>> test(@RequestBody DynamicQueryFormDTO formDTO){ + formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + //formDTO.setCustomerId(tokenDto.getCustomerId()); return new Result>>().ok(icResiUserService.dynamicQuery(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getResultTableName(), diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index cefe0c0e88..0dea424f07 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -133,4 +133,15 @@ public interface IcResiUserService extends BaseService { String formCode, String resultTableName, List conditions); -} \ No newline at end of file + + /** + * desc:条件导出 + * @param customerId + * @param formCode + * @param baseTableName + * @param conditions + * @return + */ + List> getDataForExport(String customerId, String formCode, String baseTableName, List conditions); + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index b71e120176..69990f2d9d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -39,6 +39,7 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.CustomerGridDTO; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; @@ -322,8 +323,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> gridInfoRes=govOrgOpenFeignClient.getGridListByGridIds(gridIds); @@ -342,7 +343,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl options; } + + /** + * desc:动态查询 某表的所有字段值 + * @param customerId + * @param formCode + * @param resultTableName + * @param conditions + * @return + */ + @Override public List> dynamicQuery(String customerId, String formCode, String resultTableName, @@ -732,4 +743,42 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(String customerId, String formCode, String baseTableName, List conditions) { + List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions); + mapList.parallelStream().forEach(map -> { + Object gridId = map.get(UserConstant.GRID_ID); + if (gridId != null) { + CustomerGridFormDTO formDTO = new CustomerGridFormDTO(); + formDTO.setGridId(gridId.toString()); + Result gridInfoRes = govOrgOpenFeignClient.getGridBaseInfoByGridId(formDTO); + if (gridInfoRes != null && gridInfoRes.success() && gridInfoRes.getData() != null) { + map.put(UserConstant.GRID_ID, gridInfoRes.getData().getGridName()); + } + } + Object homeId = map.get(UserConstant.HOME_ID); + if (homeId != null) { + HashSet houseIds = new HashSet<>(); + houseIds.add(homeId.toString()); + Result> houseInfoRes = govOrgOpenFeignClient.queryListHouseInfo(houseIds); + if (houseInfoRes != null && houseInfoRes.success() && CollectionUtils.isNotEmpty(houseInfoRes.getData())){ + HouseInfoDTO houseInfoDTO = houseInfoRes.getData().get(NumConstant.ZERO); + map.put("VILLAGE_NAME", houseInfoDTO.getNeighborHoodName()); + map.put("BUILD_NAME", houseInfoDTO.getBuildingName()); + map.put("HOME_ID", houseInfoDTO.getDoorName()); + } + } + }); + return mapList; + } +} diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index b6a67b92057a4a34c4e65381aaa929e24b3f3344..59747c941454bd35a0341ab329df5c96eeb52a43 100644 GIT binary patch delta 7366 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 wNQ Date: Tue, 2 Nov 2021 22:51:39 +0800 Subject: [PATCH 099/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=B1=85=E6=B0=91=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=AE=8C=E5=96=84=EF=BC=8C=E5=B7=B2=E7=BB=8F=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E4=B8=AD=E6=96=87=E5=B9=B6=E4=B8=94=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E6=88=90db=E6=89=80=E9=9C=80=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E4=B8=8B=E4=B8=80=E6=AD=A5=EF=BC=8C=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E6=88=90sql=EF=BC=8C=E5=B9=B6=E4=B8=94=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE=E7=9A=84=E5=AE=8C=E6=95=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 7 ++- .../com/epmet/service/IcResiUserService.java | 2 +- .../service/impl/IcResiUserServiceImpl.java | 58 ++++++++++++------- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index da8c7a99eb..42f32d5d53 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -376,6 +376,11 @@ public class IcResiUserController { } + /** + * excel导入居民基本信息 + * @param loginUser + * @return + */ @PostMapping("import/excel") public Result importExcelByEasyExcel(@LoginUser TokenDto loginUser) { @@ -386,7 +391,7 @@ public class IcResiUserController { Result loginUserDetails = epmetUserOpenFeignClient.getLoginUserDetails(userForm); - Object result = icResiUserService.importExcel(loginUserDetails.getData().getAgencyId()); + Object result = icResiUserService.importIcResiInfoFromExcel(loginUserDetails.getData().getAgencyId()); return new Result().ok(result); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 3cb0adcff7..bac64e47b3 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -128,7 +128,7 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); - Object importExcel(String currUserAgencyId); + Object importIcResiInfoFromExcel(String currUserAgencyId); List> dynamicQuery(String customerId, String formCode, diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 24a3c6f1d7..ec98e3346d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -428,8 +428,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders); // 持久化 - persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders); + persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, customerItems.get(0).getTableName()); return headerColumnWrapper; } @@ -488,12 +488,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper, List> dataRows, String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel) { + private void persist(Map headerColumnWrapper, List> dataRows, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName) { for (Map row : dataRows) { + // 当前行的列们 +// List columnsOfCurrRow = new ArrayList<>(); + + List columnNames = new ArrayList<>(); + List columnValues = new ArrayList<>(); + for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { - String itemId = columnWrapperEntry.getKey(); ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); if ("input".equals(columnWrapper.getItemType()) || "textarea".equals(columnWrapper.getItemType()) @@ -512,7 +518,9 @@ public class IcResiUserServiceImpl extends BaseServiceImpl options = columnWrapper.getOptions(); @@ -529,10 +537,17 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> combineHeaders(Map> headers) { - HashMap> itemAndColIndexs = new HashMap<>(); + HashMap> itemAndColIndexs = new LinkedHashMap<>(); headers.forEach((k, v) -> { String tempKey = String.join(":", v); @@ -561,7 +576,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl v = entry.getValue(); int lastPartIndex = v.size() - 1; String lastValuePart = v.get(lastPartIndex); - if (itemLabels.indexOf(lastValuePart) == -1) { + if (!itemLabels.contains(lastValuePart)) { // 该部分为options,它的上一级是item,那么去掉options这一级 v.remove(lastPartIndex); abandonedHeaders.put(colIdx, lastValuePart); @@ -598,7 +613,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> datas, Map abandonedHeaders) { // HashMap> tables = new HashMap<>(); - Map columns = new HashMap<>(combinedHeaders.size()); + Map columns = new LinkedHashMap<>(combinedHeaders.size()); for (Map.Entry> entry : combinedHeaders.entrySet()) { String combinedHeader = entry.getKey(); @@ -662,7 +677,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl listRemoteOptions(Map columnWrappers, String fullUri, String currUserAgencyId) { String pureUri = null; String cascadeItemId = null; - String cascadeItemColumnValue = null; + ColumnWrapper cascadeItemColumnWrapper = null; if (fullUri.indexOf("?") != -1) { String[] uriParts = fullUri.split("\\?"); @@ -670,8 +685,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Tue, 2 Nov 2021 22:57:12 +0800 Subject: [PATCH 100/253] =?UTF-8?q?=E5=86=B2=E7=AA=81=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/service/impl/IcResiUserServiceImpl.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 5c1b8cfa8e..b572a781e4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -535,21 +535,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Wed, 3 Nov 2021 09:57:01 +0800 Subject: [PATCH 101/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 2 +- .../main/resources/excel/ic_resi_info_cid.xls | Bin 79872 -> 79872 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index edbe7fcbd0..eacd60c613 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -349,7 +349,7 @@ public class IcResiUserController { resiFormItems.getItemList().forEach(item->{ if (item.getChildGroup() != null){ if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { - sheetMap.put( n.incrementAndGet(),mapData); + sheetMap.put(n.incrementAndGet() ,mapData); } } }); diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index 59747c941454bd35a0341ab329df5c96eeb52a43..f40d8555313a62e7fad26213612b328a689d55a9 100644 GIT binary patch delta 137 zcmZqpz|!!6Wy32bM&`+{nL;M3GfRMRIxGL?I_8y*yy^`4Y3dAC4C)MOA?lk=T%YH% zurV-jPnO>-#mCGb#=yY9$iNJQVq(+#)fpu=$8Y8-nJm3oP*|3MpMe=92T}oo%*-Ga doh--ZvaxTM(O{gz%*vpl`EJJcz1ob Date: Wed, 3 Nov 2021 12:50:41 +0800 Subject: [PATCH 102/253] =?UTF-8?q?neighbourHoodId=20=E6=94=B9neighborHood?= =?UTF-8?q?Id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gov-org-server/src/main/resources/mapper/IcHouseDao.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index 22aea14603..3dc145833a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -118,7 +118,7 @@ a.OWNER_ID_CARD as ownerIdCard, a.ID as houseId, - c.ID as neighbourHoodId, + c.ID as neighborHoodId, b.ID as buildingId, a.BUILDING_UNIT_ID as unitNumKey, a.HOUSE_TYPE as houseTypeKey, From 9c6a66c8d74c9f4abbfd0775d87291f81a6a24fe Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Wed, 3 Nov 2021 14:18:57 +0800 Subject: [PATCH 103/253] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/IcResiUserServiceImpl.java | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index b572a781e4..02ae72366e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -35,6 +35,7 @@ import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.UserConstant; @@ -89,7 +90,10 @@ public class IcResiUserServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( @@ -429,7 +433,9 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders); // 持久化 - persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, customerItems.get(0).getTableName()); + persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, customerItems.get(0).getTableName(), currUserAgencyPids, currentUserId); return headerColumnWrapper; } @@ -489,14 +495,13 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper, List> dataRows, - String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName) { + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName, + String currUserAgencyPids, String currentUserId) { for (Map row : dataRows) { - + // 当前行的列们 // List columnsOfCurrRow = new ArrayList<>(); - - List columnNames = new ArrayList<>(); - List columnValues = new ArrayList<>(); + LinkedHashMap columnAndValues = new LinkedHashMap<>(); for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { @@ -535,7 +540,32 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { +// System.out.println(c.columnName + "\t" + c.getColValue()); +// }); + +// System.out.println("-------------------"); + + baseDao.add(tableName, columnAndValues); } } From 08e951199fcfa3aafa5814272713a77696d5679c Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Wed, 3 Nov 2021 14:22:12 +0800 Subject: [PATCH 104/253] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/FinancialSituationDTO.java | 31 ++++++++ .../com/epmet/dto/form/PersonDataFormDTO.java | 22 ++++++ .../epmet/dto/form/SearchByNameFormDTO.java | 30 ++++++++ .../epmet/dto/result/PersonDataResultDTO.java | 72 +++++++++++++++++++ .../dto/result/SearchByNameResultDTO.java | 66 +++++++++++++++++ .../controller/IcResiUserController.java | 25 +++++++ .../java/com/epmet/dao/IcResiUserDao.java | 20 ++++++ .../com/epmet/service/IcResiUserService.java | 20 ++++++ .../service/impl/IcResiUserServiceImpl.java | 55 +++++++++++--- .../main/resources/mapper/IcResiUserDao.xml | 38 ++++++++++ 10 files changed, 371 insertions(+), 8 deletions(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/FinancialSituationDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/PersonDataFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/SearchByNameFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/SearchByNameResultDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/FinancialSituationDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/FinancialSituationDTO.java new file mode 100644 index 0000000000..4a1607748d --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/FinancialSituationDTO.java @@ -0,0 +1,31 @@ +package com.epmet.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/11/3 10:24 上午 + * @DESC + */ +@Data +public class FinancialSituationDTO implements Serializable { + + private static final long serialVersionUID = -3984106138099267996L; + + /** + * 月收入 + */ + private String monthlyIncome; + + /** + * 退休金额 + */ + private String retirementAmount; + + public FinancialSituationDTO() { + this.monthlyIncome = ""; + this.retirementAmount = ""; + } +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/PersonDataFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/PersonDataFormDTO.java new file mode 100644 index 0000000000..52d96870a2 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/PersonDataFormDTO.java @@ -0,0 +1,22 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/11/2 5:16 下午 + * @DESC + */ +@Data +public class PersonDataFormDTO implements Serializable { + + private static final long serialVersionUID = 3238490888792654922L; + + public interface PersonDataForm{} + + @NotBlank(message = "userId不能为空",groups = PersonDataForm.class) + private String userId; +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/SearchByNameFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/SearchByNameFormDTO.java new file mode 100644 index 0000000000..8f4abca17f --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/SearchByNameFormDTO.java @@ -0,0 +1,30 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/11/3 1:34 下午 + * @DESC + */ +@Data +public class SearchByNameFormDTO implements Serializable { + + private static final long serialVersionUID = -5017695783909884799L; + + public interface SearchByNameForm{} + + @NotBlank(message = "name不能为空",groups = SearchByNameForm.class) + private String name; + + @NotNull(message = "pageSize不能为空",groups = SearchByNameForm.class) + private Integer pageSize; + + @NotNull(message = "pageNo不能为空",groups = SearchByNameForm.class) + private Integer pageNo; + +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java new file mode 100644 index 0000000000..22a6fc3c41 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java @@ -0,0 +1,72 @@ +package com.epmet.dto.result; + +import com.epmet.dto.FinancialSituationDTO; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Author zxc + * @DateTime 2021/11/2 5:34 下午 + * @DESC + */ +@Data +public class PersonDataResultDTO implements Serializable { + + private static final long serialVersionUID = 5210308218052783909L; + + /** + * 工作单位 + */ + private String workUnit; + + /** + * 人员类别 + */ + private String personCategory; + + /** + * 网格名 + */ + private String gridName; + + /** + * 姓名 + */ + private String name; + + /** + * 经济状况:包括 月收入:monthlyIncome 和 退休金额:retirementAmount + */ + private FinancialSituationDTO financialSituation; + + /** + * 房屋信息 + */ + private List houseInfo; + + /** + * 志愿者类别 + */ + private String volunteerCategory; + + public PersonDataResultDTO() { + this.workUnit = ""; + this.personCategory = ""; + this.gridName = ""; + this.name = ""; + this.financialSituation = new FinancialSituationDTO(); + this.houseInfo = new ArrayList<>(); + this.volunteerCategory = ""; + } + + /** + * 身份证 + */ + @JsonIgnore + private String idCard; +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/SearchByNameResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/SearchByNameResultDTO.java new file mode 100644 index 0000000000..0451dafaf0 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/SearchByNameResultDTO.java @@ -0,0 +1,66 @@ +package com.epmet.dto.result; + +import com.epmet.commons.tools.constant.NumConstant; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/11/3 1:36 下午 + * @DESC + */ +@Data +public class SearchByNameResultDTO implements Serializable { + + private static final long serialVersionUID = 8783929181468322960L; + + /** + * 排序 + */ + private Integer sort; + + /** + * 姓名 + */ + private String name; + + /** + * 网格名 + */ + private String gridName; + + @JsonIgnore + private String gridId; + + /** + * 小区名 + */ + private String neighborHoodName; + + @JsonIgnore + private String neighborHoodId; + + /** + * 楼号 + */ + private String buildNum; + + @JsonIgnore + private String buildId; + + /** + * 用户ID + */ + private String userId; + + public SearchByNameResultDTO() { + this.sort = NumConstant.ZERO; + this.name = ""; + this.gridName = ""; + this.neighborHoodName = ""; + this.buildNum = ""; + this.userId = ""; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index eacd60c613..8bd5d64f1c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -392,4 +392,29 @@ public class IcResiUserController { formDTO.getResultTableName(), formDTO.getConditions())); } + + /** + * @Description 查询个人数据 + * @param formDTO + * @author zxc + * @date 2021/11/3 9:21 上午 + */ + @PostMapping("persondata") + public Result personData(@RequestBody PersonDataFormDTO formDTO){ + return new Result().ok(icResiUserService.personData(formDTO)); + } + + /** + * @Description 根据名字搜索 + * @param formDTO + * @param tokenDto + * @author zxc + * @date 2021/11/3 1:42 下午 + */ + @PostMapping("searchbyname") + public Result> searchByName(@RequestBody SearchByNameFormDTO formDTO, @LoginUser TokenDto tokenDto){ + ValidatorUtils.validateEntity(formDTO, SearchByNameFormDTO.SearchByNameForm.class); + return new Result>().ok(icResiUserService.searchByName(formDTO,tokenDto)); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 1d4f66a4cb..329447a24f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -20,6 +20,8 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.form.ResiUserQueryValueDTO; import com.epmet.dto.result.IcFormResColumnDTO; +import com.epmet.dto.result.PersonDataResultDTO; +import com.epmet.dto.result.SearchByNameResultDTO; import com.epmet.entity.IcResiUserEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -95,4 +97,22 @@ public interface IcResiUserDao extends BaseDao { @Param("resultTableName")String resultTableName, @Param("conditions") List conditions, @Param("subTables") List subTables); + + /** + * @Description 查询个人信息 + * @param userId + * @author zxc + * @date 2021/11/3 10:28 上午 + */ + PersonDataResultDTO personData(@Param("userId") String userId); + + /** + * @Description 根据名字,组织查询人 + * @param name + * @param agencyId + * @author zxc + * @date 2021/11/3 2:05 下午 + */ + List searchByName(@Param("name")String name, @Param("agencyId")String agencyId,@Param("pageNo")Integer pageNo); + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 8391e0967e..2d132a988b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -23,6 +23,8 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.HomeUserResultDTO; +import com.epmet.dto.result.PersonDataResultDTO; +import com.epmet.dto.result.SearchByNameResultDTO; import com.epmet.entity.IcResiUserEntity; import com.epmet.service.impl.IcResiUserServiceImpl; @@ -135,6 +137,24 @@ public interface IcResiUserService extends BaseService { String resultTableName, List conditions); + /** + * @Description 查询个人数据 + * @param formDTO + * @author zxc + * @date 2021/11/3 9:21 上午 + */ + PersonDataResultDTO personData(PersonDataFormDTO formDTO); + + /** + * @Description 根据名字搜索 + * @param formDTO + * @param tokenDto + * @author zxc + * @date 2021/11/3 1:42 下午 + */ + List searchByName(SearchByNameFormDTO formDTO,TokenDto tokenDto); + + /** * desc:条件导出 * @param customerId diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index b572a781e4..e7b968123c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; @@ -34,6 +35,7 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; @@ -76,7 +78,7 @@ import java.util.stream.Collectors; @Slf4j @Service public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService, ResultDataResolver { - private Logger logger = LogManager.getLogger(IcResiUserServiceImpl.class); + private final Logger logger = LogManager.getLogger(IcResiUserServiceImpl.class); @Autowired private IcResiUserRedis icResiUserRedis; @Autowired @@ -488,15 +490,15 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper, List> dataRows, + private void persist(Map headerColumnWrapper, List> dataRows, String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName) { for (Map row : dataRows) { // 当前行的列们 // List columnsOfCurrRow = new ArrayList<>(); - - List columnNames = new ArrayList<>(); - List columnValues = new ArrayList<>(); + + List columnNames = new ArrayList<>(); + List columnValues = new ArrayList<>(); for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { @@ -647,8 +649,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl optionValues = colIndexs.stream().filter(i -> { String cellContent = dataRow.get(i); - if (StringUtils.isNotBlank(cellContent) && cellContent.equals("是")) return true; - return false; + return StringUtils.isNotBlank(cellContent) && cellContent.equals("是"); }).map(i -> { String checkboxOptionLabel = checkboxOptions.get(i); return options.get(checkboxOptionLabel); @@ -666,7 +667,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl searchByName(SearchByNameFormDTO formDTO, TokenDto tokenDto) { + // 查询工作人员所属组织 + CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); + if (null == staffInfo){ + throw new RenException("未查询到当前工作人员所属组织"); + } + Integer no = (formDTO.getPageNo() - NumConstant.ONE) * formDTO.getPageSize(); + PageInfo pageInfo = PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize()).doSelectPageInfo(() -> baseDao.searchByName(formDTO.getName(), staffInfo.getAgencyId(), no)); + List result = pageInfo.getList(); + // 查询小区,楼号,网格 + // TODO + if (CollectionUtils.isEmpty(result)){ + return new ArrayList<>(); + } + return result; + } + /** * desc:条件导出 * diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 616d55e711..12b430d2f3 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -122,4 +122,42 @@ group by IC_RESI_USER.id order by ic_resi_user.CREATED_TIME desc + + + + + + + + + + + + + + \ No newline at end of file From 0f6ad0d77ce4d4ede96794c7f226a9875578edbb Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 3 Nov 2021 14:30:22 +0800 Subject: [PATCH 105/253] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E7=BB=8F=E6=B5=8E?= =?UTF-8?q?=E4=BD=8E=E4=BF=9D=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/constant/UserConstant.java | 5 +- .../controller/IcResiUserController.java | 75 +++++++++++++++--- .../com/epmet/entity/IcResiUserEntity.java | 9 +-- .../com/epmet/service/IcResiUserService.java | 6 +- .../service/impl/IcResiUserServiceImpl.java | 46 ++++++++--- .../main/resources/excel/ic_resi_info_cid.xls | Bin 79872 -> 80384 bytes 6 files changed, 111 insertions(+), 30 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java index 31d86dadf7..87278ba55f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/UserConstant.java @@ -102,5 +102,8 @@ public interface UserConstant { String GENDER="GENDER"; String HOUSE_TYPE_KEY="HOUSE_TYPE"; String HOME_ID = "HOME_ID"; - + /** + * 居民信息 子表中的主表id + */ + String IC_RESI_USER = "IC_RESI_USER"; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index eacd60c613..3f137f6113 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -29,6 +29,7 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -327,32 +328,84 @@ public class IcResiUserController { @RequestMapping(value = "/exportExcel") public void exportExcel(/*@LoginUser TokenDto tokenDto,*/ @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { + + pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setPageFlag(false); - //PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); - //List> list = mapPageData.getList(); - List> list = icResiUserService.getDataForExport(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); - //list = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); - log.info("list:{}", JSON.toJSONString(list)); + CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); + /* Map> checkListMap = new HashMap<>(); + for (FormItem item : resiFormItems.getItemList()) { + if ("checkbox".equals(item.getItemType())) { + List options = null; + if ("remote".equals(item.getOptionSourceType())) { + } else if ("local".equals(item.getOptionSourceType())) { + options = item.getOptions(); + } + checkListMap.put(item.getColumnName().concat(item.getColumnNum().equals(0) ? "" : item.getColumnNum().toString()), options); + } + }*/ - CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); + //PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); + //List> resiMainList = mapPageData.getList(); + Map itemMap = new HashMap<>(); + for (FormItem formItem : resiFormItems.getItemList()) { + if (StringUtils.isNotBlank(formItem.getColumnName())){ + itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); + } + if (formItem.getChildGroup() != null) { + for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { + if (item2.getItemType().equals("checkbox")) { + itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2,FormItem.class)); + } + } + + } + } + for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { + if (groupItem.getItemList() != null) { + for (FormItem2 item : groupItem.getItemList()) { + if (StringUtils.isBlank(item.getColumnName())){ + continue; + } + System.out.println(item.getColumnName()+item.getColumnNum()); + itemMap.put(item.getColumnName().concat(item.getColumnNum() == 0 ? "" : item.getColumnNum().toString()), ConvertUtils.sourceToTarget(item,FormItem.class)); + } + } + } + Map> resiMainList = icResiUserService.getDataForExport(itemMap,pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); + log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; TemplateExportParams params = new TemplateExportParams(templatePath,true); Map> sheetMap = new HashMap<>(); Map mapData = new HashMap<>(); - mapData.put("list", list); + mapData.put("list", resiMainList.values()); sheetMap.put(0,mapData); AtomicInteger n = new AtomicInteger(); - resiFormItems.getItemList().forEach(item->{ - if (item.getChildGroup() != null){ + for (FormItem item : resiFormItems.getItemList()) { + + + if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { - sheetMap.put(n.incrementAndGet() ,mapData); + //itemMap = item.getChildGroup().getItemList().stream().filter(o -> o.getItemType().equals("checkbox")).collect(Collectors.toMap(o -> o.getColumnName().concat(o.getColumnNum() == 0 ? "" : o.getColumnNum().toString()), o -> ConvertUtils.sourceToTarget(o,FormItem.class))); + + + + Map> resiChildMap = icResiUserService.getDataForExport(itemMap, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); + resiChildMap.forEach((key,value)->{ + value.putAll(resiMainList.get(key)); + }); + + Map mapData2 = new HashMap<>(); + mapData2.put("list", resiChildMap.values()); + System.out.println("========="+item.getChildGroup().getTableName()+" data:"+resiChildMap.size()); + sheetMap.put(n.incrementAndGet(),mapData2); } } - }); + } Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); workbook.setActiveSheet(0); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java index 603b530781..6f9f7d4068 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java @@ -44,12 +44,12 @@ public class IcResiUserEntity extends BaseEpmetEntity { private String customerId; /** - * + * */ private String agencyId; /** - * + * */ private String pids; @@ -373,11 +373,6 @@ public class IcResiUserEntity extends BaseEpmetEntity { */ private String ysr; - /** - * 是否经济低保 - */ - private String isJjdb; - /** * 籍贯 */ diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 8391e0967e..ff43d4c68c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -22,9 +22,9 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; +import com.epmet.dto.result.FormItem; import com.epmet.dto.result.HomeUserResultDTO; import com.epmet.entity.IcResiUserEntity; -import com.epmet.service.impl.IcResiUserServiceImpl; import java.util.List; import java.util.Map; @@ -137,12 +137,14 @@ public interface IcResiUserService extends BaseService { /** * desc:条件导出 + * + * @param itemList * @param customerId * @param formCode * @param baseTableName * @param conditions * @return */ - List> getDataForExport(String customerId, String formCode, String baseTableName, List conditions); + Map> getDataForExport(Map itemList, String customerId, String formCode, String baseTableName, List conditions); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index b572a781e4..3651d0b97f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -488,15 +488,15 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper, List> dataRows, + private void persist(Map headerColumnWrapper, List> dataRows, String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName) { for (Map row : dataRows) { // 当前行的列们 // List columnsOfCurrRow = new ArrayList<>(); - - List columnNames = new ArrayList<>(); - List columnValues = new ArrayList<>(); + + List columnNames = new ArrayList<>(); + List columnValues = new ArrayList<>(); for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { @@ -666,7 +666,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(String customerId, String formCode, String baseTableName, List conditions) { + public Map> getDataForExport(Map formItemMap, String customerId, String formCode, String baseTableName, List conditions) { List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions); - mapList.parallelStream().forEach(map -> { + + Map> result = new LinkedHashMap<>(); + mapList.stream().filter(Objects::nonNull).forEach(map -> { + String resiId = (String) map.getOrDefault(UserConstant.IC_RESI_USER, ""); + formItemMap.forEach((k, v)->{ + Object temp = map.get(k); + if (temp != null){ + if (v.getOptionSourceType().equals("remote")){ + //todo 获取 options + } + v.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(),temp.toString().contains(optionDTO.getValue())?"是":"否"); + }); + } + }); + if ("ic_resi_user".equals(baseTableName)) { + resiId = (String) map.get("ID"); + } + if (StringUtils.isBlank(resiId)){ + log.error("getDataForExport error,resiId:{}",resiId); + return; + } + result.put(resiId, map); + if (!"ic_resi_user".equals(baseTableName)) { + return; + } Object gridId = map.get(UserConstant.GRID_ID); if (gridId != null) { CustomerGridFormDTO formDTO = new CustomerGridFormDTO(); @@ -927,14 +954,15 @@ public class IcResiUserServiceImpl extends BaseServiceImpl houseIds = new HashSet<>(); houseIds.add(homeId.toString()); Result> houseInfoRes = govOrgOpenFeignClient.queryListHouseInfo(houseIds); - if (houseInfoRes != null && houseInfoRes.success() && CollectionUtils.isNotEmpty(houseInfoRes.getData())){ + if (houseInfoRes != null && houseInfoRes.success() && CollectionUtils.isNotEmpty(houseInfoRes.getData())) { HouseInfoDTO houseInfoDTO = houseInfoRes.getData().get(NumConstant.ZERO); map.put("VILLAGE_NAME", houseInfoDTO.getNeighborHoodName()); map.put("BUILD_NAME", houseInfoDTO.getBuildingName()); map.put("HOME_ID", houseInfoDTO.getDoorName()); } } + }); - return mapList; + return result; } } diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index f40d8555313a62e7fad26213612b328a689d55a9..33a4346d5b91697e6784511ed670a01f2f07b2b2 100644 GIT binary patch delta 2613 zcmZYBc~n$Y90%~WR$k z$(PehaK2ZNs-cg^rTss;!!Vm>HaXs=h3iep6GOT?{TTiwBQ>Q*htUzF7Sa$} zLNjR=ot5tZu`S`v;!MmY3^1*&k zk*Gg3S2O@B77c`QMF~)e=pJaEXb?1?$Y(u%Ft|X1_d-vJhCmBN_d%tiMCfVJQ0N)a zFldozIJ8)FKePlIVa|R8_^bp+LQ6%XpyxynK+E)$?D%#|mx8wCa>s+v3ejk2rDzP) zwjg7nwgT`#tK`mypy!Rf*EU+YYO6b<2pUH(h@4QF$OWwtxuLb9NNAlX3R*9UhF-M9XO4%` zMGDH$FV3zg*dT2YXnRTIgkBc8Fx^~{8?lX|Naz(2Z_GPmP{bQ^Q~B@Fs*CZ*oKvxm zIt+ajJ{r5FeL512zgC{pl60#RGaZ{noQ_vToDM$XxH1SCA4lbS^@&IHjIw!2eAIHg zLPEV%A#y@|)S5A#Or^+88MMu~S=Q`!RJ}osu>UHaG9@%)> zF5;0@iFjmhhx;ZjCw$z3dS2LcJx5f!?;n%jTtYz3#*a{kQE4eD6p*&+lCk zFV;?x3)&^(#loDdx$|P}7V%=$h@ugDUlaq?Ldw>WY-FcNq>M9F-e^18!i-+VdYhyE z0CIH*-)cu%^JUcdo%Vt{s|Rxx_lP)G^&-yI2O`cDe=(VB%DMVb#6|s)h;!xV^;Q8r zvutjmhd#DqyyhO-E8?8&6LC)Vi#R73d%K(*6h$G{AmW^SVixeE1O5od<Sr-_c9 zAwxBXDx>r9rJCzg>wdF74z-Oh(nFs~Up&6g&AyhNtc`G7{gtTn8c}qU)z_E{MVk6T z-+ehN>u|eIrP2|RlTzuZ$OU~Vazn>Nku-t65=BAB^{gvXkT>H>iSKJGVr$(g--vjp zoDlI&!Gv4$WW!$b(kT&tAAc+2O8QR3+kUEuE9rZPD@j8oc~ME#jagknk71)mc2rbn zwA?DUs~_6(rg`Y}ovf$Y0yQ=@)e&~Mv!V?>6^-w=srm0fxJxx?Nk3XoF{|w-5m(#K zBCfVGBCfWxZO=;a(l1ubJU7mXI2-3hoQ(@2H$6-j1321TG3D;z>N;Pp`3I`Kn*GME vb+v(mgH*t-HkX$ss#Uhw{()PGDy>5|KI8bGKR(a+6yx{&st8OOsjAd}i>(?! delta 2552 zcmZYBdr(wm6aet^?OgM(;B{qsdYYcL;?;IEr&T9OASu7;EXg8U_OM3TJ&GypE*{9qTX`|7 zvLH8qbxvvh4hV%dJ4Fm)B>H}f}#KUGN zg*8wJ6|fPi@Ut90D-|iDKzNM7y(s|RAcu{_8wT$K7=937SH2w4YE%APX7#o|f}Q>g z29UrH(!nXSi~L;_;G#em1)=h}&0v?qb;1fL-hUCgeH}#-Sc(#iQ1eHxg{UW4x1ctnlGNEJAvbaG zR@7!zGU_STBGeZ7p}dgdt^6z%pVhE#LphiAc2q6L7NeXCvIOO9B@MNWzj+60yE2qF z*He$rgdD%k;wynW-D9odox2iVv`{k4!6e#nUi~##(?{gY<=OJtu1KY-#9ME#(^>=Y zfu-;?%NMnSWkfy0GNE>|{805QGwNBEKWdjII#$vkizQImd&^pjck?43eDoa47xg^L zh?BiqHUdl-Yv7n4>ID{U%d0~WK-;phsX~M(!Q}&ih6aoTH3CdD&B{fB5?nVdrR>p~ zP;;@DMY)h!l#3Txl#3>LanD_HOqsX5b?2%SI^L*a1ZFfH=x|l#i)vxfbm(wZVqV;)&WyV%sWzqUz ze>0;12tXawM5~n!S@MdWB-yilz5NhBr&+zuqD4B)GNRsK(IR!QXp!Dz(IVk2wfXyF z>@8LR>TQ(J%>f zbCwZxl4U}jV)?-`_=06deJNLuKa4pW9Iv#0rA2fzd*d{V_Qn8<_QuyN6Y30$et|I+ zGg;CBRna#r+Un<6R7KySsEQ=4qI9gH{-1M$Jv(q~UUC!AphQkJ>&17@oQXlqQm>EU zP>_J~Z~^n8<*2DiN1RdgNhz3otrF;@{DDQ)^&^X_>pY99>jJmGHZ>iFw3vE2{KTRR z46`T$BP$tT-m==g0is;^>VN4!w|@s}e<>ZX()oIZ@c$0_mSO VI-#2IqI Date: Wed, 3 Nov 2021 14:53:18 +0800 Subject: [PATCH 106/253] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E7=BB=8F=E6=B5=8E?= =?UTF-8?q?=E4=BD=8E=E4=BF=9D=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 32 +++++++------------ .../service/impl/IcResiUserServiceImpl.java | 17 +++++++--- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index bc1472c954..8310f0aa25 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -329,34 +329,24 @@ public class IcResiUserController { @RequestMapping(value = "/exportExcel") public void exportExcel(/*@LoginUser TokenDto tokenDto,*/ @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { - pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); - /* Map> checkListMap = new HashMap<>(); - for (FormItem item : resiFormItems.getItemList()) { - - if ("checkbox".equals(item.getItemType())) { - List options = null; - if ("remote".equals(item.getOptionSourceType())) { - - } else if ("local".equals(item.getOptionSourceType())) { - options = item.getOptions(); - } - checkListMap.put(item.getColumnName().concat(item.getColumnNum().equals(0) ? "" : item.getColumnNum().toString()), options); - } - }*/ - //PageData> mapPageData = icResiUserService.pageResiMap(pageFormDTO); - //List> resiMainList = mapPageData.getList(); Map itemMap = new HashMap<>(); for (FormItem formItem : resiFormItems.getItemList()) { if (StringUtils.isNotBlank(formItem.getColumnName())){ + continue; + } + if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select")){ itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); } if (formItem.getChildGroup() != null) { for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { - if (item2.getItemType().equals("checkbox")) { + if (StringUtils.isNotBlank(item2.getColumnName())){ + continue; + } + if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select")){ itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2,FormItem.class)); } } @@ -366,14 +356,16 @@ public class IcResiUserController { for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { if (groupItem.getItemList() != null) { for (FormItem2 item : groupItem.getItemList()) { - if (StringUtils.isBlank(item.getColumnName())){ + if (StringUtils.isNotBlank(item.getColumnName())){ continue; } - System.out.println(item.getColumnName()+item.getColumnNum()); - itemMap.put(item.getColumnName().concat(item.getColumnNum() == 0 ? "" : item.getColumnNum().toString()), ConvertUtils.sourceToTarget(item,FormItem.class)); + if (item.getItemType().equals("checkbox") || item.getItemType().equals("select")){ + itemMap.put(item.getColumnName().concat(item.getColumnNum() == 0 ? "" : item.getColumnNum().toString()), ConvertUtils.sourceToTarget(item, FormItem.class)); + } } } } + System.out.println("checkbox:"+JSON.toJSONString(itemMap)); Map> resiMainList = icResiUserService.getDataForExport(itemMap,pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 93cca15d0a..4667c00419 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -959,13 +959,20 @@ public class IcResiUserServiceImpl extends BaseServiceImpl{ Object temp = map.get(k); - if (temp != null){ - if (v.getOptionSourceType().equals("remote")){ + if (temp != null) { + if (v.getOptionSourceType().equals("remote")) { //todo 获取 options } - v.getOptions().forEach(optionDTO -> { - map.put(optionDTO.getValue(),temp.toString().contains(optionDTO.getValue())?"是":"否"); - }); + if (v.getItemType().equals("checkbox")) { + v.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(), temp.toString().contains(optionDTO.getValue()) ? "是" : "否"); + }); + } else if (v.getItemType().equals("select")) { + v.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(), temp.toString().equals(optionDTO.getValue()) ? optionDTO.getLabel() : ""); + }); + + } } }); if ("ic_resi_user".equals(baseTableName)) { From 73eb1c002d702eaa47986ccc3e542506f9ed2b77 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 3 Nov 2021 15:37:22 +0800 Subject: [PATCH 107/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=AF=B9=E5=BF=85=E5=A1=AB=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=BF=9B=E8=A1=8C=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/result/ColumnTableNameResultDTO.java | 20 +++++++++++++++++ .../feign/OperCustomizeOpenFeignClient.java | 13 +++++++++-- .../OperCustomizeOpenFeignClientFallback.java | 5 +++++ .../controller/IcFormItemController.java | 11 ++++++++++ .../java/com/epmet/dao/IcFormItemDao.java | 7 ++++++ .../com/epmet/service/IcFormItemService.java | 7 ++++++ .../service/impl/IcFormItemServiceImpl.java | 10 +++++++++ .../main/resources/mapper/IcFormItemDao.xml | 17 ++++++++++++++ .../service/impl/IcResiUserServiceImpl.java | 22 +++++++++++++++++++ 9 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ColumnTableNameResultDTO.java diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ColumnTableNameResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ColumnTableNameResultDTO.java new file mode 100644 index 0000000000..3d1e20cc50 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/ColumnTableNameResultDTO.java @@ -0,0 +1,20 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description 查询必填字段-接口返参 + * @Author sun + */ +@Data +public class ColumnTableNameResultDTO implements Serializable { + private static final long serialVersionUID = -8441112171986914418L; + //表名 + private String tableName; + //字段中文名 + private String label; + //字段名 + private String columnName; +} diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 58def540a4..a344922c2b 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -11,6 +11,7 @@ import com.epmet.dto.result.*; import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,8 +24,8 @@ import java.util.Set; * @author yinzuomei@elink-cn.com * @date 2020/6/4 13:16 */ -//@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class,url = "http://localhost:8089") -@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class) +@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class,url = "http://localhost:8089") +//@FeignClient(name = ServiceConstant.OPER_CUSTOMIZE_SERVER, fallbackFactory = OperCustomizeOpenFeignClientFallbackFactory.class) public interface OperCustomizeOpenFeignClient { @PostMapping(value = "/oper/customize/customerfootbar/customerfootbars", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @@ -88,4 +89,12 @@ public interface OperCustomizeOpenFeignClient { */ @PostMapping("/oper/customize/icform/items") Result> listItems(@RequestBody CustomerFormQueryDTO formDto); + + /** + * @Author sun + * @Description 居民信息新增查询各表必填字段 + **/ + @PostMapping("/oper/customize/icformitem/getmustcolumn/{customerId}") + Result> getMustColumn(@PathVariable("customerId") String customerId); + } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 2420adb817..6aa1809620 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -74,4 +74,9 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result> listItems(CustomerFormQueryDTO formDto) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "listItems", formDto); } + + @Override + public Result> getMustColumn(String customerId) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getMustColumn", customerId); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java index 3c6bbf4004..50f4d10ff9 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemController.java @@ -26,6 +26,8 @@ import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.dto.IcFormItemDTO; +import com.epmet.dto.result.ColumnTableNameResultDTO; +import com.epmet.dto.result.CustomerStaffRoleResultDTO; import com.epmet.excel.IcFormItemExcel; import com.epmet.service.IcFormItemService; import org.springframework.beans.factory.annotation.Autowired; @@ -91,4 +93,13 @@ public class IcFormItemController { ExcelUtils.exportExcelToTarget(response, null, list, IcFormItemExcel.class); } + /** + * @Author sun + * @Description 居民信息新增查询各表必填字段 + **/ + @PostMapping("getmustcolumn/{customerId}") + public Result> getMustColumn(@PathVariable String customerId) { + return new Result>().ok(icFormItemService.getMustColumn(customerId)); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java index b07c41ef84..a0ad3ad839 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemDao.java @@ -18,6 +18,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.result.ColumnTableNameResultDTO; import com.epmet.dto.result.ConditionResultDTO; import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; @@ -64,4 +65,10 @@ public interface IcFormItemDao extends BaseDao { List querySubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); Set queryIcResiSubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); + + /** + * @Author sun + * @Description 居民信息新增查询各表必填字段 + **/ + List getMustColumn(@Param("customerId")String customerId); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java index 15967aef43..32480613c2 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemService.java @@ -21,6 +21,7 @@ import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormItemDTO; import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.ColumnTableNameResultDTO; import com.epmet.dto.result.ConditionResultDTO; import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; @@ -115,4 +116,10 @@ public interface IcFormItemService extends BaseService { List querySubTables(String customerId, String formCode); Set queryIcResiSubTables(String customerId, String formCode); + + /** + * @Author sun + * @Description 居民信息新增查询各表必填字段 + **/ + List getMustColumn(String customerId); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java index c79d2e8fa0..a114d68126 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcFormItemDao; import com.epmet.dto.IcFormItemDTO; import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.ColumnTableNameResultDTO; import com.epmet.dto.result.ConditionResultDTO; import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.TableHeaderResultDTO; @@ -153,4 +154,13 @@ public class IcFormItemServiceImpl extends BaseServiceImpl getMustColumn(String customerId) { + return baseDao.getMustColumn(customerId); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml index e8e67a4ba3..61a1c155c9 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemDao.xml @@ -141,4 +141,21 @@ AND m.CUSTOMER_ID = #{customerId} AND m.FORM_CODE = #{formCode} + + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 7bb1faee36..bed6dd6e50 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -162,6 +162,28 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { //循环自动拼接sql语句,往多个表新增数据 + //0.校验必填字段是否为空 + Result> resultList = operCustomizeOpenFeignClient.getMustColumn(tokenDto.getCustomerId()); + if (resultList.success() && null != resultList.getData()) { + StringBuffer str = new StringBuffer(""); + formDTO.forEach(f -> { + resultList.getData().forEach(l -> { + if (f.getTableName().equals(l.getTableName())) { + f.getList().forEach(map -> { + if (!map.containsKey(l.getColumnName())) { + str.append(str.length() < NumConstant.ONE ? l.getLabel() : "、" + l.getLabel()); + } + }); + } + }); + }); + if (!"".equals(str)) { + throw new RenException(String.format("新增居民信息,必要字段值为空,%s值为空", str)); + } + } else { + throw new RenException(String.format("新增居民信息-根据客户Id查询必填信息失败,customerId->%s", tokenDto.getCustomerId())); + } + //1.先往主表新增数据 //主表Id String resiUserId = UUID.randomUUID().toString().replaceAll("-", ""); From 71b4875446cfc709de9953a4e606105a9fec1be7 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Wed, 3 Nov 2021 15:37:42 +0800 Subject: [PATCH 108/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=88=BF=E5=B1=8B?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/feign/GovOrgOpenFeignClient.java | 9 +++++++++ .../GovOrgOpenFeignClientFallback.java | 5 +++++ .../epmet/controller/IcHouseController.java | 11 ++++++++++ .../main/java/com/epmet/dao/IcHouseDao.java | 9 +++++++++ .../com/epmet/service/IcHouseService.java | 9 +++++++++ .../service/impl/IcHouseServiceImpl.java | 20 +++++++++++++++---- .../src/main/resources/mapper/IcHouseDao.xml | 12 +++++++++++ 7 files changed, 71 insertions(+), 4 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index d7621bd88b..4784584218 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -507,4 +507,13 @@ public interface GovOrgOpenFeignClient { */ @PostMapping("/gov/org/icneighborhood/neighborhoodoption") Result> getNeighborHoodOptions(IcNeighborHoodDTO dto); + + /** + * @Description 查询房屋信息 + * @param idCard + * @author zxc + * @date 2021/11/3 3:30 下午 + */ + @PostMapping("/gov/org/ichouse/selecthouseinfobyidcard") + Result> selectHouseInfoByIdCard(@RequestParam("idCard")String idCard); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 7e53823382..95219d6b1b 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -305,6 +305,11 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getNeighborHoodOptions", dto); } + @Override + public Result> selectHouseInfoByIdCard(String idCard) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectHouseInfoByIdCard", idCard); + } + @Override public Result selectPidsByGridId(String gridId) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectPidsByGridId", gridId); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java index 982bf33835..4092579603 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java @@ -88,4 +88,15 @@ public class IcHouseController { return new Result>().ok(icHouseService.getHouseOption(formDTO)); } + /** + * @Description 查询房屋信息 + * @param idCard + * @author zxc + * @date 2021/11/3 3:30 下午 + */ + @PostMapping("selecthouseinfobyidcard") + public Result> selectHouseInfoByIdCard(@RequestParam("idCard")String idCard){ + return new Result>().ok(icHouseService.selectHouseInfoByIdCard(idCard)); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java index fd07309c02..07ca76c21c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java @@ -52,4 +52,13 @@ public interface IcHouseDao extends BaseDao { List searchAllHouse(@Param("house") IcHouseEntity house); List queryHouseInfo(@Param("houseIdList") Set houseIdList); + + /** + * @Description 查询房屋信息 + * @param idCard + * @author zxc + * @date 2021/11/3 3:30 下午 + */ + List selectHouseInfoByIdCard(@Param("idCard") String idCard); + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java index 471007a582..2f434ab350 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java @@ -103,4 +103,13 @@ public interface IcHouseService extends BaseService { * @Date 2021/10/25 17:04 */ List getHouseOption(HouseFormDTO formDTO); + + /** + * @Description 查询房屋信息 + * @param idCard + * @author zxc + * @date 2021/11/3 3:30 下午 + */ + List selectHouseInfoByIdCard(String idCard); + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 0a6f7f50c4..041bdc6b54 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -36,10 +36,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -135,4 +132,19 @@ public class IcHouseServiceImpl extends BaseServiceImpl selectHouseInfoByIdCard(String idCard) { + List result = baseDao.selectHouseInfoByIdCard(idCard); + if (CollectionUtils.isEmpty(result)){ + return new ArrayList<>(); + } + return result; + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index 3dc145833a..e150566f8a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -252,4 +252,16 @@ ih.ID = #{houseId} + + + \ No newline at end of file From 777aa9e0c071d7bad2be5cd32cf5e2efd75e2130 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Wed, 3 Nov 2021 15:41:44 +0800 Subject: [PATCH 109/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=88=BF=E5=B1=8B?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/result/PersonDataResultDTO.java | 7 +++++-- .../epmet/service/impl/IcResiUserServiceImpl.java | 13 +++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java index 22a6fc3c41..ae4082c383 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java @@ -52,7 +52,10 @@ public class PersonDataResultDTO implements Serializable { /** * 志愿者类别 */ - private String volunteerCategory; + private List volunteerCategory; + + @JsonIgnore + private List volunteerCategoryEn; public PersonDataResultDTO() { this.workUnit = ""; @@ -61,7 +64,7 @@ public class PersonDataResultDTO implements Serializable { this.name = ""; this.financialSituation = new FinancialSituationDTO(); this.houseInfo = new ArrayList<>(); - this.volunteerCategory = ""; + this.volunteerCategory = new ArrayList<>(); } /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index bed6dd6e50..d668fd4c71 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -964,9 +964,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> listResult = govOrgOpenFeignClient.selectHouseInfoByIdCard(personData.getIdCard()); + if (!listResult.success()){ + throw new RenException("查询房屋信息失败"); + } + personData.setHouseInfo(listResult.getData()); // TODO - return null; + return personData; } /** From ca1490649eb6691eab8ccaaf4ead031f5920ac52 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 3 Nov 2021 15:55:11 +0800 Subject: [PATCH 110/253] =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=EF=BC=8C=E5=A2=9E=E5=8A=A0staffId=EF=BC=8C?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=89=8D=E5=B7=A5=E4=BD=9C=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E6=89=80=E5=B1=9E=E7=BB=84=E7=BB=87=E5=8F=8A=E4=B8=8B?= =?UTF-8?q?=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/form/IcResiUserPageFormDTO.java | 3 ++ .../controller/IcResiUserController.java | 1 + .../java/com/epmet/dao/IcResiUserDao.java | 4 ++- .../service/impl/IcResiUserServiceImpl.java | 14 +++++++-- .../main/resources/mapper/IcResiUserDao.xml | 29 +++++++++++++++++-- 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java index 44eb3bf105..bf75ed325f 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/IcResiUserPageFormDTO.java @@ -34,5 +34,8 @@ public class IcResiUserPageFormDTO implements Serializable { */ private List conditions; private Boolean pageFlag; + + @NotBlank(message = "当前用户id不能为空", groups = AddUserInternalGroup.class) + private String staffId; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index bc1472c954..5fe518e8dc 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -307,6 +307,7 @@ public class IcResiUserController { public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setCustomerId(tokenDto.getCustomerId()); + pageFormDTO.setStaffId(tokenDto.getUserId()); ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); return new Result>>().ok(icResiUserService.pageResiMap(pageFormDTO)); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 329447a24f..a73caaccf6 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -54,7 +54,9 @@ public interface IcResiUserDao extends BaseDao { @Param("formCode") String formCode, @Param("conditions") List conditions, @Param("resultColumns") List resultColumns, - @Param("subTables") List subTables); + @Param("subTables") List subTables, + @Param("currentStaffAgencyId")String currentStaffAgencyId, + @Param("staffOrgPath") String staffOrgPath); /** * 查询主表 * diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index e116058d4e..90e2765078 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -293,6 +293,12 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> pageResiMap(IcResiUserPageFormDTO formDTO) { + CustomerStaffInfoCacheResult staffInfoCacheResult=CustomerStaffRedis.getStaffInfo(formDTO.getCustomerId(),formDTO.getStaffId()); + String staffOrgPath=StrConstant.EPMETY_STR; + if(StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds())&& !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())){ + staffOrgPath=staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); + } + // 查询列表展示项,如果没有,直接返回 CustomerFormQueryDTO queryDTO1=new CustomerFormQueryDTO(); queryDTO1.setCustomerId(formDTO.getCustomerId()); @@ -309,18 +315,22 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> pageInfo=new PageInfo<>(); if (null == formDTO.getPageFlag()||formDTO.getPageFlag()) { //分页 + String finalStaffOrgPath = staffOrgPath; pageInfo= PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize()).doSelectPageInfo(() -> baseDao.selectListResiMap(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getConditions(), resultColumns, - subTables)); + subTables, + staffInfoCacheResult.getAgencyId(), finalStaffOrgPath + )); }else{ List> list=baseDao.selectListResiMap(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getConditions(), resultColumns, - subTables); + subTables,staffInfoCacheResult.getAgencyId(), + staffOrgPath); pageInfo.setTotal(CollectionUtils.isEmpty(list)?NumConstant.ZERO:list.size()); pageInfo.setList(list); } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 12b430d2f3..6e91e4f0c0 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -44,8 +44,32 @@ select * from ${subTableName} where del_flag='0' and IC_RESI_USER=#{icResiUserId} and customer_id=#{customerId} + + + ic_resi_user.DEL_FLAG = '0' + and ic_resi_user.customer_id=#{customerId} + and (ic_resi_user.AGENCY_ID =#{currentStaffAgencyId} or ic_resi_user.pids like concat(#{staffOrgPath},'%')) + + + + + + and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} + + + + and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + - + + and ${subCondition.tableName}.${subCondition.columnName} between #{subCondition.columnValue[0]} and #{subCondition.columnValue[1]} + + + + + + + ic_resi_user.DEL_FLAG = '0' and ic_resi_user.customer_id=#{customerId} @@ -73,6 +97,7 @@ + + + + \ No newline at end of file From b3b9bee28211617e767418466ea244671747d582 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 3 Nov 2021 20:15:52 +0800 Subject: [PATCH 115/253] =?UTF-8?q?=E5=A4=84=E7=90=86=E9=83=A8=E5=88=86rem?= =?UTF-8?q?ote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 12 +--- .../service/impl/IcResiUserServiceImpl.java | 62 ++++++++++++------ .../main/resources/excel/ic_resi_info_cid.xls | Bin 80384 -> 80384 bytes 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index ed92350d41..4ed686ba22 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -329,14 +329,13 @@ public class IcResiUserController { @RequestMapping(value = "/exportExcel") public void exportExcel(/*@LoginUser TokenDto tokenDto,*/ @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { - pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); Map itemMap = new HashMap<>(); for (FormItem formItem : resiFormItems.getItemList()) { - if (StringUtils.isNotBlank(formItem.getColumnName())){ + if (StringUtils.isBlank(formItem.getColumnName())){ continue; } if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select")){ @@ -344,7 +343,7 @@ public class IcResiUserController { } if (formItem.getChildGroup() != null) { for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { - if (StringUtils.isNotBlank(item2.getColumnName())){ + if (StringUtils.isBlank(item2.getColumnName())){ continue; } if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select")){ @@ -357,7 +356,7 @@ public class IcResiUserController { for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { if (groupItem.getItemList() != null) { for (FormItem2 item : groupItem.getItemList()) { - if (StringUtils.isNotBlank(item.getColumnName())){ + if (StringUtils.isBlank(item.getColumnName())){ continue; } if (item.getItemType().equals("checkbox") || item.getItemType().equals("select")){ @@ -383,10 +382,6 @@ public class IcResiUserController { if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { - //itemMap = item.getChildGroup().getItemList().stream().filter(o -> o.getItemType().equals("checkbox")).collect(Collectors.toMap(o -> o.getColumnName().concat(o.getColumnNum() == 0 ? "" : o.getColumnNum().toString()), o -> ConvertUtils.sourceToTarget(o,FormItem.class))); - - - Map> resiChildMap = icResiUserService.getDataForExport(itemMap, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); resiChildMap.forEach((key,value)->{ value.putAll(resiMainList.get(key)); @@ -394,7 +389,6 @@ public class IcResiUserController { Map mapData2 = new HashMap<>(); mapData2.put("list", resiChildMap.values()); - System.out.println("========="+item.getChildGroup().getTableName()+" data:"+resiChildMap.size()); sheetMap.put(n.incrementAndGet(),mapData2); } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index d2c5b2dbed..9b39543c43 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -92,10 +92,10 @@ public class IcResiUserServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( @@ -534,11 +534,11 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper, List> dataRows, + private void persist(Map headerColumnWrapper, List> dataRows, String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName, String currUserAgencyPids, String currentUserId) { for (Map row : dataRows) { - + // 当前行的列们 // List columnsOfCurrRow = new ArrayList<>(); @@ -594,7 +594,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> result = new LinkedHashMap<>(); mapList.stream().filter(Objects::nonNull).forEach(map -> { String resiId = (String) map.getOrDefault(UserConstant.IC_RESI_USER, ""); - formItemMap.forEach((k, v)->{ + for (Map.Entry e : formItemMap.entrySet()) { + String k = e.getKey(); + FormItem v = e.getValue(); Object temp = map.get(k); if (temp != null) { if (v.getOptionSourceType().equals("remote")) { - //todo 获取 options - } - if (v.getItemType().equals("checkbox")) { - v.getOptions().forEach(optionDTO -> { - map.put(optionDTO.getValue(), temp.toString().contains(optionDTO.getValue()) ? "是" : "否"); - }); - } else if (v.getItemType().equals("select")) { - v.getOptions().forEach(optionDTO -> { - map.put(optionDTO.getValue(), temp.toString().equals(optionDTO.getValue()) ? optionDTO.getLabel() : ""); - }); + try { + //todo 获取 options + Map stringMap = listRemoteOptions(new HashMap<>(), v.getOptionSourceValue(), null); + System.out.println("======remote:"+v.getLabel()+" "+JSON.toJSONString(stringMap)); + if ("checkbox".equals(v.getItemType())) { + stringMap.forEach((label, value) -> map.put(value, temp.toString().contains(value) ? "是" : "否")); + } else if ("select".equals(v.getItemType())) { + + stringMap.forEach((label,value)->{ + if (temp.toString().equals(value)){ + map.put(k, label); + } + }); + } + } catch (Exception ex) { + log.warn("listRemoteOptions url:{}",v.getOptionSourceValue()); + } + } else { + if ("checkbox".equals(v.getItemType())) { + v.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(), temp.toString().contains(optionDTO.getValue()) ? "是" : "否"); + }); + } else if ("select".equals(v.getItemType())) { + v.getOptions().forEach(optionDTO -> { + if (optionDTO.getLabel().equals(temp.toString())){ + map.put(k, optionDTO.getLabel()); + } + }); + } } } - }); + } if ("ic_resi_user".equals(baseTableName)) { resiId = (String) map.get("ID"); } @@ -1085,6 +1108,7 @@ public class IcResiUserServiceImpl extends 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 F{2%rR{Yn4; delta 13295 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 Date: Wed, 3 Nov 2021 23:14:20 +0800 Subject: [PATCH 116/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9excel=E8=A1=A8=E5=A4=B4=E8=A7=A3=E6=9E=90=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E4=BD=BF=E6=9B=B4=E9=80=9A=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/IcResiUserServiceImpl.java | 189 +++++++++++------- 1 file changed, 119 insertions(+), 70 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index e116058d4e..1ce99e36da 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -435,9 +435,12 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> headList = readListener.getHeadList(); List> dataList = readListener.getDataList(); @@ -458,10 +470,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> headers = mergeHead(headList); // 查询form相关信息 - CustomerFormQueryDTO form = new CustomerFormQueryDTO(); - form.setFormCode("resi_base_info"); - Result> result = operCustomizeOpenFeignClient.listItems(form); - List customerItems = getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); + List customerItems = listFormItems("resi_base_info"); // 清洗表头数据 Map abandonedHeaders = washHeaders(headers, customerItems); @@ -481,12 +490,57 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formItem) ); - Map headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders); + Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); // 持久化 persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, customerItems.get(0).getTableName(), currUserAgencyPids, currentUserId); - return headerColumnWrapper; + return headers; + } + + /** + * excel导入居民附加信息 + * @param excelPathName + * @param sheetNo + * @param headRowNumber + * @param currUserAgencyId + * @param currUserAgencyPids + * @param currentUserId + * @return + */ + private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) { + DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); + EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); + + List> headList = readListener.getHeadList(); + List> dataList = readListener.getDataList(); + + Map> headers = mergeHead(headList); + + // 查询form相关信息 + List customerItems = listFormItems("resi_base_info"); + + // 清洗表头数据 + Map abandonedHeaders = washHeaders(headers, customerItems); + + //合并多级表头 + HashMap> combinedHeaders = combineHeaders(headers); + + // 得到客户配置item数据 + Map formItemMap = customerItems.stream().collect( + Collectors.toMap(formItem -> { + String groupLabel = formItem.getGroupLabel(); + String label = formItem.getLabel(); + if (StringUtils.isNotBlank(groupLabel)) { + return groupLabel.concat(":").concat(label); + } else { + return label; + } + }, formItem -> formItem) + ); + Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); + + return formItemMap; } /** @@ -574,6 +628,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl listFormItems(String formCode) { + CustomerFormQueryDTO form = new CustomerFormQueryDTO(); + form.setFormCode(formCode); + Result> result = operCustomizeOpenFeignClient.listItems(form); + return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); + } + /** * @description 合并头 * @@ -626,14 +692,21 @@ public class IcResiUserServiceImpl extends BaseServiceImpl integrate(Map formItemMap, Map> combinedHeaders, - List> datas, Map abandonedHeaders) { + private Map convertExcelHeaders2DBColumnWrappers(Map formItemMap, Map> combinedHeaders, + List> datas, Map abandonedHeaders) { // HashMap> tables = new HashMap<>(); Map columns = new LinkedHashMap<>(combinedHeaders.size()); @@ -806,6 +879,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> * * @param headList * @return @@ -813,67 +887,42 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> mergeHead(List> headList) { - Map l1 = headList.get(0); - Map l2 = headList.get(1); - Map l3 = headList.get(2); - - String l1LastHeadName = ""; - String l2LastHeadName = ""; - - //Map resultMap = new HashMap<>(); - HashMap> result = new HashMap<>(); - - for (Map.Entry entry : l1.entrySet()) { - - StringBuilder headerNameConcatStr = new StringBuilder(); - Integer key = entry.getKey(); - String l1TempValue = entry.getValue(); + Map lastNotNullHeads = new LinkedHashMap<>(); + + Map> mergedHead = new LinkedHashMap<>(); + + int levelCount = headList.size(); - String l2TempValue = l2.get(key); - String l3TempValue = l3.get(key); + Map firstLevel = headList.get(0); + + // 遍历所有列 + for (Map.Entry column : firstLevel.entrySet()) { + Integer columIndex = column.getKey(); - if (StringUtils.isNotBlank(l1TempValue)) { - l1LastHeadName = l1TempValue; - } - - if (StringUtils.isNotBlank(l2TempValue)) { - l2LastHeadName = l2TempValue; - } - - // 开始拼接 - if (StringUtils.isNotBlank(l3TempValue)) { - //headerNameConcatStr.append(l1LastHeadName).append(":").append(l2LastHeadName).append(":").append(l3TempValue); - //resultMap.put(key, headerNameConcatStr.toString()); - ArrayList parts = new ArrayList<>(); - parts.add(l1LastHeadName); - parts.add(l2LastHeadName); - parts.add(l3TempValue); - result.put(key, parts); - continue; - } - - if (StringUtils.isNotBlank(l2TempValue)) { - //headerNameConcatStr.append(l1LastHeadName).append(":").append(l2LastHeadName); - //resultMap.put(key, headerNameConcatStr.toString()); - ArrayList parts = new ArrayList<>(); - parts.add(l1LastHeadName); - parts.add(l2LastHeadName); - result.put(key, parts); - continue; - } - - if (StringUtils.isNotBlank(l1TempValue)) { - //headerNameConcatStr.append(l1LastHeadName); - //resultMap.put(key, headerNameConcatStr.toString()); - ArrayList parts = new ArrayList<>(); - parts.add(l1LastHeadName); - result.put(key, parts); - continue; + List labels = new ArrayList<>(); + + // 竖着遍历该列的所有行 + for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) { + String label = headList.get(currentLevel).get(columIndex); + + if (StringUtils.isNotBlank(label)) { + lastNotNullHeads.put(currentLevel, label); + } else { + if (currentLevel == 0 || StringUtils.isBlank(headList.get(currentLevel - 1).get(columIndex))) { + label = lastNotNullHeads.get(currentLevel); + } + } + + if (StringUtils.isNotBlank(label)) { + labels.add(label); + } } + mergedHead.put(columIndex, labels); } - return result; + + return mergedHead; } /** From 03750f51f8d2a1e2fc32117364dc7620882d5243 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 4 Nov 2021 10:09:24 +0800 Subject: [PATCH 117/253] =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcResiUserDao.xml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index cff59d414d..b3fce33028 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -54,11 +54,15 @@ - and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} + + and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} + - and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + + and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + @@ -78,11 +82,15 @@ - and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} + + and ${subCondition.tableName}.${subCondition.columnName} = #{subCondition.columnValue[0]} + - and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + + and ${subCondition.tableName}.${subCondition.columnName} like concat('%',#{subCondition.columnValue[0]},'%') + From fd0edf1ca15eb4d49c703f34d9f0988a2c1fba3e Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 4 Nov 2021 12:50:56 +0800 Subject: [PATCH 118/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 47 +++++++++++------- .../service/impl/IcResiUserServiceImpl.java | 35 +++++++------ .../main/resources/excel/ic_resi_info_cid.xls | Bin 80384 -> 79872 bytes 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 4ed686ba22..a1e725dd10 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -333,40 +333,53 @@ public class IcResiUserController { pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); - Map itemMap = new HashMap<>(); + Map> otherSheetItems = new HashMap<>(); + + //主表的 for (FormItem formItem : resiFormItems.getItemList()) { if (StringUtils.isBlank(formItem.getColumnName())){ continue; } - if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select")){ + + Map itemMap = otherSheetItems.getOrDefault(formItem.getTableName(),new HashMap<>()); + otherSheetItems.putIfAbsent(formItem.getTableName(),itemMap); + if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select") || formItem.getItemType().equals("radio")){ itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); } if (formItem.getChildGroup() != null) { + itemMap = otherSheetItems.getOrDefault(formItem.getChildGroup().getTableName(),new HashMap<>()); + otherSheetItems.putIfAbsent(formItem.getChildGroup().getTableName(),itemMap); for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { if (StringUtils.isBlank(item2.getColumnName())){ continue; } - if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select")){ + + if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select") || item2.getItemType().equals("radio")){ itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2,FormItem.class)); } } } } + //其他sheet + for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { - if (groupItem.getItemList() != null) { - for (FormItem2 item : groupItem.getItemList()) { - if (StringUtils.isBlank(item.getColumnName())){ - continue; - } - if (item.getItemType().equals("checkbox") || item.getItemType().equals("select")){ - itemMap.put(item.getColumnName().concat(item.getColumnNum() == 0 ? "" : item.getColumnNum().toString()), ConvertUtils.sourceToTarget(item, FormItem.class)); - } + if (groupItem.getItemList() == null) { + continue; + } + Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(),new HashMap<>()); + otherSheetItems.putIfAbsent(groupItem.getTableName(),itemMap); + for (FormItem2 formItem2 : groupItem.getItemList()) { + if (StringUtils.isBlank(formItem2.getColumnName())) { + continue; + } + if (formItem2.getItemType().equals("checkbox") || formItem2.getItemType().equals("select")|| formItem2.getItemType().equals("radio")) { + itemMap.put(formItem2.getColumnName().concat(formItem2.getColumnNum() == 0 ? "" : formItem2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItem2, FormItem.class)); } } } - System.out.println("checkbox:"+JSON.toJSONString(itemMap)); - Map> resiMainList = icResiUserService.getDataForExport(itemMap,pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + + Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; @@ -379,13 +392,11 @@ public class IcResiUserController { AtomicInteger n = new AtomicInteger(); for (FormItem item : resiFormItems.getItemList()) { - if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { - Map> resiChildMap = icResiUserService.getDataForExport(itemMap, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); - resiChildMap.forEach((key,value)->{ - value.putAll(resiMainList.get(key)); - }); + Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); + resiChildMap.forEach((key,value)-> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); mapData2.put("list", resiChildMap.values()); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index af1e0e4578..796c7ff032 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -489,7 +489,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formItem) ); Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); - + return formItemMap; } @@ -895,7 +895,9 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> mergeHead(List> headList) { Map lastNotNullHeads = new LinkedHashMap<>(); - + Map> mergedHead = new LinkedHashMap<>(); - + int levelCount = headList.size(); Map firstLevel = headList.get(0); - + // 遍历所有列 for (Map.Entry column : firstLevel.entrySet()) { Integer columIndex = column.getKey(); List labels = new ArrayList<>(); - + // 竖着遍历该列的所有行 for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) { String label = headList.get(currentLevel).get(columIndex); - + if (StringUtils.isNotBlank(label)) { lastNotNullHeads.put(currentLevel, label); } else { @@ -966,7 +968,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, String customerId, String formCode, String baseTableName, List conditions) { List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions); - + System.out.println("======remote:"+baseTableName+" "+JSON.toJSONString(formItemMap)); Map> result = new LinkedHashMap<>(); mapList.stream().filter(Objects::nonNull).forEach(map -> { String resiId = (String) map.getOrDefault(UserConstant.IC_RESI_USER, ""); @@ -1110,11 +1112,9 @@ public class IcResiUserServiceImpl extends BaseServiceImpl stringMap = listRemoteOptions(new HashMap<>(), v.getOptionSourceValue(), null); - System.out.println("======remote:"+v.getLabel()+" "+JSON.toJSONString(stringMap)); if ("checkbox".equals(v.getItemType())) { stringMap.forEach((label, value) -> map.put(value, temp.toString().contains(value) ? "是" : "否")); } else if ("select".equals(v.getItemType())) { - stringMap.forEach((label,value)->{ if (temp.toString().equals(value)){ map.put(k, label); @@ -1132,7 +1132,13 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { - if (optionDTO.getLabel().equals(temp.toString())){ + if (optionDTO.getValue().equals(temp.toString())){ + map.put(k, optionDTO.getLabel()); + } + }); + } else if ("radio".equals(v.getItemType())) { + v.getOptions().forEach(optionDTO -> { + if (optionDTO.getValue().equals(temp.toString())){ map.put(k, optionDTO.getLabel()); } }); @@ -1173,7 +1179,6 @@ public class IcResiUserServiceImpl extends BaseServiceImplFQ~@|A1KYBs+D$ z^EpW~=Uow#V-OoRt=LyGb$Sx`Z(%&gAD!y_l;n(aE%%&?R(7z^&8Fww;fev=1Q}2S zi=YGw=(&VHowr`05hoYA@3k7Xc`PWZwQT6af0MBy(y)Uxr&>kMUE+q=fSyo-`>bGd@bc)&!i!r*BM3U_;?}dlY3(=!>GSrZHPv0c&gW=`~vb zIs*Xfw+V?Xc3mCo+u`KXHlJ6sJIsJUBJ<&WNp_-6Ne-eeNlv2fV7nU^(M|*H8*)p4 zn@+J;5A;Z~6MY~_?6p^tlj{?b~J?}iN7JdMIYHoIi6J%$!7?FSe+L>uT3MG&80_-0Fs2bykPduyP&&)eqUVd`QWG|eO zWT$)O7fBAHVM$J+(~{!A2WKR?h|aQ0!^_Uk|?j=C5iGnC&@|l zhom^7^OD3-x*$m$rB#yLw0+tjpkkq8u8|M<17|uDY{uDAK%o-l;qZ3Uo%Gr(q7cTc z!7c}0VY|O{@m<%ORs3`EbkyR-$y|nf8s_O{B(vC?2WAGl?KrC25)lSxAZ$$uQM5Nv z31Fx^4qa;YU#2+YkY17`%KmRjqUB(f;}wT#P3Wbvvb zC*9`Z5M48Yc)P_sr52!`7MzocgTeMxoZFj*dsPdJw^Y^~4jo9xUJY6BnJj!+dF;+m eI15Xn62xEcYZP=FHPILC^-%SEd;?#t)BXd9Ub<@l delta 2553 zcma);3v5$W7{|YJZ@WS%ecZAzH^eSes=T(Du(2Z9t7U`EDr_^`;$V>tXM`04M2wKm zY%@edd>pZzMu>@-&+*ui4H-<$Bta4f21I2bY>E#aGL*?=;QUVS<*XfBvYy=B^SkH! zzVn^${Lk&J?bFp>)4iIK7y|8Q1qfo7;Pv0o&=7z67G7`fSxTjewQKWJ=JQAFvUD;{ z@_Xr_49B$8YW~PT%9fTC^*rLQC|*&uw0cVeOoR4%N?g;WXF@d5HBCz1OEd8n_?njE zZO3W)yeoeC(>J*D1VU=pFW>KrbdQI?WXfDi49k_TFrAxBx8Q<2I~K@#mR!-h_r`Qhp3!=a+;df)s;*Ue;x+=k&od`_%el%%O@uz-aTX3Q9@kz3C8L|d)X4pI z;|7+Y=@{Z*yFD?4eY0o|$FAS;f2EXaoRi68|nn+4gCcCw>2sj-QAG#im6!3R7` z-e8C()^9bwvlZa{>j3WtG0AvBw=`N=Z^I=yV;5TTJOT5}h24V8NP7fXkXi&;kr=gg zc}P=mk3!Zg@WH3rAYX0{>=k52Y8Awn+a}10Cwd?2f9ZtDYzSvSz<|wY#EjiEA+*?- z^d6QKE3&zT)r8XYfzLEwo@^fM7sQio7sQi2Ac!Y>P>>C&Ly&?|J{M%iu`dKoLHbf7 zUeFwPl-|=dPc8s;(d_W{PCI46IFo{-YOxiC?P^&k85iOd4V?fgH5Een1UA$gi-wU95E%sLc5U$G9GEVDqj zofx0`9pGvoz$*h{hNd&CWpa+%dy0#DB0}XuuOKs?@Sg=)kbV(lMLI9YhX1?23Q~}M zqX&D+$#I&{>o3O1!y=Z#>ia_wSKkFeTzwY>S&=RYvLRg-#1Gq_^lWbexxxl}J7P@+ z93miLGZ@&RfkraPBN5nYATY~Bs6TX_RSa&INnb<-R}uZ#LMxoAYKms38cQItoRZi#C)f=t+kWq>}LLsyDe*3rn_3=f)*z^(0V`FC&$$8 xoWJeLv9^v`q*X`W2yRFrb<%6jwi_wLr@xD$AOC>chW9tMKIg`^@-(u8{12xY3WNXv From c5d81c278087202067bcffc487b2fcc1e6f17699 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 4 Nov 2021 16:00:59 +0800 Subject: [PATCH 119/253] bug#2306 --- .../com/epmet/dto/form/IcPropertyManagementFormDTO.java | 2 +- .../com/epmet/controller/PropertyManagementController.java | 7 +++++-- .../java/com/epmet/service/PropertyManagementService.java | 7 +------ .../epmet/service/impl/PropertyManagementServiceImpl.java | 3 ++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java index ae5f2f9903..cd05a2a13d 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java @@ -43,7 +43,7 @@ public class IcPropertyManagementFormDTO implements Serializable { * 物业名称 */ @NotBlank(message = "物业名称不能为空", groups = {AddGroup.class, UpdateGroup.class}) - @Length(max=10,message = "物业名称不能超过100个字", groups = {AddGroup.class, UpdateGroup.class}) + @Length(max=50,message = "物业名称不能超过50个字", groups = {AddGroup.class, UpdateGroup.class}) private String name; diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java index 6d35f9af68..d97e1300e1 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java @@ -33,7 +33,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -63,8 +65,9 @@ public class PropertyManagementController { public Result add(@LoginUser TokenDto tokenDTO, @RequestBody IcPropertyManagementFormDTO formDTO){ //效验数据 ValidatorUtils.validateEntity(formDTO, AddGroup.class); - propertyManagementService.add(formDTO); - return new Result().ok("保存成功"); + Map map=new HashMap<>(); + map.put("propertyId",propertyManagementService.add(formDTO)); + return new Result().ok(map); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java index 5fe43468e9..7bbbad3616 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/PropertyManagementService.java @@ -17,15 +17,10 @@ package com.epmet.service; -import com.epmet.commons.mybatis.service.BaseService; -import com.epmet.commons.tools.page.PageData; -import com.epmet.dto.IcPropertyManagementDTO; import com.epmet.dto.form.IcPropertyManagementFormDTO; import com.epmet.dto.result.IcPropertyManagementResultDTO; -import com.epmet.entity.IcPropertyManagementEntity; import java.util.List; -import java.util.Map; /** * 物业表 @@ -37,7 +32,7 @@ public interface PropertyManagementService { List getList(); - void add(IcPropertyManagementFormDTO formDTO); + String add(IcPropertyManagementFormDTO formDTO); void update(IcPropertyManagementFormDTO formDTO); void delete(IcPropertyManagementFormDTO formDTO); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java index 4068fb710d..258a48bd65 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java @@ -43,9 +43,10 @@ public class PropertyManagementServiceImpl implements PropertyManagementService @Override @Transactional(rollbackFor = Exception.class) - public void add(IcPropertyManagementFormDTO formDTO) { + public String add(IcPropertyManagementFormDTO formDTO) { IcPropertyManagementEntity icPropertyManagementEntity = ConvertUtils.sourceToTarget(formDTO, IcPropertyManagementEntity.class); icPropertyManagementDao.insert(icPropertyManagementEntity); + return icPropertyManagementEntity.getId(); } @Override From f2fb5542194788df60672cb9efa2dff6e9d6b464 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 4 Nov 2021 16:59:30 +0800 Subject: [PATCH 120/253] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 296 ++++-------------- .../java/com/epmet/redis/IcResiUserRedis.java | 47 --- .../com/epmet/service/IcResiUserService.java | 60 ---- .../service/impl/IcResiUserServiceImpl.java | 53 ---- .../test/IcResiUserControllerTest.java | 183 +++++++++++ 5 files changed, 237 insertions(+), 402 deletions(-) delete mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java create mode 100644 epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index a1e725dd10..85bd642dcb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -18,44 +18,35 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; -import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; -import cn.afterturn.easypoi.excel.export.ExcelExportService; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.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.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; -import com.epmet.excel.IcResiUserExcel; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; -import java.io.FileOutputStream; import java.io.IOException; import java.net.URLEncoder; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -69,7 +60,7 @@ import java.util.concurrent.atomic.AtomicInteger; @RestController @RequestMapping("icresiuser") public class IcResiUserController { - private static final String BASE_TABLE_NAME = "ic_resi_user"; + private static final String BASE_TABLE_NAME = "ic_resi_user"; @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @@ -78,48 +69,6 @@ public class IcResiUserController { @Autowired private EpmetUserOpenFeignClient epmetUserOpenFeignClient; - @GetMapping("page") - public Result> page(@RequestParam Map params){ - PageData page = icResiUserService.page(params); - return new Result>().ok(page); - } - - @GetMapping("{id}") - public Result get(@PathVariable("id") String id){ - IcResiUserDTO data = icResiUserService.get(id); - return new Result().ok(data); - } - - @PostMapping - public Result save(@RequestBody IcResiUserDTO dto){ - //效验数据 - ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); - icResiUserService.save(dto); - return new Result(); - } - - @PutMapping - public Result update(@RequestBody IcResiUserDTO dto){ - //效验数据 - ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); - icResiUserService.update(dto); - return new Result(); - } - - @PostMapping("delete") - public Result delete(@LoginUser TokenDto tokenDto,@RequestBody DelIcResiUserFormDTO formDTO){ - formDTO.setCustomerId(tokenDto.getCustomerId()); - ValidatorUtils.validateEntity(formDTO,DelIcResiUserFormDTO.IdGroup.class); - icResiUserService.delete(formDTO); - return new Result(); - } - - @GetMapping("export") - public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { - List list = icResiUserService.list(params); - ExcelUtils.exportExcelToTarget(response, null, list, IcResiUserExcel.class); - } - /** * @Author sun * @Description 党建互联平台--保存居民信息 @@ -140,157 +89,6 @@ public class IcResiUserController { return new Result(); } - @GetMapping("download/template") - public void downloadTemplate(@RequestParam String customerId) throws Exception { - CustomerFormResultDTO resultForm = getResiFormItems(customerId); - - XSSFWorkbook workbook = new XSSFWorkbook(); - Map> sheetHeaderMap = buildHeaderByItem(resultForm); - //Workbook workbook = null; - for (Map.Entry> entry : sheetHeaderMap.entrySet()) { - String sheetName = entry.getKey(); - List headers = entry.getValue(); - System.out.println("headers:"+sheetName+JSON.toJSONString(headers)); - ExportParams exportParams = new ExportParams(null,sheetName); - //exportParams.setAutoSize(true); - List> dataSet = new ArrayList<>(); - HashMap map = new HashMap<>(); - map.put("1","2"); - dataSet.add(map); - new ExcelExportService().createSheetForMap(workbook, exportParams, headers, dataSet); - } - - FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); - workbook.write(fos); - fos.close(); - } - - @NotNull - private CustomerFormResultDTO getResiFormItems(String customerId) { - CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); - queryDTO.setFormCode("resi_base_info"); - queryDTO.setCustomerId(customerId); - Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); - if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); - } - System.out.println(JSON.toJSONString(resultForm.getData())); - return resultForm.getData(); - } - - @NotNull - private Map> buildHeaderByItem(CustomerFormResultDTO resultForm) { - //form中的itemlist 为一级表头 但是要排除每个item中含有childGroup的 - - List itemList = resultForm.getItemList(); - List groupList = resultForm.getGroupList(); - - Map> everySheetHeaderMap = new LinkedHashMap<>(); - - List firstSheetHeaderList = new ArrayList<>(); - //Map groupNameMap = groupList.stream().collect(Collectors.toMap(FormGroupDTO::getGroupId,FormGroupDTO::getLabel)); - itemList.forEach(item->{ - if (StringUtils.isBlank(item.getColumnName())){ - return; - } - - if (item.getChildGroup() == null){ - ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum())),30); - header.setNeedMerge(true); - firstSheetHeaderList.add(header); - return; - } - everySheetHeaderMap.putIfAbsent(resultForm.getFormName(),firstSheetHeaderList); - - //这些是动态的 formGroup - if (item.getChildGroup() != null){ - //baseTableName单独的一个sheet - System.out.println("childGroup:"+item.getLabel()); - if (BASE_TABLE_NAME.equals(item.getTableName())){ - // header = new ExcelExportEntity(item.getChildGroup().getLabel(),item.getChildGroup().getTableName()); - //header.setNeedMerge(true); - List otherSheetHeaderList = new ArrayList<>(); - //这里是设置除基础信息之外的sheet的表头 - item.getChildGroup().getItemList().forEach(item2->{ - if (!BASE_TABLE_NAME.equals(item2.getTableName())){ - everySheetHeaderMap.putIfAbsent(item.getLabel(),otherSheetHeaderList); - } - ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); - - otherSheetHeaderList.add(secondHeader); - if (!"radio".equals(item2.getItemType()) && CollectionUtils.isNotEmpty(item2.getOptions())){ - secondHeader.setNeedMerge(true); - List thirdHeaderList = new ArrayList<>(); - item2.getOptions().forEach(child->{ - ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); - thirdHeaderList.add(thirdHeader); - }); - secondHeader.setList(thirdHeaderList); - } - - }); - //header.setList(secondHeaderList); - //otherSheetHeaderList.add(header); - } - } - }); - groupList.forEach(item->{ - /* if (!"兴趣爱好".equals(item.getLabel()) && !"宗教信仰".equals(item.getLabel())){ - return; - }*/ - if (!BASE_TABLE_NAME.equals(item.getTableName())){ - return; - } - ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getTableName()); - header.setNeedMerge(true); - List secondHeaderList = new ArrayList<>(); - item.getItemList().forEach(item2->{ - ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); - secondHeader.setNeedMerge(true); - secondHeaderList.add(secondHeader); - if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(item2.getOptions())){ - List thirdHeaderList = new ArrayList<>(); - item2.getOptions().forEach(child->{ - ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel(),child.getValue()+ new Random(1).nextInt(2)); - thirdHeader.setNeedMerge(true); - thirdHeaderList.add(thirdHeader); - }); - secondHeader.setList(thirdHeaderList); - } - - }); - header.setList(secondHeaderList); - firstSheetHeaderList.add(header); - System.out.println(JSON.toJSONString(firstSheetHeaderList)); - }); - return everySheetHeaderMap; - } - - private void buildHeader(Map> everySheetHeaderMap, FormItem item, ExcelExportEntity header) { - List firstSheetHeaderList = new ArrayList<>(); - List secondHeaderList = new ArrayList<>(); - item.getChildGroup().getItemList().forEach(item2->{ - if (!BASE_TABLE_NAME.equals(item2.getTableName())){ - everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); - } - ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); - secondHeader.setNeedMerge(true); - secondHeaderList.add(secondHeader); - if (CollectionUtils.isNotEmpty(item2.getOptions())){ - List thirdHeaderList = new ArrayList<>(); - item2.getOptions().forEach(child->{ - ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); - thirdHeaderList.add(thirdHeader); - }); - secondHeader.setList(thirdHeaderList); - } - - }); - header.setList(secondHeaderList); - firstSheetHeaderList.add(header); - everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); - } - /** * @Description 根据房间号查人 * @Param formDTO @@ -304,32 +102,33 @@ public class IcResiUserController { } @PostMapping("listresi") - public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ + public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO) { //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setCustomerId(tokenDto.getCustomerId()); pageFormDTO.setStaffId(tokenDto.getUserId()); - ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); - return new Result>>().ok(icResiUserService.pageResiMap(pageFormDTO)); + ValidatorUtils.validateEntity(pageFormDTO, IcResiUserPageFormDTO.AddUserInternalGroup.class); + return new Result>>().ok(icResiUserService.pageResiMap(pageFormDTO)); } + /** * 编辑页面,显示居民信息详情 * * @param pageFormDTO - * @return com.epmet.commons.tools.utils.Result + * @return com.epmet.commons.tools.utils.Result * @author yinzuomei * @date 2021/10/28 10:29 上午 */ @PostMapping("detail") - public Result queryIcResiDetail(@LoginUser TokenDto tokenDto,@RequestBody IcResiDetailFormDTO pageFormDTO){ + public Result queryIcResiDetail(@LoginUser TokenDto tokenDto, @RequestBody IcResiDetailFormDTO pageFormDTO) { //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); pageFormDTO.setCustomerId(tokenDto.getCustomerId()); - ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); + ValidatorUtils.validateEntity(pageFormDTO, IcResiDetailFormDTO.AddUserInternalGroup.class); return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); } @RequestMapping(value = "/exportExcel") - public void exportExcel(/*@LoginUser TokenDto tokenDto,*/ @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { - pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + public void exportExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { + pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); @@ -337,25 +136,25 @@ public class IcResiUserController { //主表的 for (FormItem formItem : resiFormItems.getItemList()) { - if (StringUtils.isBlank(formItem.getColumnName())){ + if (StringUtils.isBlank(formItem.getColumnName())) { continue; } - Map itemMap = otherSheetItems.getOrDefault(formItem.getTableName(),new HashMap<>()); - otherSheetItems.putIfAbsent(formItem.getTableName(),itemMap); - if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select") || formItem.getItemType().equals("radio")){ + Map itemMap = otherSheetItems.getOrDefault(formItem.getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(formItem.getTableName(), itemMap); + if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select") || formItem.getItemType().equals("radio")) { itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); } if (formItem.getChildGroup() != null) { - itemMap = otherSheetItems.getOrDefault(formItem.getChildGroup().getTableName(),new HashMap<>()); - otherSheetItems.putIfAbsent(formItem.getChildGroup().getTableName(),itemMap); + itemMap = otherSheetItems.getOrDefault(formItem.getChildGroup().getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(formItem.getChildGroup().getTableName(), itemMap); for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { - if (StringUtils.isBlank(item2.getColumnName())){ + if (StringUtils.isBlank(item2.getColumnName())) { continue; } - if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select") || item2.getItemType().equals("radio")){ - itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2,FormItem.class)); + if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select") || item2.getItemType().equals("radio")) { + itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2, FormItem.class)); } } @@ -367,40 +166,40 @@ public class IcResiUserController { if (groupItem.getItemList() == null) { continue; } - Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(),new HashMap<>()); - otherSheetItems.putIfAbsent(groupItem.getTableName(),itemMap); + Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(groupItem.getTableName(), itemMap); for (FormItem2 formItem2 : groupItem.getItemList()) { if (StringUtils.isBlank(formItem2.getColumnName())) { continue; } - if (formItem2.getItemType().equals("checkbox") || formItem2.getItemType().equals("select")|| formItem2.getItemType().equals("radio")) { + if (formItem2.getItemType().equals("checkbox") || formItem2.getItemType().equals("select") || formItem2.getItemType().equals("radio")) { itemMap.put(formItem2.getColumnName().concat(formItem2.getColumnNum() == 0 ? "" : formItem2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItem2, FormItem.class)); } } } - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; - TemplateExportParams params = new TemplateExportParams(templatePath,true); + TemplateExportParams params = new TemplateExportParams(templatePath, true); - Map> sheetMap = new HashMap<>(); + Map> sheetMap = new HashMap<>(); Map mapData = new HashMap<>(); mapData.put("list", resiMainList.values()); - sheetMap.put(0,mapData); + sheetMap.put(0, mapData); AtomicInteger n = new AtomicInteger(); for (FormItem item : resiFormItems.getItemList()) { if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); - resiChildMap.forEach((key,value)-> value.putAll(resiMainList.get(key))); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); + resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); mapData2.put("list", resiChildMap.values()); - sheetMap.put(n.incrementAndGet(),mapData2); + sheetMap.put(n.incrementAndGet(), mapData2); } } } @@ -408,8 +207,7 @@ public class IcResiUserController { Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); workbook.setActiveSheet(0); - //header - String fileName = "居民信息.xls"; + String fileName = "居民基本信息.xls"; response.setHeader("content-Type", "application/vnd.ms-excel"); response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); @@ -417,6 +215,7 @@ public class IcResiUserController { /** * excel导入居民基本信息 + * * @param loginUser * @return */ @@ -435,37 +234,50 @@ public class IcResiUserController { } @PostMapping("test") - public Result>> test(@RequestBody DynamicQueryFormDTO formDTO){ + public Result>> test(@RequestBody DynamicQueryFormDTO formDTO) { formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); //formDTO.setCustomerId(tokenDto.getCustomerId()); - return new Result>>().ok(icResiUserService.dynamicQuery(formDTO.getCustomerId(), + return new Result>>().ok(icResiUserService.dynamicQuery(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getResultTableName(), formDTO.getConditions())); } /** - * @Description 查询个人数据 * @param formDTO + * @Description 查询个人数据 * @author zxc * @date 2021/11/3 9:21 上午 */ @PostMapping("persondata") - public Result personData(@RequestBody PersonDataFormDTO formDTO){ + public Result personData(@RequestBody PersonDataFormDTO formDTO) { return new Result().ok(icResiUserService.personData(formDTO)); } /** - * @Description 根据名字搜索 * @param formDTO * @param tokenDto + * @Description 根据名字搜索 * @author zxc * @date 2021/11/3 1:42 下午 */ @PostMapping("searchbyname") - public Result> searchByName(@RequestBody SearchByNameFormDTO formDTO, @LoginUser TokenDto tokenDto){ + public Result> searchByName(@RequestBody SearchByNameFormDTO formDTO, @LoginUser TokenDto tokenDto) { ValidatorUtils.validateEntity(formDTO, SearchByNameFormDTO.SearchByNameForm.class); - return new Result>().ok(icResiUserService.searchByName(formDTO,tokenDto)); + return new Result>().ok(icResiUserService.searchByName(formDTO, tokenDto)); + } + + @NotNull + private CustomerFormResultDTO getResiFormItems(String customerId) { + CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); + queryDTO.setFormCode("resi_base_info"); + queryDTO.setCustomerId(customerId); + Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); + if (resultForm == null || !resultForm.success() || resultForm.getData() == null) { + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } + System.out.println(JSON.toJSONString(resultForm.getData())); + return resultForm.getData(); } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java deleted file mode 100644 index 1986418b32..0000000000 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcResiUserRedis.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright 2018 人人开源 https://www.renren.io - *

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

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

- * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.epmet.redis; - -import com.epmet.commons.tools.redis.RedisUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 用户基础信息 - * - * @author generator generator@elink-cn.com - * @since v1.0.0 2021-10-26 - */ -@Component -public class IcResiUserRedis { - @Autowired - private RedisUtils redisUtils; - - public void delete(Object[] ids) { - - } - - public void set(){ - - } - - public String get(String id){ - return null; - } - -} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 0363899e8a..0684bad947 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -20,7 +20,6 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.FormItem; import com.epmet.dto.result.HomeUserResultDTO; @@ -39,65 +38,6 @@ import java.util.Map; */ public interface IcResiUserService extends BaseService { - /** - * 默认分页 - * - * @param params - * @return PageData - * @author generator - * @date 2021-10-26 - */ - PageData page(Map params); - - /** - * 默认查询 - * - * @param params - * @return java.util.List - * @author generator - * @date 2021-10-26 - */ - List list(Map params); - - /** - * 单条查询 - * - * @param id - * @return IcResiUserDTO - * @author generator - * @date 2021-10-26 - */ - IcResiUserDTO get(String id); - - /** - * 默认保存 - * - * @param dto - * @return void - * @author generator - * @date 2021-10-26 - */ - void save(IcResiUserDTO dto); - - /** - * 默认更新 - * - * @param dto - * @return void - * @author generator - * @date 2021-10-26 - */ - void update(IcResiUserDTO dto); - - /** - * 单个删除 - * - * @return void - * @author generator - * @date 2021-10-26 - */ - void delete(DelIcResiUserFormDTO formDTO); - /** * @Author sun * @Description 党建互联平台--保存居民信息 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 796c7ff032..9b76ac18f4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -21,7 +21,6 @@ import com.alibaba.excel.EasyExcelFactory; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; @@ -51,7 +50,6 @@ import com.epmet.feign.EpmetAdminOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; -import com.epmet.redis.IcResiUserRedis; import com.epmet.service.IcResiUserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -79,9 +77,6 @@ import java.util.stream.Collectors; @Slf4j @Service public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService, ResultDataResolver { - private final Logger logger = LogManager.getLogger(IcResiUserServiceImpl.class); - @Autowired - private IcResiUserRedis icResiUserRedis; @Autowired private GovOrgOpenFeignClient govOrgOpenFeignClient; @Autowired @@ -96,21 +91,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl page(Map params) { - IPage page = baseDao.selectPage( - getPage(params, FieldConstant.CREATED_TIME, false), - getWrapper(params) - ); - return getPageData(page, IcResiUserDTO.class); - } - @Override - public List list(Map params) { - List entityList = baseDao.selectList(getWrapper(params)); - - return ConvertUtils.sourceToTarget(entityList, IcResiUserDTO.class); - } private QueryWrapper getWrapper(Map params){ String id = (String)params.get(FieldConstant.ID_HUMP); @@ -121,39 +102,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> subTableRes = operCustomizeOpenFeignClient.queryIcResiSubTables(queryDTO); - if (subTableRes.success() && !CollectionUtils.isEmpty(subTableRes.getData())) { - for (String subTalbeName : subTableRes.getData()) { - baseDao.updateSubTableToDel(subTalbeName, formDTO.getIcResiUserId()); - } - } - } - /** * @Author sun * @Description 党建互联平台--保存居民信息 @@ -1099,7 +1047,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, String customerId, String formCode, String baseTableName, List conditions) { List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions); - System.out.println("======remote:"+baseTableName+" "+JSON.toJSONString(formItemMap)); Map> result = new LinkedHashMap<>(); mapList.stream().filter(Objects::nonNull).forEach(map -> { String resiId = (String) map.getOrDefault(UserConstant.IC_RESI_USER, ""); diff --git a/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java b/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java new file mode 100644 index 0000000000..4e08497a8e --- /dev/null +++ b/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java @@ -0,0 +1,183 @@ +package com.epmet.epmetuser.test; + +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.export.ExcelExportService; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.result.CustomerFormResultDTO; +import com.epmet.dto.result.FormGroupDTO; +import com.epmet.dto.result.FormItem; +import com.epmet.feign.OperCustomizeOpenFeignClient; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.jetbrains.annotations.NotNull; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.RequestParam; + +import java.io.FileOutputStream; +import java.util.*; + +@SpringBootTest +@RunWith(SpringRunner.class) +public class IcResiUserControllerTest { + private static final String BASE_TABLE_NAME = "BASE_TABLE_NAME"; + @Autowired + private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; + + @Test + public void downloadTemplate(@RequestParam String customerId) throws Exception { + CustomerFormResultDTO resultForm = getResiFormItems(customerId); + + XSSFWorkbook workbook = new XSSFWorkbook(); + Map> sheetHeaderMap = buildHeaderByItem(resultForm); + //Workbook workbook = null; + for (Map.Entry> entry : sheetHeaderMap.entrySet()) { + String sheetName = entry.getKey(); + List headers = entry.getValue(); + System.out.println("headers:"+sheetName+JSON.toJSONString(headers)); + ExportParams exportParams = new ExportParams(null,sheetName); + //exportParams.setAutoSize(true); + List> dataSet = new ArrayList<>(); + HashMap map = new HashMap<>(); + map.put("1","2"); + dataSet.add(map); + new ExcelExportService().createSheetForMap(workbook, exportParams, headers, dataSet); + } + + FileOutputStream fos = new FileOutputStream("//Users/liujianjun/Downloads/基础信息表/Dow.tt.xls"); + workbook.write(fos); + fos.close(); + } + + @NotNull + private CustomerFormResultDTO getResiFormItems(String customerId) { + CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); + queryDTO.setFormCode("resi_base_info"); + queryDTO.setCustomerId(customerId); + Result resultForm = operCustomizeOpenFeignClient.getCustomerForm(queryDTO); + if (resultForm == null || !resultForm.success() ||resultForm.getData() == null){ + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } + System.out.println(JSON.toJSONString(resultForm.getData())); + return resultForm.getData(); + } + + @NotNull + private Map> buildHeaderByItem(CustomerFormResultDTO resultForm) { + //form中的itemlist 为一级表头 但是要排除每个item中含有childGroup的 + + List itemList = resultForm.getItemList(); + List groupList = resultForm.getGroupList(); + + Map> everySheetHeaderMap = new LinkedHashMap<>(); + + List firstSheetHeaderList = new ArrayList<>(); + //Map groupNameMap = groupList.stream().collect(Collectors.toMap(FormGroupDTO::getGroupId,FormGroupDTO::getLabel)); + itemList.forEach(item->{ + if (StringUtils.isBlank(item.getColumnName())){ + return; + } + + if (item.getChildGroup() == null){ + ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getColumnName().concat(String.valueOf(item.getColumnNum())),30); + header.setNeedMerge(true); + firstSheetHeaderList.add(header); + return; + } + everySheetHeaderMap.putIfAbsent(resultForm.getFormName(),firstSheetHeaderList); + + //这些是动态的 formGroup + if (item.getChildGroup() != null){ + //baseTableName单独的一个sheet + System.out.println("childGroup:"+item.getLabel()); + if (BASE_TABLE_NAME.equals(item.getTableName())){ + List otherSheetHeaderList = new ArrayList<>(); + //这里是设置除基础信息之外的sheet的表头 + item.getChildGroup().getItemList().forEach(item2->{ + if (!BASE_TABLE_NAME.equals(item2.getTableName())){ + everySheetHeaderMap.putIfAbsent(item.getLabel(),otherSheetHeaderList); + } + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); + + otherSheetHeaderList.add(secondHeader); + if (!"radio".equals(item2.getItemType()) && CollectionUtils.isNotEmpty(item2.getOptions())){ + secondHeader.setNeedMerge(true); + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } + + }); + } + } + }); + groupList.forEach(item->{ + /* if (!"兴趣爱好".equals(item.getLabel()) && !"宗教信仰".equals(item.getLabel())){ + return; + }*/ + if (!BASE_TABLE_NAME.equals(item.getTableName())){ + return; + } + ExcelExportEntity header = new ExcelExportEntity(item.getLabel(),item.getTableName()); + header.setNeedMerge(true); + List secondHeaderList = new ArrayList<>(); + item.getItemList().forEach(item2->{ + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); + secondHeader.setNeedMerge(true); + secondHeaderList.add(secondHeader); + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(item2.getOptions())){ + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel(),child.getValue()+ new Random(1).nextInt(2)); + thirdHeader.setNeedMerge(true); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } + + }); + header.setList(secondHeaderList); + firstSheetHeaderList.add(header); + System.out.println(JSON.toJSONString(firstSheetHeaderList)); + }); + return everySheetHeaderMap; + } + + private void buildHeader(Map> everySheetHeaderMap, FormItem item, ExcelExportEntity header) { + List firstSheetHeaderList = new ArrayList<>(); + List secondHeaderList = new ArrayList<>(); + item.getChildGroup().getItemList().forEach(item2->{ + if (!BASE_TABLE_NAME.equals(item2.getTableName())){ + everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); + } + ExcelExportEntity secondHeader = new ExcelExportEntity(item2.getLabel(),item2.getColumnName().concat(String.valueOf(item2.getColumnNum()))); + secondHeader.setNeedMerge(true); + secondHeaderList.add(secondHeader); + if (CollectionUtils.isNotEmpty(item2.getOptions())){ + List thirdHeaderList = new ArrayList<>(); + item2.getOptions().forEach(child->{ + ExcelExportEntity thirdHeader = new ExcelExportEntity(child.getLabel()); + thirdHeaderList.add(thirdHeader); + }); + secondHeader.setList(thirdHeaderList); + } + + }); + header.setList(secondHeaderList); + firstSheetHeaderList.add(header); + everySheetHeaderMap.putIfAbsent(item.getLabel(),firstSheetHeaderList); + } + +} From 41d249672ae6774397b89431b154c5ae98be8b62 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 4 Nov 2021 17:04:15 +0800 Subject: [PATCH 121/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E3=80=81=E5=8F=98=E6=9B=B4=E6=8E=A8=E9=80=81?= =?UTF-8?q?mq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/ConsomerGroupConstants.java | 5 + .../rocketmq/constants/TopicConstants.java | 5 + .../rocketmq/messages/IcWarnStatsMQMsg.java | 20 ++++ .../com/epmet/constant/SystemMessageType.java | 10 ++ .../impl/SystemMessageServiceImpl.java | 4 + epmet-user/epmet-user-server/pom.xml | 12 ++ .../epmet/mq/RocketMQWarnStatsRegister.java | 31 ++++++ .../mq/listener/ICWarnStatsEventListener.java | 104 ++++++++++++++++++ .../listener/InitCustomerRolesListener.java | 39 ------- .../service/impl/IcResiUserServiceImpl.java | 29 ++++- .../src/main/resources/bootstrap.yml | 4 +- 11 files changed, 217 insertions(+), 46 deletions(-) create mode 100644 epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/mq/RocketMQWarnStatsRegister.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java delete mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/InitCustomerRolesListener.java diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java index fb5ae07412..93894c0bdb 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java @@ -65,4 +65,9 @@ public interface ConsomerGroupConstants { */ String OPEN_DATA_PROJECT_CHANGE_EVENT_LISTENER_GROUP = "open_data_project_change_event_listener_group"; + /** + * 开放的人员信息变更预警统计 + */ + String IC_WARN_STATS_EVENT_LISTENER_GROUP = "ic_warn_stats_event_listener_group"; + } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java index 3f0c3066ec..13217da550 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java @@ -48,4 +48,9 @@ public interface TopicConstants { * 项目 */ String PROJECT = "project"; + + /** + * 项目 + */ + String IC_RESI_USER = "ic_resi_user"; } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java new file mode 100644 index 0000000000..b78863ef4c --- /dev/null +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java @@ -0,0 +1,20 @@ +package com.epmet.commons.rocketmq.messages; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 居民信息新增、修改推送MQ + * @author sun + */ +@Data +public class IcWarnStatsMQMsg implements Serializable { + + //客户Id + private String customerId; + //居民ID + private String icResiUser; + + +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java index 84580a3b4a..4536d6c330 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java @@ -85,4 +85,14 @@ public interface SystemMessageType { */ String PROJECT_EDIT = "project_edit"; + /** + * 居民信息添加 + */ + String IC_RESI_USER_ADD = "ic_resi_user_add"; + + /** + * 居民信息修改 + */ + String IC_RESI_USER_EDIT = "ic_resi_user_edit"; + } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java index 61373708df..ee4990405f 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java @@ -187,6 +187,10 @@ public class SystemMessageServiceImpl implements SystemMessageService { case SystemMessageType.PROJECT_EDIT: topic = TopicConstants.PROJECT; break; + case SystemMessageType.IC_RESI_USER_ADD: + case SystemMessageType.IC_RESI_USER_EDIT: + topic = TopicConstants.IC_RESI_USER; + break; } return topic; } diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index 1b0eafe16d..790d22ecf2 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -222,6 +222,9 @@ SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd + + true + 192.168.1.140:9876;192.168.1.141:9876 @@ -264,6 +267,9 @@ SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd https://epmet-dev.elinkservice.cn/api/epmetscan/api + + false + 192.168.1.140:9876;192.168.1.141:9876 @@ -305,6 +311,9 @@ SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd + + true + 192.168.1.140:9876;192.168.1.141:9876 @@ -345,6 +354,9 @@ SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1 + + true + 192.168.1.140:9876;192.168.1.141:9876 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/RocketMQWarnStatsRegister.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/RocketMQWarnStatsRegister.java new file mode 100644 index 0000000000..2e7068ae04 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/RocketMQWarnStatsRegister.java @@ -0,0 +1,31 @@ +package com.epmet.mq; + +import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants; +import com.epmet.commons.rocketmq.constants.TopicConstants; +import com.epmet.commons.rocketmq.register.MQAbstractRegister; +import com.epmet.commons.rocketmq.register.MQConsumerProperties; +import com.epmet.mq.listener.ICWarnStatsEventListener; +import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; +import org.springframework.stereotype.Component; + +/** + * @Description 如果rocketmq.enable=true,这里必须实现,且 实例化 + * @author wxz + * @date 2021.07.14 17:13:41 +*/ +@Component +public class RocketMQWarnStatsRegister extends MQAbstractRegister { + + @Override + public void registerAllListeners(String env, MQConsumerProperties consumerProperties) { + // 客户初始化监听器注册 + register(consumerProperties, + ConsomerGroupConstants.IC_WARN_STATS_EVENT_LISTENER_GROUP, + MessageModel.CLUSTERING, + TopicConstants.IC_RESI_USER, + "*", + new ICWarnStatsEventListener()); + + // ...其他监听器类似 + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java new file mode 100644 index 0000000000..3a16ec247e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java @@ -0,0 +1,104 @@ +package com.epmet.mq.listener; + +import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; +import com.epmet.commons.rocketmq.messages.IcWarnStatsMQMsg; +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.commons.tools.utils.SpringContextUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.common.message.MessageExt; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @Description 负能平台-客户居民信息变动监听器 + * @author wxz + * @date 2021.10.13 15:21:48 +*/ +public class ICWarnStatsEventListener implements MessageListenerConcurrently { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + private RedisUtils redisUtils; + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + + if (redisUtils == null) { + redisUtils = SpringContextUtils.getBean(RedisUtils.class); + } + + try { + msgs.forEach(msg -> consumeMessage(msg)); + } catch (Exception e) { + logger.error(ExceptionUtils.getErrorStackTrace(e)); + return ConsumeConcurrentlyStatus.RECONSUME_LATER; + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + + private void consumeMessage(MessageExt messageExt) { + // msg即为消息体 + // tags为SystemMessageType.java中的项,为具体的操作,此处拿到tags,判断是创建还是变更,来做响应的后续操作即可 + String msg = new String(messageExt.getBody()); + String topic = messageExt.getTopic(); + String tags = messageExt.getTags(); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); + + logger.info("【开放数据事件监听器】-居民信息变动-收到消息内容:{},操作:{}", msg, tags); + IcWarnStatsMQMsg obj = JSON.parseObject(msg, IcWarnStatsMQMsg.class); + + DistributedLock distributedLock = null; + RLock lock = null; + try { + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + lock = distributedLock.getLock(String.format("lock:ic_warn_stats:%s", obj.getCustomerId()), + 30L, 30L, TimeUnit.SECONDS); + System.out.println("嘻嘻哈哈哈乐乐呵呵-----------"); + //待执行方法 + //SpringContextUtils.getBean(BaseGridInfoService.class).getAgencyBaseInfo(obj); + } catch (RenException e) { + // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 + logger.error("【开放数据事件监听器】-客户居民信息变动MQ失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + } catch (Exception e) { + // 不是我们自己抛出的异常,可以让MQ重试 + logger.error("【开放数据事件监听器】-客户居民信息变动MQ失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + throw e; + } finally { + distributedLock.unLock(lock); + } + + if (StringUtils.isNotBlank(pendingMsgLabel)) { + try { + removePendingMqMsgCache(pendingMsgLabel); + } catch (Exception e) { + logger.error("【开放数据事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } + } + + /** + * @description + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + //logger.info("【开放数据事件监听器】删除mq阻塞消息缓存成功,blockedMsgLabel:{}", pendingMsgLabel); + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/InitCustomerRolesListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/InitCustomerRolesListener.java deleted file mode 100644 index a50da7561e..0000000000 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/InitCustomerRolesListener.java +++ /dev/null @@ -1,39 +0,0 @@ -//package com.epmet.mq.listener; -// -//import com.alibaba.fastjson.JSON; -//import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants; -//import com.epmet.commons.rocketmq.constants.TopicConstants; -//import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg; -//import com.epmet.service.GovStaffRoleService; -//import org.apache.rocketmq.common.message.MessageExt; -//import org.apache.rocketmq.spring.annotation.MessageModel; -//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; -//import org.apache.rocketmq.spring.core.RocketMQListener; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Component; -// -///** -// * 监听初始化客户动作,为客户初始化角色列表 -// */ -//@RocketMQMessageListener(topic = TopicConstants.INIT_CUSTOMER, -// consumerGroup = ConsomerGroupConstants.INIT_CUSTOMER_ROLES_GROUP, -// messageModel = MessageModel.CLUSTERING, -// selectorExpression = "*") -//@Component -//public class InitCustomerRolesListener implements RocketMQListener { -// -// private Logger logger = LoggerFactory.getLogger(getClass()); -// -// @Autowired -// private GovStaffRoleService govStaffRoleService; -// -// @Override -// public void onMessage(MessageExt messageExt) { -// String msg = new String(messageExt.getBody()); -// logger.info("初始化客户-初始化角色列表-收到消息内容:{}", msg); -// InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); -// govStaffRoleService.initGovStaffRolesForCustomer(msgObj.getCustomerId()); -// } -//} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 9b76ac18f4..991fac2c6d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -22,6 +22,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.rocketmq.messages.IcWarnStatsMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; @@ -39,6 +40,7 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.*; @@ -46,10 +48,7 @@ import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; import com.epmet.excel.handler.DynamicEasyExcelListener; -import com.epmet.feign.EpmetAdminOpenFeignClient; -import com.epmet.feign.EpmetUserOpenFeignClient; -import com.epmet.feign.GovOrgOpenFeignClient; -import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.feign.*; import com.epmet.service.IcResiUserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -57,8 +56,6 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -90,6 +87,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Thu, 4 Nov 2021 17:42:27 +0800 Subject: [PATCH 122/253] =?UTF-8?q?agg=E5=8E=9F=E6=8E=A5=E5=8F=A3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmetuser/form/IcResiDetailFormDTO.java | 26 -- .../epmetuser/form/IcResiUserPageFormDTO.java | 38 --- .../epmetuser/form/ResiUserQueryValueDTO.java | 20 -- .../result/IcResiUserPageResultDTO.java | 173 ------------ .../dto/govorg/result/HouseInfoDTO.java | 61 ----- .../controller/IcResiUserController.java | 72 ----- .../dao/epmetuser/IcResiUserDao.java | 45 ---- .../dao/govorg/CustomerAgencyDao.java | 1 - .../dao/opercustomize/CustomerFootBarDao.java | 5 - .../service/epmetuser/IcResiUserService.java | 32 --- .../epmetuser/impl/IcResiUserServiceImpl.java | 255 ------------------ .../service/govorg/GovOrgService.java | 2 - .../govorg/impl/GovOrgServiceImpl.java | 7 - .../opercustomize/CustomerFootBarService.java | 9 - .../impl/CustomerFootBarServiceImpl.java | 15 -- .../mapper/epmetuser/IcResiUserDao.xml | 129 --------- .../mapper/govorg/CustomerAgencyDao.xml | 22 -- .../opercustomize/CustomerFootBarDao.xml | 50 ---- 18 files changed, 962 deletions(-) delete mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java delete mode 100644 epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java deleted file mode 100644 index e7952a1ef4..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiDetailFormDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.epmet.dataaggre.dto.epmetuser.form; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @Description 查看详情,回显表单 - * @Author yinzuomei - * @Date 2021/10/27 10:22 下午 - */ -@Data -public class IcResiDetailFormDTO implements Serializable { - public interface AddUserInternalGroup { - } - @NotBlank(message = "icResiUserId不能为空",groups = AddUserInternalGroup.class) - private String icResiUserId; - - @NotBlank(message = "formCode不能为空", groups = AddUserInternalGroup.class) - private String formCode; - - @NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class) - private String customerId; -} - diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java deleted file mode 100644 index 04dc8f0943..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/IcResiUserPageFormDTO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.epmet.dataaggre.dto.epmetuser.form; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.util.List; - -/** - * @Description 居民信息,分页查询入参 - * @Author yinzuomei - * @Date 2021/10/27 2:06 下午 - */ -@Data -public class IcResiUserPageFormDTO implements Serializable { - public interface AddUserInternalGroup { - } - - @NotNull(message = "pageNo不能为空", groups = AddUserInternalGroup.class) - private Integer pageNo; - - @NotNull(message = "pageSize不能为空", groups = AddUserInternalGroup.class) - private Integer pageSize; - - @NotBlank(message = "formCode不能为空", groups = AddUserInternalGroup.class) - private String formCode; - - @NotBlank(message = "customerId不能为空", groups = AddUserInternalGroup.class) - private String customerId; - - /** - * 表对应的字段及值 - */ - private List conditions; - private Boolean pageFlag; -} - diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java deleted file mode 100644 index 7e11156ba3..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/ResiUserQueryValueDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.epmet.dataaggre.dto.epmetuser.form; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @Description TODO - * @Author yinzuomei - * @Date 2021/10/27 6:02 下午 - */ -@Data -public class ResiUserQueryValueDTO implements Serializable { - private String queryType; - private List columnValue; - private String columnName; - private String tableName; -} - diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java deleted file mode 100644 index e737bcec54..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/IcResiUserPageResultDTO.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.epmet.dataaggre.dto.epmetuser.result; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Description 居民信息分页查询表单返参 - * @Author yinzuomei - * @Date 2021/10/27 2:07 下午 - */ -@Data -public class IcResiUserPageResultDTO implements Serializable { - private String icResiUserId; - private String gridId; - private String gridName; - /** - * 所属小区ID - */ - private String villageId; - private String vallageName; - - - /** - * 所属楼宇Id - */ - private String buildId; - private String buildName; - - /** - * 单元id - */ - private String unitId; - private String unitName; - - /** - * 所属家庭Id - */ - private String homeId; - private String homeName; - - /** - * 姓名 - */ - private String name; - - /** - * 手机号 - */ - private String mobile; - - /** - * 性别 - */ - private String gender; - - /** - * 身份证号 - */ - private String idCard; - - /** - * 出生日期 - */ - private String birthday; - - /** - * 备注 - */ - private String remarks; - - /** - * 是否党员 - */ - private Boolean isParty; - - /** - * 是否低保户 - */ - private Boolean isDbh; - - /** - * 是否保障房 - */ - private Boolean isEnsureHouse; - - /** - * 是否失业 - */ - private Boolean isUnemployed; - - /** - * 是否育龄妇女 - */ - private Boolean isYlfn; - - /** - * 是否退役军人 - */ - private Boolean isVeterans; - - /** - * 是否统战人员 - */ - private Boolean isUnitedFront; - - /** - * 是否信访人员 - */ - private Boolean isXfry; - - /** - * 是否志愿者 - */ - private Boolean isVolunteer; - - /** - * 是否老年人 - */ - private Boolean isOldPeople; - - /** - * 是否空巢 - */ - private Boolean isKc; - - /** - * 是否失独 - */ - private Boolean isSd; - - /** - * 是否失能 - */ - private Boolean isSn; - - /** - * 是否失智 - */ - private Boolean isSz; - - /** - * 是否残疾 - */ - private Boolean isCj; - - /** - * 是否大病 - */ - private Boolean isDb; - - /** - * 是否慢病 - */ - private Boolean isMb; - - /** - * 是否特殊人群 - */ - private Boolean isSpecial; - - - // 以下属性都需要单独处理,不是直接取数据库的字段 - private String demandCategoryIds; - - private String demandName; - - /** - * 房屋类型,1楼房,2平房,3别墅 - */ - private String houseType; -} - diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java deleted file mode 100644 index fc98843047..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/govorg/result/HouseInfoDTO.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.epmet.dataaggre.dto.govorg.result; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Description TODO - * @Author yinzuomei - * @Date 2021/10/28 2:05 下午 - */ -@Data -public class HouseInfoDTO implements Serializable { - private static final long serialVersionUID = -5204197079709062825L; - /** - * 所属家庭Id - */ - private String homeId; - - - /** - * 小区id - */ - private String neighborHoodId; - /** - * 小区名称 - */ - private String neighborHoodName; - - - /** - * 所属楼栋id - */ - private String buildingId; - /** - * 楼栋名称 - */ - private String buildingName; - - - /** - * 所属单元id - */ - private String buildingUnitId; - /** - * 单元名 - */ - private String unitName; - - - /** - * 门牌号 - */ - private String doorName; - - /** - * 房屋类型,1楼房,2平房,3别墅 - */ - private String houseType; -} - diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java deleted file mode 100644 index 4058ff5293..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/IcResiUserController.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.epmet.dataaggre.controller; - -import com.epmet.commons.tools.annotation.LoginUser; -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.ValidatorUtils; -import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; -import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; -import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; -import com.epmet.dataaggre.service.epmetuser.IcResiUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @Description TODO - * @Author yinzuomei - * @Date 2021/10/27 2:03 下午 - */ -@RestController -@RequestMapping("icresiuser") -public class IcResiUserController { - - @Autowired - private IcResiUserService icResiUserService; - - - /** - * 分页查询居民信息列表 - * - * @param tokenDto - * @param pageFormDTO - * @return com.epmet.commons.tools.utils.Result> - * @author yinzuomei - * @date 2021/10/28 10:29 上午 - */ - //@PostMapping("listresi1") - public Result> queryListResi(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ - //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); - pageFormDTO.setCustomerId(tokenDto.getCustomerId()); - ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); - return new Result>().ok(icResiUserService.pageResi(pageFormDTO)); - } - - //@PostMapping("listresi") - public Result>> queryListResi1(@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO){ - //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); - pageFormDTO.setCustomerId(tokenDto.getCustomerId()); - ValidatorUtils.validateEntity(pageFormDTO,IcResiUserPageFormDTO.AddUserInternalGroup.class); - return new Result>>().ok(icResiUserService.pageResiMap(pageFormDTO)); - } - /** - * 编辑页面,显示居民信息详情 - * - * @param pageFormDTO - * @return com.epmet.commons.tools.utils.Result - * @author yinzuomei - * @date 2021/10/28 10:29 上午 - */ - //@PostMapping("detail") - public Result queryIcResiDetail(@LoginUser TokenDto tokenDto,@RequestBody IcResiDetailFormDTO pageFormDTO){ - //pageFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); - pageFormDTO.setCustomerId(tokenDto.getCustomerId()); - ValidatorUtils.validateEntity(pageFormDTO,IcResiDetailFormDTO.AddUserInternalGroup.class); - return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); - } -} - diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java deleted file mode 100644 index fbfc9564d5..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcResiUserDao.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.epmet.dataaggre.dao.epmetuser; - -import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; -import com.epmet.dataaggre.dto.epmetuser.form.ResiUserQueryValueDTO; -import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface IcResiUserDao { - List selectListResi(@Param("customerId") String customerId, - @Param("formCode") String formCode, - @Param("conditions") List conditions, - @Param("resultColumns") List resultColumns, - @Param("subTables") List subTables); - List> selectListResiMap(@Param("customerId") String customerId, - @Param("formCode") String formCode, - @Param("conditions") List conditions, - @Param("resultColumns") List resultColumns, - @Param("subTables") List subTables); - /** - * 查询主表 - * - * @param icResiUserId - * @return java.util.List> - * @author yinzuomei - * @date 2021/10/28 11:20 上午 - */ - List> selectById(String icResiUserId); - - /** - * 根据ic_resi_user.id去查询各个子表记录,动态传入表名 - * - * @param icResiUserId - * @param tableName - * @return java.util.List> - * @author yinzuomei - * @date 2021/10/28 11:19 上午 - */ - List> selectSubTableRecords(@Param("icResiUserId") String icResiUserId,@Param("tableName") String tableName); - -} diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java index 33f676721b..3ecfd18a2d 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerAgencyDao.java @@ -100,5 +100,4 @@ public interface CustomerAgencyDao extends BaseDao { */ List getOrgList(@Param("staffId") String staffId); - List queryHouseInfo(@Param("houseIdList") Set houseIdList); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java index aaba329a6f..4d5ab737b5 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/opercustomize/CustomerFootBarDao.java @@ -59,9 +59,4 @@ public interface CustomerFootBarDao extends BaseDao { */ CustomerFootBarEntity selectDefaultIcon(@Param("customerId") String customerId, @Param("appType")String appType, @Param("barKey")String barKey); - List queryConditions(@Param("customerId") String customerId, @Param("formCode")String formCode); - - List querySubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); - - Set queryIcResiSubTables(@Param("customerId") String customerId, @Param("formCode")String formCode); } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java deleted file mode 100644 index ab112bfa8a..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/IcResiUserService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.epmet.dataaggre.service.epmetuser; - -import com.epmet.commons.tools.page.PageData; -import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; -import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; -import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; - -import java.util.Map; - -public interface IcResiUserService { - /** - * 分页查询居民信息列表 - * - * @param pageFormDTO - * @return com.epmet.commons.tools.page.PageData - * @author yinzuomei - * @date 2021/10/28 10:30 上午 - */ - @Deprecated - PageData pageResi(IcResiUserPageFormDTO pageFormDTO); - - PageData> pageResiMap(IcResiUserPageFormDTO formDTO); - /** - * 编辑页面,显示居民信息详情 - * - * @param pageFormDTO - * @return java.util.Map - * @author yinzuomei - * @date 2021/10/28 10:29 上午 - */ - Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); -} diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java deleted file mode 100644 index a3dbfc59b3..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/IcResiUserServiceImpl.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.epmet.dataaggre.service.epmetuser.impl; - -import com.alibaba.fastjson.JSON; -import com.epmet.commons.dynamic.datasource.annotation.DataSource; -import com.epmet.commons.tools.constant.NumConstant; -import com.epmet.commons.tools.constant.StrConstant; -import com.epmet.commons.tools.enums.GenderEnum; -import com.epmet.commons.tools.enums.HouseTypeEnum; -import com.epmet.commons.tools.page.PageData; -import com.epmet.dataaggre.constant.DataSourceConstant; -import com.epmet.dataaggre.constant.OrgConstant; -import com.epmet.dataaggre.dao.epmetuser.IcResiUserDao; -import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; -import com.epmet.dataaggre.dto.epmetuser.form.IcResiDetailFormDTO; -import com.epmet.dataaggre.dto.epmetuser.form.IcResiUserPageFormDTO; -import com.epmet.dataaggre.dto.epmetuser.result.IcResiUserPageResultDTO; -import com.epmet.dataaggre.dto.govorg.result.GridsInfoListResultDTO; -import com.epmet.dataaggre.dto.govorg.result.HouseInfoDTO; -import com.epmet.dataaggre.service.epmetuser.IcResiUserService; -import com.epmet.dataaggre.service.govorg.GovOrgService; -import com.epmet.dataaggre.service.opercustomize.CustomerFootBarService; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * @Description TODO - * @Author yinzuomei - * @Date 2021/10/27 2:04 下午 - */ -@Service -@DataSource(DataSourceConstant.EPMET_USER) -@Slf4j -public class IcResiUserServiceImpl implements IcResiUserService { - @Autowired - private IcResiUserDao icResiUserDao; - @Autowired - private CustomerFootBarService customerFootBarService; - @Autowired - private GovOrgService govOrgService; - - - /** - * 分页查询居民信息列表 - * - * @param formDTO - * @return com.epmet.commons.tools.page.PageData - * @author yinzuomei - * @date 2021/10/28 10:30 上午 - */ - @Override - public PageData pageResi(IcResiUserPageFormDTO formDTO) { - // 查询列表展示项,如果没有,直接返回 - List resultColumns = customerFootBarService.queryConditions(formDTO.getCustomerId(), formDTO.getFormCode()); - if (CollectionUtils.isEmpty(resultColumns)) { - log.warn("没有配置列表展示列"); - return new PageData(new ArrayList(), NumConstant.ZERO); - } - log.warn("列表展示项:" + JSON.toJSONString(resultColumns)); - // 查询列表展示项需要用到哪些子表 - // 拼接好的left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') - List subTables = customerFootBarService.querySubTables(formDTO.getCustomerId(), formDTO.getFormCode()); - log.warn("子表:" + JSON.toJSONString(subTables)); - /* Set subTableList=resultColumns.stream().filter(item->!item.getTableName().equals("ic_resi_user") - && StringUtils.isNotBlank(item.getLink())) - .map(IcFormResColumnDTO :: getTableName).collect(Collectors.toSet()); - List subTables=new ArrayList<>(); - subTableList.forEach(tableName->{ - //'left join ',temp.TABLE_NAME, ' on ( ic_resi_user.ID=',temp.TABLE_NAME,'.IC_RESI_USER and ',temp.TABLE_NAME,'.del_flag="0" )' - String joinSql=String.format("% join %s on ( ic_resi_user.ID=%s.IC_RESI_USER and %s.del_flag=\"0\" "); - subTables.add(joinSql); - });*/ - PageInfo pageInfo = PageHelper.startPage(formDTO.getPageNo(), - formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResi(formDTO.getCustomerId(), - formDTO.getFormCode(), - formDTO.getConditions(), - resultColumns, - subTables)); - List list = pageInfo.getList(); - //查询网格名称 - List gridIds = list.stream().map(IcResiUserPageResultDTO::getGridId).collect(Collectors.toList()); - log.warn("gridIds:" + JSON.toJSONString(gridIds)); - - List gridInfoList = govOrgService.gridListByIds(gridIds); - log.warn(JSON.toJSONString(gridInfoList)); - - Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(GridsInfoListResultDTO::getGridId, Function.identity())); - - //查询房子名称 - Set houseIds = list.stream().map(IcResiUserPageResultDTO::getHomeId).collect(Collectors.toSet()); - List houseInfoDTOList = govOrgService.queryHouseInfo(houseIds); - Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); - for (IcResiUserPageResultDTO resultDTO : list) { - if (null != gridInfoMap && gridInfoMap.containsKey(resultDTO.getGridId())) { - resultDTO.setGridName(gridInfoMap.get(resultDTO.getGridId()).getGridName()); - } - if (null != houseInfoMap && houseInfoMap.containsKey(resultDTO.getHomeId())) { - resultDTO.setBuildName(houseInfoMap.get(resultDTO.getHomeId()).getBuildingName()); - resultDTO.setVallageName(houseInfoMap.get(resultDTO.getHomeId()).getNeighborHoodName()); - resultDTO.setUnitName(houseInfoMap.get(resultDTO.getHomeId()).getUnitName()); - resultDTO.setHomeName(houseInfoMap.get(resultDTO.getHomeId()).getDoorName()); - resultDTO.setHouseType(houseInfoMap.get(resultDTO.getHomeId()).getHouseType()); - } - } - pageInfo.setList(list); - return new PageData<>(pageInfo.getList(), pageInfo.getTotal()); - } - - - public PageData> pageResiMap(IcResiUserPageFormDTO formDTO) { - // 查询列表展示项,如果没有,直接返回 - List resultColumns = customerFootBarService.queryConditions(formDTO.getCustomerId(), formDTO.getFormCode()); - if (CollectionUtils.isEmpty(resultColumns)) { - log.warn("没有配置列表展示列"); - return new PageData(new ArrayList(), NumConstant.ZERO); - } - // 查询列表展示项需要用到哪些子表 - // 拼接好的left join table_name on (ic_resi_user.ID=table_name.IC_RESI_USER AND table_name.del_flag='0') - List subTables = customerFootBarService.querySubTables(formDTO.getCustomerId(), formDTO.getFormCode()); - PageInfo> pageInfo=new PageInfo<>(); - if (null == formDTO.getPageFlag()||formDTO.getPageFlag()) { - //分页 - pageInfo= PageHelper.startPage(formDTO.getPageNo(), - formDTO.getPageSize()).doSelectPageInfo(() -> icResiUserDao.selectListResiMap(formDTO.getCustomerId(), - formDTO.getFormCode(), - formDTO.getConditions(), - resultColumns, - subTables)); - }else{ - List> list=icResiUserDao.selectListResiMap(formDTO.getCustomerId(), - formDTO.getFormCode(), - formDTO.getConditions(), - resultColumns, - subTables); - pageInfo.setTotal(CollectionUtils.isEmpty(list)?NumConstant.ZERO:list.size()); - pageInfo.setList(list); - } - - List> list = pageInfo.getList(); - //查询网格名称 - List gridIds = new ArrayList<>(); - Set houseIds = new HashSet<>(); - for (Map map : list) { - log.warn(JSON.toJSONString(map)); - if (map.containsKey(OrgConstant.GRID_ID) && null != map.get(OrgConstant.GRID_ID) && StringUtils.isNotBlank(map.get(OrgConstant.GRID_ID).toString())) { - gridIds.add(map.get(OrgConstant.GRID_ID).toString()); - } - if (map.containsKey("HOME_ID") && null != map.get("HOME_ID") && StringUtils.isNotBlank(map.get("HOME_ID").toString())) { - houseIds.add(map.get("HOME_ID").toString()); - } - } - - List gridInfoList = govOrgService.gridListByIds(gridIds); - - Map gridInfoMap = gridInfoList.stream().collect(Collectors.toMap(GridsInfoListResultDTO::getGridId, Function.identity())); - - //查询房子名称 - List houseInfoDTOList = govOrgService.queryHouseInfo(houseIds); - Map houseInfoMap = houseInfoDTOList.stream().collect(Collectors.toMap(HouseInfoDTO::getHomeId, Function.identity())); - for (Map resultMap : list) { - String gridIdValue = null != resultMap.get(OrgConstant.GRID_ID) ? resultMap.get(OrgConstant.GRID_ID).toString() : StrConstant.EPMETY_STR; - resultMap.put("GRID_ID_VALUE", gridIdValue); - if (null != gridInfoMap && gridInfoMap.containsKey(gridIdValue) && null != gridInfoMap.get(gridIdValue)) { - //GRID_NAME - resultMap.put(OrgConstant.GRID_ID, gridInfoMap.get(gridIdValue).getGridName()); - } - - String homeId = null != resultMap.get("HOME_ID") ? resultMap.get("HOME_ID").toString() : StrConstant.EPMETY_STR; - resultMap.put("HOME_ID_VALUE", homeId); - if (null != houseInfoMap && houseInfoMap.containsKey(homeId) && null != houseInfoMap.get(homeId)) { - HouseInfoDTO houseInfoDTO = houseInfoMap.get(homeId); - String buildName = StringUtils.isNotBlank(houseInfoDTO.getBuildingName()) ? houseInfoDTO.getBuildingName() : StrConstant.EPMETY_STR; - resultMap.put("BUILD_NAME", buildName); - - String neighBorName = StringUtils.isNotBlank(houseInfoDTO.getNeighborHoodName()) ? houseInfoDTO.getNeighborHoodName() : StrConstant.EPMETY_STR; - resultMap.put("VILLAGE_NAME", neighBorName); - - String unitName = StringUtils.isNotBlank(houseInfoDTO.getUnitName()) ? houseInfoDTO.getUnitName() : StrConstant.EPMETY_STR; - resultMap.put("UNIT_NAME", unitName); - - String doorName = StringUtils.isNotBlank(houseInfoDTO.getDoorName()) ? houseInfoDTO.getDoorName() : StrConstant.EPMETY_STR; - resultMap.put("DOOR_NAME", doorName); - - String houseType = StringUtils.isNotBlank(houseInfoDTO.getHouseType()) ? houseInfoDTO.getHouseType() : StrConstant.EPMETY_STR; - //房屋类型,1楼房,2平房,3别墅 - resultMap.put(OrgConstant.HOUSE_TYPE_KEY, ""); - if (HouseTypeEnum.LOUFANG.getCode().equals(houseType)) { - resultMap.put(OrgConstant.HOUSE_TYPE_KEY, HouseTypeEnum.LOUFANG.getName()); - } else if (HouseTypeEnum.PINGFANG.getCode().equals(houseType)) { - resultMap.put(OrgConstant.HOUSE_TYPE_KEY, HouseTypeEnum.PINGFANG.getName()); - } else if (HouseTypeEnum.BIESHU.getCode().equals(houseType)) { - resultMap.put(OrgConstant.HOUSE_TYPE_KEY, HouseTypeEnum.BIESHU.getName()); - } - - resultMap.put("HOME_ID", neighBorName.concat(buildName).concat(unitName).concat(doorName)); - } - - if (resultMap.containsKey(OrgConstant.GENDER)) { - String genderValue = null != resultMap.get(OrgConstant.GENDER) ? resultMap.get(OrgConstant.GENDER).toString() : StrConstant.EPMETY_STR; - if (GenderEnum.MAN.getCode().equals(genderValue)) { - resultMap.put(OrgConstant.GENDER, GenderEnum.MAN.getName()); - } else if (GenderEnum.WOMAN.getCode().equals(genderValue)) { - resultMap.put(OrgConstant.GENDER, GenderEnum.WOMAN.getName()); - } else if (GenderEnum.UN_KNOWN.getCode().equals(genderValue)) { - resultMap.put(OrgConstant.GENDER, GenderEnum.UN_KNOWN.getName()); - } - } - } - pageInfo.setList(list); - return new PageData<>(pageInfo.getList(), pageInfo.getTotal()); - } - - /** - * 编辑页面,显示居民信息详情 - * - * @param pageFormDTO - * @return java.util.Map - * @author yinzuomei - * @date 2021/10/28 10:29 上午 - */ - @Override - public Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO) { - Map resultMap = new HashMap(); - // 先查询主表,主表没有记录,直接返回空 - List> icResiUserMapList = icResiUserDao.selectById(pageFormDTO.getIcResiUserId()); - if (CollectionUtils.isEmpty(icResiUserMapList)) { - return new HashMap(); - } - resultMap.put("ic_resi_user", icResiUserMapList); - - //循环查询每个子表的记录 - Set subTableList = customerFootBarService.queryIcResiSubTables(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode()); - for (String subTalbeName : subTableList) { - List> list = icResiUserDao.selectSubTableRecords(pageFormDTO.getIcResiUserId(), subTalbeName); - if (!CollectionUtils.isEmpty(list)) { - resultMap.put(subTalbeName, list); - } - //else{ - // resultMap.put(subTalbeName,new ArrayList<>()); - //} - } - return resultMap; - } - - -} - diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java index f475d7d38f..0ed6454168 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/GovOrgService.java @@ -12,7 +12,6 @@ import com.epmet.dataaggre.dto.govorg.result.*; import com.epmet.dataaggre.dto.resigroup.result.OrgInfoCommonDTO; import java.util.List; -import java.util.Set; /** * @Author zxc @@ -156,5 +155,4 @@ public interface GovOrgService { */ List getStaffOrgList(String staffId); - List queryHouseInfo(Set houseIdList); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java index bfa7f9f9d1..17b0fcfe8c 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java @@ -532,12 +532,5 @@ public class GovOrgServiceImpl implements GovOrgService { return customerAgencyDao.getOrgList(staffId); } - @Override - public List queryHouseInfo(Set houseIdList) { - if(CollectionUtils.isEmpty(houseIdList)){ - return new ArrayList<>(); - } - return customerAgencyDao.queryHouseInfo(houseIdList); - } } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java index a79000d974..810122f74c 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/CustomerFootBarService.java @@ -20,12 +20,8 @@ package com.epmet.dataaggre.service.opercustomize; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.dataaggre.dto.app.form.AppFootBarFormDTO; import com.epmet.dataaggre.dto.app.result.AppFootBarResultDTO; -import com.epmet.dataaggre.dto.epmetuser.IcFormResColumnDTO; import com.epmet.dataaggre.entity.opercustomize.CustomerFootBarEntity; -import java.util.List; -import java.util.Set; - /** * APP底部菜单栏信息 * @@ -44,9 +40,4 @@ public interface CustomerFootBarService extends BaseService queryConditions(String customerId, String formCode); - - List querySubTables(String customerId, String formCode); - - Set queryIcResiSubTables(String customerId, String formCode); } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java index 0aefa94d84..d301e23b16 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/opercustomize/impl/CustomerFootBarServiceImpl.java @@ -114,19 +114,4 @@ public class CustomerFootBarServiceImpl extends BaseServiceImpl queryConditions(String customerId, String formCode) { - return baseDao.queryConditions(customerId,formCode); - } - - @Override - public List querySubTables(String customerId, String formCode) { - return baseDao.querySubTables(customerId,formCode); - } - - @Override - public Set queryIcResiSubTables(String customerId, String formCode) { - return baseDao.queryIcResiSubTables(customerId,formCode); - } - } \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml deleted file mode 100644 index df1b389d0a..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/IcResiUserDao.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml index f7466eb235..7a0760d0a3 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerAgencyDao.xml @@ -286,26 +286,4 @@ AND USER_ID = #{staffId} - diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml index 11a8d52f7c..51340127fc 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/opercustomize/CustomerFootBarDao.xml @@ -39,54 +39,4 @@ AND C.DISPLAY='1' - - - - - \ No newline at end of file From 4eb0f5c0cb1faca63580eead054e103026e42dac Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 4 Nov 2021 17:51:26 +0800 Subject: [PATCH 123/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90excel=E8=A1=A8=E6=A0=BC=E7=9A=84=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=20=E4=B8=8B=E4=B8=80=E6=AD=A5=EF=BC=9A?= =?UTF-8?q?=E5=81=A5=E5=A3=AE=E6=80=A7=E5=88=A4=E6=96=AD=EF=BC=8C=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E8=AE=B0=E5=BD=95=EF=BC=8Cexcel=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/exception/EpmetErrorCode.java | 2 + .../controller/IcResiUserController.java | 13 +- .../com/epmet/service/IcResiUserService.java | 2 +- .../service/impl/IcResiUserServiceImpl.java | 258 +++++++++++++----- 4 files changed, 189 insertions(+), 86 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index 92c190c7ec..a38091fa60 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -78,6 +78,8 @@ public enum EpmetErrorCode { HAVE_GUIDE_CANNOT_DEL(8211,"当前分类已经存在办事指南,不允许删除"), GUIDE_CATEGORY_NAME_EXITS(8212,"分类已存在"), CUSTOMER_FORM_NOT_EXITS(8213,"客户未配置表单"), + RESI_NOT_FOUND(8214,"居民信息找不到"), + REQUIRE_PERMISSION(8301, "您没有足够的操作权限"), THIRD_PLAT_REQUEST_ERROR(8302, "请求第三方平台错误"), diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 4ed686ba22..d466e6273e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -406,20 +406,11 @@ public class IcResiUserController { /** * excel导入居民基本信息 - * @param loginUser * @return */ @PostMapping("import/excel") - public Result importExcelByEasyExcel(@LoginUser TokenDto loginUser) { - - LoginUserDetailsFormDTO userForm = new LoginUserDetailsFormDTO(); - userForm.setApp(loginUser.getApp()); - userForm.setClient(loginUser.getClient()); - userForm.setUserId(loginUser.getUserId()); - - Result loginUserDetails = epmetUserOpenFeignClient.getLoginUserDetails(userForm); - - Object result = icResiUserService.importIcResiInfoFromExcel(loginUserDetails.getData().getAgencyId()); + public Result importExcelByEasyExcel() { + Object result = icResiUserService.importIcResiInfoFromExcel(); return new Result().ok(result); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 0363899e8a..b497302753 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -130,7 +130,7 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); - Object importIcResiInfoFromExcel(String currUserAgencyId); + Object importIcResiInfoFromExcel(); List> dynamicQuery(String customerId, String formCode, diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index af1e0e4578..cd357537c3 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -45,6 +45,7 @@ import com.epmet.dao.IcResiUserDao; import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; +import com.epmet.entity.IcPartyMemberEntity; import com.epmet.entity.IcResiUserEntity; import com.epmet.excel.handler.DynamicEasyExcelListener; import com.epmet.feign.EpmetAdminOpenFeignClient; @@ -69,6 +70,7 @@ import java.io.File; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 用户基础信息 @@ -95,7 +97,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( @@ -484,22 +486,40 @@ public class IcResiUserServiceImpl extends BaseServiceImpl headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); // 持久化 - persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, customerItems.get(0).getTableName(), currUserAgencyPids, currentUserId); + persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId); return headers; } @@ -555,11 +575,12 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formItem) ); Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); - - return formItemMap; + persistIcResiExtraInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, targetTableName, customerId); + return headerColumnWrapper; } /** - * 持久化 + * 持久化IC居民基础信息 * @param headerColumnWrapper 数据库列包装信息 * @param dataRows 数据行集合 * @param currUserAgencyId 当前用户的组织id * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 */ - private void persist(Map headerColumnWrapper, List> dataRows, - String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String tableName, - String currUserAgencyPids, String currentUserId) { + private void persistIcResiBaseInfo(Map headerColumnWrapper, List> dataRows, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, + String currUserAgencyPids, String currentUserId) { + + // 遍历每一行,将行内容转化为 for (Map row : dataRows) { - // 当前行的列们 -// List columnsOfCurrRow = new ArrayList<>(); - - List columnNames = new ArrayList<>(); - List columnValues = new ArrayList<>(); - LinkedHashMap columnAndValues = new LinkedHashMap<>(); - - for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { - - ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); - if ("input".equals(columnWrapper.getItemType()) - || "textarea".equals(columnWrapper.getItemType()) - || "datepicker".equals(columnWrapper.getItemType()) - || "timerange".equals(columnWrapper.getItemType()) - ) { - - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); - columnWrapper.setCellContent(cellContent); - columnWrapper.setColValue(cellContent); - - } else if ("select".equals(columnWrapper.getItemType()) - || "radio".equals(columnWrapper.getItemType())){ - - String optionSourceType = columnWrapper.getOptionSourceType(); - // 取单元格的内容 - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); - columnWrapper.setCellContent(cellContent); - - if ("local".equals(optionSourceType)) { - // 根据单元格内容,取到指定的option - Map options = columnWrapper.getOptions(); - String colValue = options.get(cellContent); - columnWrapper.setColValue(colValue); - } else { - // remote类型 - - Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId); - String colValue = options.get(cellContent); - columnWrapper.setColValue(colValue); - } - } else if ("checkbox".equals(columnWrapper.getItemType())) { - String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel); - columnWrapper.setColValue(checkBoxColValue); - } - columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue); - } + LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); columnAndValues.put("IS_ENSURE_HOUSE", "0"); columnAndValues.put("IS_OLD_PEOPLE", "0"); @@ -669,14 +647,146 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { -// System.out.println(c.columnName + "\t" + c.getColValue()); -// }); + // 验证居民信息是否存在 + String idCard = columnAndValues.get("ID_CARD"); + LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); + idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); + + if (baseDao.selectCount(idCardQuery) > 0) { + log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard); + } + + baseDao.add("ic_resi_user", columnAndValues); + } + } + + /** + * 持久化IC居民附加信息 + * @param headerColumnWrapper 数据库列包装信息 + * @param dataRows 数据行集合 + * @param currUserAgencyId 当前用户的组织id + * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 + * @param targetTableName 要插入到哪一个表 + */ + private void persistIcResiExtraInfo(Map headerColumnWrapper, List> dataRows, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, + String currentUserId, String targetTableName, String customerId) { + + // 遍历每一行,将行内容转化为 + for (Map row : dataRows) { + + LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); + + // 检验身份证号 + String idCard = columnAndValues.get("ID_CARD"); + if (StringUtils.isBlank(idCard)) { + throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME"))); + } + + // 检查用户是否存在 + LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); + idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); + + IcResiUserEntity icResiUserBaseInfo = baseDao.selectOne(idCardQuery); + if (icResiUserBaseInfo == null) { + throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard)); + } + + String icResiId = icResiUserBaseInfo.getId(); + + // 验证党员信息是否存在 + if (CollectionUtils.isNotEmpty(baseDao.selectSubTableRecords(customerId, icResiId, targetTableName))) { + log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName); + continue; + } + + columnAndValues.put("IC_RESI_USER", icResiId); + + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CREATED_BY", currentUserId); + columnAndValues.put("UPDATED_BY", currentUserId); + columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); + + columnAndValues = removeNeedlessColumns(columnAndValues); -// System.out.println("-------------------"); + baseDao.add(targetTableName, columnAndValues); + } + } + + /** + * 去掉多余的列 + * @param originColumnAndValues + * @return + */ + private LinkedHashMap removeNeedlessColumns(LinkedHashMap originColumnAndValues) { + List needlessColumns = Arrays.asList("GRID_ID", "VILLAGE_ID", "BUILD_ID", "UNIT_ID", "HOME_ID", + "IS_BDHJ", "NAME", "MOBILE", "GENDER", "ID_CARD", + "BIRTHDAY", "CONTACTS", "CONTACTS_MOBILE"); + + LinkedHashMap newMap = new LinkedHashMap(); + + originColumnAndValues.entrySet().forEach(b -> { + if (!needlessColumns.contains(b.getKey())) { + newMap.put(b.getKey(), b.getValue()); + } + }); + + return newMap; + } + + /** + * 将当前行数据转化成LinkedHashMap,供后续插入 + * @param headerColumnWrapper 当前行的ColumnWrapper,每一个ColumnWrapper元素都是当前行中的一个列 + * @param row 当前行数据 + * @param currUserAgencyId 当前用户所属机构ID + * @param checkBoxOptionColumnIdxAndLabel 复选框options列表。key:列号,value:复选框中文 + * @return + */ + private LinkedHashMap convertColumnWrappers2Map4Persist(Map headerColumnWrapper, Map row, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel) { + LinkedHashMap columnAndValues = new LinkedHashMap<>(); + + for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { + + ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); + if ("input".equals(columnWrapper.getItemType()) + || "textarea".equals(columnWrapper.getItemType()) + || "datepicker".equals(columnWrapper.getItemType()) + || "daterange".equals(columnWrapper.getItemType()) + ) { + + String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + columnWrapper.setCellContent(cellContent); + columnWrapper.setColValue(cellContent); + + } else if ("select".equals(columnWrapper.getItemType()) + || "radio".equals(columnWrapper.getItemType())){ + + String optionSourceType = columnWrapper.getOptionSourceType(); + // 取单元格的内容 + String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + columnWrapper.setCellContent(cellContent); + + if ("local".equals(optionSourceType)) { + // 根据单元格内容,取到指定的option + Map options = columnWrapper.getOptions(); + String colValue = options.get(cellContent); + columnWrapper.setColValue(colValue); + } else { + // remote类型 - baseDao.add(tableName, columnAndValues); + Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId); + String colValue = options.get(cellContent); + columnWrapper.setColValue(colValue); + } + } else if ("checkbox".equals(columnWrapper.getItemType())) { + String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel); + columnWrapper.setColValue(checkBoxColValue); + } + columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue); } + + return columnAndValues; } /** From 6e8138ecd032a085125dbaa3d2e9703a46fbb938 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 4 Nov 2021 22:24:05 +0800 Subject: [PATCH 124/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4ic=E5=B1=85=E6=B0=91=E5=AF=BC=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E5=B0=86=E5=AF=BC=E5=85=A5=E9=80=BB=E8=BE=91=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=9A=84service=E4=B8=ADIcResiUserImportServ?= =?UTF-8?q?ice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 6 +- .../service/IcResiUserImportService.java | 12 + .../com/epmet/service/IcResiUserService.java | 2 +- .../impl/IcResiUserImportServiceImpl.java | 718 ++++++++++++++++++ .../service/impl/IcResiUserServiceImpl.java | 654 +--------------- 5 files changed, 739 insertions(+), 653 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 8bc6cdbcca..f525d82218 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -33,6 +33,7 @@ import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -67,7 +68,7 @@ public class IcResiUserController { @Autowired private IcResiUserService icResiUserService; @Autowired - private EpmetUserOpenFeignClient epmetUserOpenFeignClient; + private IcResiUserImportService icResiUserImportService; /** * @Author sun @@ -216,12 +217,11 @@ public class IcResiUserController { /** * excel导入居民基本信息 * - * @param loginUser * @return */ @PostMapping("import/excel") public Result importExcelByEasyExcel() { - Object result = icResiUserService.importIcResiInfoFromExcel(); + Object result = icResiUserImportService.importIcResiInfoFromExcel(); return new Result().ok(result); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java new file mode 100644 index 0000000000..be0d40187d --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java @@ -0,0 +1,12 @@ +package com.epmet.service; + +/** + *@Description 居民信息导入service + *@Author wangxianzhang + *@Date 2021/11/4 + */ +public interface IcResiUserImportService { + + Object importIcResiInfoFromExcel(); + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 2a19783293..2e9e5cf70d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -70,7 +70,7 @@ public interface IcResiUserService extends BaseService { */ Map queryIcResiDetail(IcResiDetailFormDTO pageFormDTO); - Object importIcResiInfoFromExcel(); + List> dynamicQuery(String customerId, String formCode, diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java new file mode 100644 index 0000000000..4e121b2e8f --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -0,0 +1,718 @@ +package com.epmet.service.impl; + +import com.alibaba.excel.EasyExcelFactory; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.dto.result.OptionResultDTO; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.security.user.LoginUserUtil; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dao.IcResiUserDao; +import com.epmet.dto.*; +import com.epmet.dto.form.AgencyIdFormDTO; +import com.epmet.dto.form.CustomerFormQueryDTO; +import com.epmet.dto.form.HouseFormDTO; +import com.epmet.dto.form.LoginUserDetailsFormDTO; +import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.LoginUserDetailsResultDTO; +import com.epmet.dto.result.OptionDTO; +import com.epmet.entity.IcResiUserEntity; +import com.epmet.excel.handler.DynamicEasyExcelListener; +import com.epmet.feign.EpmetAdminOpenFeignClient; +import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.service.IcResiUserImportService; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @ClassName IcResiUserImportServiceImpl + * @Description TODO + * @Author wangxianzhang + * @Date 2021/11/4 8:53 下午 + * @Version 1.0 + */ +@Slf4j +@Service +public class IcResiUserImportServiceImpl implements IcResiUserImportService, ResultDataResolver { + + public static final ThreadLocal errorRow = new ThreadLocal(); + + @Autowired + private LoginUserUtil loginUserUtil; + + @Autowired + private EpmetUserOpenFeignClient epmetUserOpenFeignClient; + + @Autowired + private EpmetAdminOpenFeignClient adminOpenFeignClient; + + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; + + @Autowired + private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; + + @Autowired + private IcResiUserDao icResiUserDao; + + /** + * @description 列信息封装 + * + * @return + * @author wxz + * @date 2021.10.28 22:18:05 + */ + @Data + public static class ColumnWrapper { + private String combinedLabel; + private String columnName; + private String itemType; + private String itemId; + private List colIndexs; + //private List colContents; + // 单元格内容 + private String cellContent; + // 数据库中列的值 + private String colValue; + + // key:label,value:value + private Map options; + + /** + * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 + */ + private String optionSourceType; + + /** + * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 + */ + private String optionSourceValue; + } + + /** + * 错误行信息 + */ + public static class ErrorRow { + private String sheetName; + private String idCard; + private String name; + private String errorInfo; + } + + /** + * 导入居民信息 + * 导入主表和所有子表信息 + * @return + */ + @Override + public Object importIcResiInfoFromExcel() { + String loginUserId = loginUserUtil.getLoginUserId(); + String loginUserApp = loginUserUtil.getLoginUserApp(); + String loginUserClient = loginUserUtil.getLoginUserClient(); + + LoginUserDetailsFormDTO userForm = new LoginUserDetailsFormDTO(); + userForm.setApp(loginUserApp); + userForm.setClient(loginUserClient); + userForm.setUserId(loginUserId); + + LoginUserDetailsResultDTO loginUserDetails = getResultDataOrThrowsException(epmetUserOpenFeignClient.getLoginUserDetails(userForm), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + String currUserAgencyId = loginUserDetails.getAgencyId(); + + String excelPathName = "/opt/test/基础信息表/resi_info.xls"; + CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + String customerId = agencyInfo.getCustomerId(); + + importIcResiBaseInfoFromExcel(excelPathName, 0, 3, currUserAgencyId, agencyInfo.getPids(), loginUserId); + importIcResiExtraInfoFromExcel(excelPathName, 1, 2, currUserAgencyId, loginUserId, "ic_party_member", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 2, 2, currUserAgencyId, loginUserId, "ic_ensure_house", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 3, 2, currUserAgencyId, loginUserId, "ic_unemployed", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 4, 2, currUserAgencyId, loginUserId, "ic_veterans", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 5, 2, currUserAgencyId, loginUserId, "ic_united_front", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 6, 3, currUserAgencyId, loginUserId, "ic_volunteer", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 7, 2, currUserAgencyId, loginUserId, "ic_old_people", customerId); + importIcResiExtraInfoFromExcel(excelPathName, 8, 3, currUserAgencyId, loginUserId, "ic_special", customerId); + + return null; + } + + /** + * excel导入居民基本信息 + * @param sheetNo + * @param headRowNumber + * @param currUserAgencyId + * @param currUserAgencyPids + * @param currentUserId + * @return + */ + private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) { + DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); + EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); + + List> headList = readListener.getHeadList(); + List> dataList = readListener.getDataList(); + + Map> headers = mergeHead(headList); + + // 查询form相关信息 + List customerItems = listFormItems("resi_base_info"); + + // 清洗表头数据 + Map abandonedHeaders = washHeaders(headers, customerItems); + + //合并多级表头 + HashMap> combinedHeaders = combineHeaders(headers); + + // 得到客户配置item数据 + Map formItemMap = customerItems.stream().collect( + Collectors.toMap(formItem -> { + String groupLabel = formItem.getGroupLabel(); + String label = formItem.getLabel(); + if (StringUtils.isNotBlank(groupLabel)) { + return groupLabel.concat(":").concat(label); + } else { + return label; + } + }, formItem -> formItem) + ); + Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); + + // 持久化 + persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId); + + return headers; + } + + /** + * excel导入居民附加信息 + * @param excelPathName + * @param sheetNo + * @param headRowNumber + * @param currUserAgencyId + * @param currentUserId + * @param targetTableName 要插入哪一个表 + * @return + */ + private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId, + String targetTableName, String customerId) { + DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); + EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); + + List> headList = readListener.getHeadList(); + List> dataList = readListener.getDataList(); + + Map> headers = mergeHead(headList); + + // 查询form相关信息 + List customerItems = listFormItems("resi_base_info"); + + // 清洗表头数据 + Map abandonedHeaders = washHeaders(headers, customerItems); + + //合并多级表头 + HashMap> combinedHeaders = combineHeaders(headers); + + // 得到客户配置item数据 + Map formItemMap = customerItems.stream().collect( + Collectors.toMap(formItem -> { + String groupLabel = formItem.getGroupLabel(); + String label = formItem.getLabel(); + if (StringUtils.isNotBlank(groupLabel)) { + return groupLabel.concat(":").concat(label); + } else { + return label; + } + }, formItem -> formItem) + ); + Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); + persistIcResiExtraInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, targetTableName, customerId); + return headerColumnWrapper; + } + + /** + * 持久化IC居民基础信息 + * @param headerColumnWrapper 数据库列包装信息 + * @param dataRows 数据行集合 + * @param currUserAgencyId 当前用户的组织id + * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 + */ + private void persistIcResiBaseInfo(Map headerColumnWrapper, List> dataRows, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, + String currUserAgencyPids, String currentUserId) { + + // 遍历每一行,将行内容转化为 + for (Map row : dataRows) { + + LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); + + columnAndValues.put("IS_ENSURE_HOUSE", "0"); + columnAndValues.put("IS_OLD_PEOPLE", "0"); + columnAndValues.put("IS_PARTY", "0"); + columnAndValues.put("IS_SPECIAL", "0"); + columnAndValues.put("IS_UNEMPLOYED", "0"); + columnAndValues.put("IS_UNITED_FRONT", "0"); + columnAndValues.put("IS_VETERANS", "0"); + columnAndValues.put("IS_VOLUNTEER", "0"); + + columnAndValues.put("AGENCY_ID", currUserAgencyId); + columnAndValues.put("PIDS", currUserAgencyPids); + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CREATED_BY", currentUserId); + columnAndValues.put("UPDATED_BY", currentUserId); + columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); + + // 验证居民信息是否存在 + String idCard = columnAndValues.get("ID_CARD"); + LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); + idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); + + if (icResiUserDao.selectCount(idCardQuery) > 0) { + log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard); + } + + icResiUserDao.add("ic_resi_user", columnAndValues); + } + } + + /** + * 持久化IC居民附加信息 + * @param headerColumnWrapper 数据库列包装信息 + * @param dataRows 数据行集合 + * @param currUserAgencyId 当前用户的组织id + * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 + * @param targetTableName 要插入到哪一个表 + */ + private void persistIcResiExtraInfo(Map headerColumnWrapper, List> dataRows, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, + String currentUserId, String targetTableName, String customerId) { + + // 遍历每一行,将行内容转化为 + for (Map row : dataRows) { + + LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); + + // 检验身份证号 + String idCard = columnAndValues.get("ID_CARD"); + if (StringUtils.isBlank(idCard)) { + throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME"))); + } + + // 检查用户是否存在 + LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); + idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); + + IcResiUserEntity icResiUserBaseInfo = icResiUserDao.selectOne(idCardQuery); + if (icResiUserBaseInfo == null) { + throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard)); + } + + String icResiId = icResiUserBaseInfo.getId(); + + // 验证党员信息是否存在 + if (CollectionUtils.isNotEmpty(icResiUserDao.selectSubTableRecords(customerId, icResiId, targetTableName))) { + log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName); + continue; + } + + columnAndValues.put("IC_RESI_USER", icResiId); + + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CREATED_BY", currentUserId); + columnAndValues.put("UPDATED_BY", currentUserId); + columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); + + columnAndValues = removeNeedlessColumns(columnAndValues); + + icResiUserDao.add(targetTableName, columnAndValues); + } + } + + /** + * 去掉多余的列 + * @param originColumnAndValues + * @return + */ + private LinkedHashMap removeNeedlessColumns(LinkedHashMap originColumnAndValues) { + List needlessColumns = Arrays.asList("GRID_ID", "VILLAGE_ID", "BUILD_ID", "UNIT_ID", "HOME_ID", + "IS_BDHJ", "NAME", "MOBILE", "GENDER", "ID_CARD", + "BIRTHDAY", "CONTACTS", "CONTACTS_MOBILE"); + + LinkedHashMap newMap = new LinkedHashMap(); + + originColumnAndValues.entrySet().forEach(b -> { + if (!needlessColumns.contains(b.getKey())) { + newMap.put(b.getKey(), b.getValue()); + } + }); + + return newMap; + } + + /** + * 将当前行数据转化成LinkedHashMap,供后续插入 + * @param headerColumnWrapper 当前行的ColumnWrapper,每一个ColumnWrapper元素都是当前行中的一个列 + * @param row 当前行数据 + * @param currUserAgencyId 当前用户所属机构ID + * @param checkBoxOptionColumnIdxAndLabel 复选框options列表。key:列号,value:复选框中文 + * @return + */ + private LinkedHashMap convertColumnWrappers2Map4Persist(Map headerColumnWrapper, Map row, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel) { + LinkedHashMap columnAndValues = new LinkedHashMap<>(); + + for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { + + ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); + if ("input".equals(columnWrapper.getItemType()) + || "textarea".equals(columnWrapper.getItemType()) + || "datepicker".equals(columnWrapper.getItemType()) + || "daterange".equals(columnWrapper.getItemType()) + ) { + + String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + columnWrapper.setCellContent(cellContent); + columnWrapper.setColValue(cellContent); + + } else if ("select".equals(columnWrapper.getItemType()) + || "radio".equals(columnWrapper.getItemType())){ + + String optionSourceType = columnWrapper.getOptionSourceType(); + // 取单元格的内容 + String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + columnWrapper.setCellContent(cellContent); + + if ("local".equals(optionSourceType)) { + // 根据单元格内容,取到指定的option + Map options = columnWrapper.getOptions(); + String colValue = options.get(cellContent); + columnWrapper.setColValue(colValue); + } else { + // remote类型 + + Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId); + String colValue = options.get(cellContent); + columnWrapper.setColValue(colValue); + } + } else if ("checkbox".equals(columnWrapper.getItemType())) { + String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel); + columnWrapper.setColValue(checkBoxColValue); + } + columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue); + } + + return columnAndValues; + } + + /** + * 根据formCode查询该form的item列表 + * @param formCode + * @return + */ + private List listFormItems(String formCode) { + CustomerFormQueryDTO form = new CustomerFormQueryDTO(); + form.setFormCode(formCode); + Result> result = operCustomizeOpenFeignClient.listItems(form); + return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); + } + + /** + * @description 合并头 + * + * @param headers + * @return + * @author wxz + * @date 2021.10.28 21:27:18 + */ + private HashMap> combineHeaders(Map> headers) { + HashMap> itemAndColIndexs = new LinkedHashMap<>(); + + headers.forEach((k, v) -> { + String tempKey = String.join(":", v); + List colIndexs = itemAndColIndexs.get(tempKey); + if (colIndexs == null) { + colIndexs = new ArrayList<>(); + itemAndColIndexs.put(tempKey, colIndexs); + } + colIndexs.add(k); + }); + + return itemAndColIndexs; + } + + /** + * @description 洗头 + * + * @param headers + * @param items + * @return + * @author wxz + * @date 2021.10.28 21:07:12 + */ + private Map washHeaders(Map> headers, List items) { + List itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList()); + Map abandonedHeaders = new HashMap<>(); + for (Map.Entry> entry:headers.entrySet()) { + Integer colIdx = entry.getKey(); + List v = entry.getValue(); + int lastPartIndex = v.size() - 1; + String lastValuePart = v.get(lastPartIndex); + if (!itemLabels.contains(lastValuePart)) { + // 该部分为options,它的上一级是item,那么去掉options这一级 + v.remove(lastPartIndex); + abandonedHeaders.put(colIdx, lastValuePart); + } + } + + return abandonedHeaders; + } + + /** + * @description 数据整合,将excel表头汉字信息转化成ColumnWrapper列封装数据 + * * key:itemId + * * value:ColumnWrapper列包装信息 + * @param formItemMap item map + * key:itemId; + * value: 合并之后的head字符串,例如:健康信息:监护人 + * @param combinedHeaders 合并之后的head信息。 + * key:合并之后head字符串(例如:党员信息:入党时间); + * value:列号组成的列表(例如[1,2,3]) + * @param datas + * @param abandonedHeaders + * @return + */ + private Map convertExcelHeaders2DBColumnWrappers(Map formItemMap, Map> combinedHeaders, + List> datas, Map abandonedHeaders) { + +// HashMap> tables = new HashMap<>(); + Map columns = new LinkedHashMap<>(combinedHeaders.size()); + + for (Map.Entry> entry : combinedHeaders.entrySet()) { + String combinedHeader = entry.getKey(); + + FormItem item = formItemMap.get(combinedHeader); + + if (item == null) { + // 如果数据库中没有该项,可能是用户自己定义的项,忽略 + continue; + } + + ColumnWrapper columnWrapper = new ColumnWrapper(); + + // 填充options + columnWrapper.setItemType(item.getItemType()); + columnWrapper.setItemId(item.getItemId()); + String groupLabel = item.getGroupLabel(); + String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel()); + columnWrapper.setCombinedLabel(combinedLabel); + columnWrapper.setColumnName(item.getColumnName()); + columnWrapper.setColIndexs(entry.getValue()); + + columnWrapper.setOptionSourceType(item.getOptionSourceType()); + columnWrapper.setOptionSourceValue(item.getOptionSourceValue()); + columnWrapper.setOptions(item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue))); + + columns.put(item.getItemId(), columnWrapper); + } + return columns; + } + + /** + * 获取checkbox列值 + * @param columnWrapper 数据库列包装信息,每一列跳数据对应数据库的一个列 + * @param dataRow 数据行,每一条都是一行中的一个单元格 + * @param checkboxOptions 复选框的选项。k: 列号, value: checkboxlabel中文 + * @return + */ + private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map dataRow, Map checkboxOptions) { + + Map options = columnWrapper.getOptions(); + List colIndexs = columnWrapper.getColIndexs(); + + List optionValues = colIndexs.stream().filter(i -> { + String cellContent = dataRow.get(i); + return StringUtils.isNotBlank(cellContent) && cellContent.equals("是"); + }).map(i -> { + String checkboxOptionLabel = checkboxOptions.get(i); + return options.get(checkboxOptionLabel); + }).collect(Collectors.toList()); + + return String.join(",", optionValues); + } + + /** + * @description 合并表头 + * Map> + * + * @param headList + * @return + * @author wxz + * @date 2021.10.27 16:17:34 + */ + private Map> mergeHead(List> headList) { + + Map lastNotNullHeads = new LinkedHashMap<>(); + + Map> mergedHead = new LinkedHashMap<>(); + + int levelCount = headList.size(); + + Map firstLevel = headList.get(0); + + // 遍历所有列 + for (Map.Entry column : firstLevel.entrySet()) { + Integer columIndex = column.getKey(); + + List labels = new ArrayList<>(); + + // 竖着遍历该列的所有行 + for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) { + String label = headList.get(currentLevel).get(columIndex); + + if (StringUtils.isNotBlank(label)) { + lastNotNullHeads.put(currentLevel, label); + } else { + if (currentLevel == 0 || StringUtils.isBlank(headList.get(currentLevel - 1).get(columIndex))) { + label = lastNotNullHeads.get(currentLevel); + } + } + + if (StringUtils.isNotBlank(label)) { + labels.add(label); + } + } + + mergedHead.put(columIndex, labels); + } + + return mergedHead; + } + + /** + * 远程获取options + * @param fullUri + * @return + */ + public Map listRemoteOptions(Map columnWrappers, String fullUri, String currUserAgencyId) { + String pureUri = null; + String cascadeItemId = null; + ColumnWrapper cascadeItemColumnWrapper = null; + + if (fullUri.indexOf("?") != -1) { + String[] uriParts = fullUri.split("\\?"); + pureUri = uriParts[0]; + cascadeItemId = uriParts[1]; + + // 根据uri上的id,找到关联的itemid,从而找到关联的item的值 + if (columnWrappers != null){ + cascadeItemColumnWrapper = columnWrappers.get(cascadeItemId); + } + } else { + pureUri = fullUri; + } + + List options = null; + + switch (pureUri) { + case "/epmetuser/icresidemanddict/demandoption": + options = getResultDataOrThrowsException(epmetUserOpenFeignClient.getDemandOptions(), ServiceConstant.EPMET_USER_SERVER, + EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/customergrid/gridoption": + AgencyIdFormDTO form = new AgencyIdFormDTO(); + form.setAgencyId(currUserAgencyId); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/customerpartybranch/branchoption": + + CustomerPartyBranchDTO bform = new CustomerPartyBranchDTO(); + bform.setGridId(cascadeItemColumnWrapper.getColValue()); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/icbuilding/buildingoption": + IcBuildingDTO buildingform = new IcBuildingDTO(); + buildingform.setNeighborHoodId(cascadeItemColumnWrapper.getColValue()); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/icbuildingunit/unitoption": + IcBuildingUnitDTO buForm = new IcBuildingUnitDTO(); + buForm.setBuildingId(cascadeItemColumnWrapper.getColValue()); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/ichouse/houseoption": + HouseFormDTO hform = new HouseFormDTO(); + hform.setUnitId(cascadeItemColumnWrapper.getColValue()); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/gov/org/icneighborhood/neighborhoodoption": + IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); + nform.setAgencyId(currUserAgencyId); + nform.setGridId(cascadeItemColumnWrapper.getColValue()); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/education": + options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/house": + options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/nation": + options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/ninesmallplaces": + options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + case "/sys/dict/data/relationship": + options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + break; + + } + + if (options == null) { + return null; + } + + return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue)); + + // 通用api调用,无法实现 + /*if (!uri.startsWith("/api")) uri = "/api".concat(uri); + + NamingService namingService = discoveryProperties.namingServiceInstance(); + ResponseEntity>> response = null; + try { + // 调用gateway服务,查询相关接口 + Instance gatewayInstance = namingService.getAllInstances(ServiceConstant.EPMET_GATEWAY).get(0); + String ip = gatewayInstance.getIp(); + int port = gatewayInstance.getPort(); + + String url = String.format("http://%s:%s%s", ip, port, uri); + + ParameterizedTypeReference>> tr = new ParameterizedTypeReference>>() {}; + response = new RestTemplate().exchange(url, HttpMethod.POST, null, tr); + } catch (NacosException e) { + e.printStackTrace(); + } + + if (response != null && (response.getStatusCode() == HttpStatus.OK)) { + List options = response.getBody().getData(); + if (options == null) { + System.out.println(6); + } + return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue)); + } else { + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + }*/ + + } + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index fe8905ec2f..0765780072 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -50,6 +50,7 @@ import com.epmet.entity.IcPartyMemberEntity; import com.epmet.entity.IcResiUserEntity; import com.epmet.excel.handler.DynamicEasyExcelListener; import com.epmet.feign.*; +import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -75,24 +76,17 @@ import java.util.stream.Stream; */ @Slf4j @Service -public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService, ResultDataResolver { +public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService { @Autowired private GovOrgOpenFeignClient govOrgOpenFeignClient; @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; - @Autowired - private EpmetUserOpenFeignClient epmetUserOpenFeignClient; - - @Autowired - private EpmetAdminOpenFeignClient adminOpenFeignClient; - - @Autowired - private LoginUserUtil loginUserUtil; @Autowired private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; - + @Autowired + private IcResiUserImportServiceImpl icResiUserImportService; private QueryWrapper getWrapper(Map params){ String id = (String)params.get(FieldConstant.ID_HUMP); @@ -451,644 +445,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> headList = readListener.getHeadList(); - List> dataList = readListener.getDataList(); - - Map> headers = mergeHead(headList); - - // 查询form相关信息 - List customerItems = listFormItems("resi_base_info"); - - // 清洗表头数据 - Map abandonedHeaders = washHeaders(headers, customerItems); - - //合并多级表头 - HashMap> combinedHeaders = combineHeaders(headers); - - // 得到客户配置item数据 - Map formItemMap = customerItems.stream().collect( - Collectors.toMap(formItem -> { - String groupLabel = formItem.getGroupLabel(); - String label = formItem.getLabel(); - if (StringUtils.isNotBlank(groupLabel)) { - return groupLabel.concat(":").concat(label); - } else { - return label; - } - }, formItem -> formItem) - ); - Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); - - // 持久化 - persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId); - - return headers; - } - - /** - * excel导入居民附加信息 - * @param excelPathName - * @param sheetNo - * @param headRowNumber - * @param currUserAgencyId - * @param currentUserId - * @param targetTableName 要插入哪一个表 - * @return - */ - private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId, - String targetTableName, String customerId) { - DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); - EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); - - List> headList = readListener.getHeadList(); - List> dataList = readListener.getDataList(); - - Map> headers = mergeHead(headList); - - // 查询form相关信息 - List customerItems = listFormItems("resi_base_info"); - - // 清洗表头数据 - Map abandonedHeaders = washHeaders(headers, customerItems); - - //合并多级表头 - HashMap> combinedHeaders = combineHeaders(headers); - - // 得到客户配置item数据 - Map formItemMap = customerItems.stream().collect( - Collectors.toMap(formItem -> { - String groupLabel = formItem.getGroupLabel(); - String label = formItem.getLabel(); - if (StringUtils.isNotBlank(groupLabel)) { - return groupLabel.concat(":").concat(label); - } else { - return label; - } - }, formItem -> formItem) - ); - Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); - persistIcResiExtraInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currentUserId, targetTableName, customerId); - return headerColumnWrapper; - } - - /** - * 持久化IC居民基础信息 - * @param headerColumnWrapper 数据库列包装信息 - * @param dataRows 数据行集合 - * @param currUserAgencyId 当前用户的组织id - * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 - */ - private void persistIcResiBaseInfo(Map headerColumnWrapper, List> dataRows, - String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, - String currUserAgencyPids, String currentUserId) { - - // 遍历每一行,将行内容转化为 - for (Map row : dataRows) { - - LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); - - columnAndValues.put("IS_ENSURE_HOUSE", "0"); - columnAndValues.put("IS_OLD_PEOPLE", "0"); - columnAndValues.put("IS_PARTY", "0"); - columnAndValues.put("IS_SPECIAL", "0"); - columnAndValues.put("IS_UNEMPLOYED", "0"); - columnAndValues.put("IS_UNITED_FRONT", "0"); - columnAndValues.put("IS_VETERANS", "0"); - columnAndValues.put("IS_VOLUNTEER", "0"); - - columnAndValues.put("AGENCY_ID", currUserAgencyId); - columnAndValues.put("PIDS", currUserAgencyPids); - columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); - columnAndValues.put("CREATED_BY", currentUserId); - columnAndValues.put("UPDATED_BY", currentUserId); - columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); - - // 验证居民信息是否存在 - String idCard = columnAndValues.get("ID_CARD"); - LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); - idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); - - if (baseDao.selectCount(idCardQuery) > 0) { - log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard); - } - - baseDao.add("ic_resi_user", columnAndValues); - } - } - - /** - * 持久化IC居民附加信息 - * @param headerColumnWrapper 数据库列包装信息 - * @param dataRows 数据行集合 - * @param currUserAgencyId 当前用户的组织id - * @param checkBoxOptionColumnIdxAndLabel 复选框的列号&label中文 - * @param targetTableName 要插入到哪一个表 - */ - private void persistIcResiExtraInfo(Map headerColumnWrapper, List> dataRows, - String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, - String currentUserId, String targetTableName, String customerId) { - - // 遍历每一行,将行内容转化为 - for (Map row : dataRows) { - - LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); - - // 检验身份证号 - String idCard = columnAndValues.get("ID_CARD"); - if (StringUtils.isBlank(idCard)) { - throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME"))); - } - - // 检查用户是否存在 - LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); - idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); - - IcResiUserEntity icResiUserBaseInfo = baseDao.selectOne(idCardQuery); - if (icResiUserBaseInfo == null) { - throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard)); - } - - String icResiId = icResiUserBaseInfo.getId(); - - // 验证党员信息是否存在 - if (CollectionUtils.isNotEmpty(baseDao.selectSubTableRecords(customerId, icResiId, targetTableName))) { - log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName); - continue; - } - - columnAndValues.put("IC_RESI_USER", icResiId); - - columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); - columnAndValues.put("CREATED_BY", currentUserId); - columnAndValues.put("UPDATED_BY", currentUserId); - columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); - - columnAndValues = removeNeedlessColumns(columnAndValues); - - baseDao.add(targetTableName, columnAndValues); - } - } - - /** - * 去掉多余的列 - * @param originColumnAndValues - * @return - */ - private LinkedHashMap removeNeedlessColumns(LinkedHashMap originColumnAndValues) { - List needlessColumns = Arrays.asList("GRID_ID", "VILLAGE_ID", "BUILD_ID", "UNIT_ID", "HOME_ID", - "IS_BDHJ", "NAME", "MOBILE", "GENDER", "ID_CARD", - "BIRTHDAY", "CONTACTS", "CONTACTS_MOBILE"); - - LinkedHashMap newMap = new LinkedHashMap(); - - originColumnAndValues.entrySet().forEach(b -> { - if (!needlessColumns.contains(b.getKey())) { - newMap.put(b.getKey(), b.getValue()); - } - }); - - return newMap; - } - - /** - * 将当前行数据转化成LinkedHashMap,供后续插入 - * @param headerColumnWrapper 当前行的ColumnWrapper,每一个ColumnWrapper元素都是当前行中的一个列 - * @param row 当前行数据 - * @param currUserAgencyId 当前用户所属机构ID - * @param checkBoxOptionColumnIdxAndLabel 复选框options列表。key:列号,value:复选框中文 - * @return - */ - private LinkedHashMap convertColumnWrappers2Map4Persist(Map headerColumnWrapper, Map row, - String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel) { - LinkedHashMap columnAndValues = new LinkedHashMap<>(); - - for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { - - ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); - if ("input".equals(columnWrapper.getItemType()) - || "textarea".equals(columnWrapper.getItemType()) - || "datepicker".equals(columnWrapper.getItemType()) - || "daterange".equals(columnWrapper.getItemType()) - ) { - - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); - columnWrapper.setCellContent(cellContent); - columnWrapper.setColValue(cellContent); - - } else if ("select".equals(columnWrapper.getItemType()) - || "radio".equals(columnWrapper.getItemType())){ - - String optionSourceType = columnWrapper.getOptionSourceType(); - // 取单元格的内容 - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); - columnWrapper.setCellContent(cellContent); - - if ("local".equals(optionSourceType)) { - // 根据单元格内容,取到指定的option - Map options = columnWrapper.getOptions(); - String colValue = options.get(cellContent); - columnWrapper.setColValue(colValue); - } else { - // remote类型 - - Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId); - String colValue = options.get(cellContent); - columnWrapper.setColValue(colValue); - } - } else if ("checkbox".equals(columnWrapper.getItemType())) { - String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel); - columnWrapper.setColValue(checkBoxColValue); - } - columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue); - } - - return columnAndValues; - } - - /** - * 根据formCode查询该form的item列表 - * @param formCode - * @return - */ - private List listFormItems(String formCode) { - CustomerFormQueryDTO form = new CustomerFormQueryDTO(); - form.setFormCode(formCode); - Result> result = operCustomizeOpenFeignClient.listItems(form); - return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); - } - - /** - * @description 合并头 - * - * @param headers - * @return - * @author wxz - * @date 2021.10.28 21:27:18 - */ - private HashMap> combineHeaders(Map> headers) { - HashMap> itemAndColIndexs = new LinkedHashMap<>(); - - headers.forEach((k, v) -> { - String tempKey = String.join(":", v); - List colIndexs = itemAndColIndexs.get(tempKey); - if (colIndexs == null) { - colIndexs = new ArrayList<>(); - itemAndColIndexs.put(tempKey, colIndexs); - } - colIndexs.add(k); - }); - - return itemAndColIndexs; - } - - /** - * @description 洗头 - * - * @param headers - * @param items - * @return - * @author wxz - * @date 2021.10.28 21:07:12 - */ - private Map washHeaders(Map> headers, List items) { - List itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList()); - Map abandonedHeaders = new HashMap<>(); - for (Map.Entry> entry:headers.entrySet()) { - Integer colIdx = entry.getKey(); - List v = entry.getValue(); - int lastPartIndex = v.size() - 1; - String lastValuePart = v.get(lastPartIndex); - if (!itemLabels.contains(lastValuePart)) { - // 该部分为options,它的上一级是item,那么去掉options这一级 - v.remove(lastPartIndex); - abandonedHeaders.put(colIdx, lastValuePart); - } - } - - return abandonedHeaders; - } - - /** - * @description 数据整合,将excel表头汉字信息转化成ColumnWrapper列封装数据 - * * key:itemId - * * value:ColumnWrapper列包装信息 - * @param formItemMap item map - * key:itemId; - * value: 合并之后的head字符串,例如:健康信息:监护人 - * @param combinedHeaders 合并之后的head信息。 - * key:合并之后head字符串(例如:党员信息:入党时间); - * value:列号组成的列表(例如[1,2,3]) - * @param datas - * @param abandonedHeaders - * @return - */ - private Map convertExcelHeaders2DBColumnWrappers(Map formItemMap, Map> combinedHeaders, - List> datas, Map abandonedHeaders) { - -// HashMap> tables = new HashMap<>(); - Map columns = new LinkedHashMap<>(combinedHeaders.size()); - - for (Map.Entry> entry : combinedHeaders.entrySet()) { - String combinedHeader = entry.getKey(); - - FormItem item = formItemMap.get(combinedHeader); - - if (item == null) { - // 如果数据库中没有该项,可能是用户自己定义的项,忽略 - continue; - } - - ColumnWrapper columnWrapper = new ColumnWrapper(); - - // 填充options - columnWrapper.setItemType(item.getItemType()); - columnWrapper.setItemId(item.getItemId()); - String groupLabel = item.getGroupLabel(); - String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel()); - columnWrapper.setCombinedLabel(combinedLabel); - columnWrapper.setColumnName(item.getColumnName()); - columnWrapper.setColIndexs(entry.getValue()); - - columnWrapper.setOptionSourceType(item.getOptionSourceType()); - columnWrapper.setOptionSourceValue(item.getOptionSourceValue()); - columnWrapper.setOptions(item.getOptions().stream().collect(Collectors.toMap(OptionDTO::getLabel, OptionDTO::getValue))); - - columns.put(item.getItemId(), columnWrapper); - } - return columns; - } - - /** - * 获取checkbox列值 - * @param columnWrapper 数据库列包装信息,每一列跳数据对应数据库的一个列 - * @param dataRow 数据行,每一条都是一行中的一个单元格 - * @param checkboxOptions 复选框的选项。k: 列号, value: checkboxlabel中文 - * @return - */ - private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map dataRow, Map checkboxOptions) { - - Map options = columnWrapper.getOptions(); - List colIndexs = columnWrapper.getColIndexs(); - - List optionValues = colIndexs.stream().filter(i -> { - String cellContent = dataRow.get(i); - return StringUtils.isNotBlank(cellContent) && cellContent.equals("是"); - }).map(i -> { - String checkboxOptionLabel = checkboxOptions.get(i); - return options.get(checkboxOptionLabel); - }).collect(Collectors.toList()); - - return String.join(",", optionValues); - } - - /** - * 远程获取options - * @param fullUri - * @return - */ - private Map listRemoteOptions(Map columnWrappers, String fullUri, String currUserAgencyId) { - String pureUri = null; - String cascadeItemId = null; - ColumnWrapper cascadeItemColumnWrapper = null; - - if (fullUri.indexOf("?") != -1) { - String[] uriParts = fullUri.split("\\?"); - pureUri = uriParts[0]; - cascadeItemId = uriParts[1]; - - // 根据uri上的id,找到关联的itemid,从而找到关联的item的值 - if (columnWrappers != null){ - cascadeItemColumnWrapper = columnWrappers.get(cascadeItemId); - } - } else { - pureUri = fullUri; - } - - List options = null; - - switch (pureUri) { - case "/epmetuser/icresidemanddict/demandoption": - options = getResultDataOrThrowsException(epmetUserOpenFeignClient.getDemandOptions(), ServiceConstant.EPMET_USER_SERVER, - EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/gov/org/customergrid/gridoption": - AgencyIdFormDTO form = new AgencyIdFormDTO(); - form.setAgencyId(currUserAgencyId); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/gov/org/customerpartybranch/branchoption": - - CustomerPartyBranchDTO bform = new CustomerPartyBranchDTO(); - bform.setGridId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/gov/org/icbuilding/buildingoption": - IcBuildingDTO buildingform = new IcBuildingDTO(); - buildingform.setNeighborHoodId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/gov/org/icbuildingunit/unitoption": - IcBuildingUnitDTO buForm = new IcBuildingUnitDTO(); - buForm.setBuildingId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/gov/org/ichouse/houseoption": - HouseFormDTO hform = new HouseFormDTO(); - hform.setUnitId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/gov/org/icneighborhood/neighborhoodoption": - IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); - nform.setAgencyId(currUserAgencyId); - nform.setGridId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/sys/dict/data/education": - options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/sys/dict/data/house": - options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/sys/dict/data/nation": - options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/sys/dict/data/ninesmallplaces": - options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - case "/sys/dict/data/relationship": - options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); - break; - - } - - if (options == null) { - return null; - } - - return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue)); - - // 通用api调用,无法实现 - /*if (!uri.startsWith("/api")) uri = "/api".concat(uri); - - NamingService namingService = discoveryProperties.namingServiceInstance(); - ResponseEntity>> response = null; - try { - // 调用gateway服务,查询相关接口 - Instance gatewayInstance = namingService.getAllInstances(ServiceConstant.EPMET_GATEWAY).get(0); - String ip = gatewayInstance.getIp(); - int port = gatewayInstance.getPort(); - - String url = String.format("http://%s:%s%s", ip, port, uri); - - ParameterizedTypeReference>> tr = new ParameterizedTypeReference>>() {}; - response = new RestTemplate().exchange(url, HttpMethod.POST, null, tr); - } catch (NacosException e) { - e.printStackTrace(); - } - - if (response != null && (response.getStatusCode() == HttpStatus.OK)) { - List options = response.getBody().getData(); - if (options == null) { - System.out.println(6); - } - return options.stream().collect(Collectors.toMap(OptionResultDTO::getLabel, OptionResultDTO::getValue)); - } else { - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); - }*/ - - } - - /** - * @description 合并表头 - * Map> - * - * @param headList - * @return - * @author wxz - * @date 2021.10.27 16:17:34 - */ - private Map> mergeHead(List> headList) { - - Map lastNotNullHeads = new LinkedHashMap<>(); - - Map> mergedHead = new LinkedHashMap<>(); - - int levelCount = headList.size(); - - Map firstLevel = headList.get(0); - - // 遍历所有列 - for (Map.Entry column : firstLevel.entrySet()) { - Integer columIndex = column.getKey(); - - List labels = new ArrayList<>(); - - // 竖着遍历该列的所有行 - for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) { - String label = headList.get(currentLevel).get(columIndex); - - if (StringUtils.isNotBlank(label)) { - lastNotNullHeads.put(currentLevel, label); - } else { - if (currentLevel == 0 || StringUtils.isBlank(headList.get(currentLevel - 1).get(columIndex))) { - label = lastNotNullHeads.get(currentLevel); - } - } - - if (StringUtils.isNotBlank(label)) { - labels.add(label); - } - } - - mergedHead.put(columIndex, labels); - } - - return mergedHead; - } - - /** - * @description 列信息封装 - * - * @return - * @author wxz - * @date 2021.10.28 22:18:05 - */ - @Data - public static class ColumnWrapper { - private String combinedLabel; - private String columnName; - private String itemType; - private String itemId; - private List colIndexs; - //private List colContents; - // 单元格内容 - private String cellContent; - // 数据库中列的值 - private String colValue; - - // key:label,value:value - private Map options; - - /** - * 选项来源,REMOTE;LOCAL;如果是动态加载的下拉框或者CHECKBOX等的情况下使用。URL:接口获取(LABEL,VALUE);JSON:直接从JSON中取 - */ - private String optionSourceType; - - /** - * 来源地址,REMOTE才有,固定格式;如果OPTIONS_SOURCE是URL,则此处填写要调用的接口的URL相对路径,例如:/API/GOV/ORG/XXXX。此处不应设置参数,若需要参数应当完全由后端,通过TOKEN信息来获取 - */ - private String optionSourceValue; - } - /** * desc:动态查询 某表的所有字段值 * @param customerId @@ -1185,7 +541,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl stringMap = listRemoteOptions(new HashMap<>(), v.getOptionSourceValue(), null); + Map stringMap = icResiUserImportService.listRemoteOptions(new HashMap<>(), v.getOptionSourceValue(), null); if ("checkbox".equals(v.getItemType())) { stringMap.forEach((label, value) -> map.put(value, temp.toString().contains(value) ? "是" : "否")); } else if ("select".equals(v.getItemType())) { From 84cc673e3f6c6a342025e895519316d7d1fbcfb6 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 5 Nov 2021 09:21:12 +0800 Subject: [PATCH 125/253] =?UTF-8?q?mq=E4=BA=8B=E4=BB=B6DTO=E5=90=8D?= =?UTF-8?q?=E5=AD=97=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tatsMQMsg.java => IcResiUserAddMQMsg.java} | 2 +- .../mq/listener/ICWarnStatsEventListener.java | 4 +-- .../service/impl/IcResiUserServiceImpl.java | 25 ++++++------------- 3 files changed, 11 insertions(+), 20 deletions(-) rename epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/{IcWarnStatsMQMsg.java => IcResiUserAddMQMsg.java} (81%) diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcResiUserAddMQMsg.java similarity index 81% rename from epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java rename to epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcResiUserAddMQMsg.java index b78863ef4c..328e7419cf 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcWarnStatsMQMsg.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/IcResiUserAddMQMsg.java @@ -9,7 +9,7 @@ import java.io.Serializable; * @author sun */ @Data -public class IcWarnStatsMQMsg implements Serializable { +public class IcResiUserAddMQMsg implements Serializable { //客户Id private String customerId; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java index 3a16ec247e..905f804351 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java @@ -2,7 +2,7 @@ package com.epmet.mq.listener; import com.alibaba.fastjson.JSON; import com.epmet.commons.rocketmq.constants.MQUserPropertys; -import com.epmet.commons.rocketmq.messages.IcWarnStatsMQMsg; +import com.epmet.commons.rocketmq.messages.IcResiUserAddMQMsg; import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -57,7 +57,7 @@ public class ICWarnStatsEventListener implements MessageListenerConcurrently { String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("【开放数据事件监听器】-居民信息变动-收到消息内容:{},操作:{}", msg, tags); - IcWarnStatsMQMsg obj = JSON.parseObject(msg, IcWarnStatsMQMsg.class); + IcResiUserAddMQMsg obj = JSON.parseObject(msg, IcResiUserAddMQMsg.class); DistributedLock distributedLock = null; RLock lock = null; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 0765780072..b353507792 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -17,44 +17,37 @@ package com.epmet.service.impl; -import com.alibaba.excel.EasyExcelFactory; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; -import com.epmet.commons.rocketmq.messages.IcWarnStatsMQMsg; +import com.epmet.commons.rocketmq.messages.IcResiUserAddMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; -import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; -import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; -import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; -import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; -import com.epmet.dto.*; +import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.CustomerGridDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; -import com.epmet.entity.IcPartyMemberEntity; import com.epmet.entity.IcResiUserEntity; -import com.epmet.excel.handler.DynamicEasyExcelListener; -import com.epmet.feign.*; -import com.epmet.service.IcResiUserImportService; +import com.epmet.feign.EpmetMessageOpenFeignClient; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; -import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -62,11 +55,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.File; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * 用户基础信息 @@ -168,7 +159,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Fri, 5 Nov 2021 09:23:28 +0800 Subject: [PATCH 126/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E7=B1=BB=E5=88=AB?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/IcResiCategoryStatsConfigDTO.java | 116 ++++++++ .../dto/IcResiCategoryWarnConfigDTO.java | 111 ++++++++ .../IcResiCategoryStatsConfigFormDTO.java | 80 ++++++ .../IcResiCategoryStatsConfigSortFormDTO.java | 51 ++++ .../IcResiCategoryStatsConfigResultDTO.java | 88 ++++++ .../IcResiCategoryStatsConfigConstant.java | 26 ++ .../IcResiCategoryStatsConfigController.java | 94 +++++++ .../IcResiCategoryWarnConfigController.java | 94 +++++++ .../ResiCategoryStatsConfigController.java | 107 +++++++ .../dao/IcResiCategoryStatsConfigDao.java | 33 +++ .../dao/IcResiCategoryWarnConfigDao.java | 33 +++ .../IcResiCategoryStatsConfigEntity.java | 83 ++++++ .../IcResiCategoryWarnConfigEntity.java | 81 ++++++ .../excel/IcResiCategoryStatsConfigExcel.java | 83 ++++++ .../excel/IcResiCategoryWarnConfigExcel.java | 80 ++++++ .../redis/IcResiCategoryStatsConfigRedis.java | 47 ++++ .../redis/IcResiCategoryWarnConfigRedis.java | 47 ++++ .../IcResiCategoryStatsConfigService.java | 95 +++++++ .../IcResiCategoryWarnConfigService.java | 95 +++++++ .../ResiCategoryStatsConfigService.java | 48 ++++ .../IcResiCategoryStatsConfigServiceImpl.java | 104 +++++++ .../IcResiCategoryWarnConfigServiceImpl.java | 104 +++++++ .../ResiCategoryStatsConfigServiceImpl.java | 264 ++++++++++++++++++ .../mapper/IcResiCategoryStatsConfigDao.xml | 26 ++ .../mapper/IcResiCategoryWarnConfigDao.xml | 25 ++ 25 files changed, 2015 insertions(+) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryStatsConfigDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcResiCategoryStatsConfigResultDTO.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/constant/IcResiCategoryStatsConfigConstant.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryWarnConfigController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryWarnConfigDao.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryStatsConfigEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryStatsConfigExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryWarnConfigExcel.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryStatsConfigRedis.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryWarnConfigRedis.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryWarnConfigService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryWarnConfigServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml create mode 100644 epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryStatsConfigDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryStatsConfigDTO.java new file mode 100644 index 0000000000..1eb4516551 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryStatsConfigDTO.java @@ -0,0 +1,116 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryStatsConfigDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 项标签 + */ + private String label; + + /** + * 表名 + */ + private String tableName; + + /** + * 列名 + */ + private String columnName; + + /** + * 管理平台分类图标 + */ + private String managementIcon; + + /** + * 数据平台分类图标 + */ + private String dataIcon; + + /** + * 房屋显示分类图标 + */ + private String houseShowIcon; + + /** + * 状态 显示:show;隐藏:hidden + */ + private String status; + + /** + * 排序 + */ + private Integer sort; + + /** + * 删除标识:0.未删除 1.已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private String revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private String createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java new file mode 100644 index 0000000000..b4a2609d5e --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java @@ -0,0 +1,111 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryWarnConfigDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 项标签 + */ + private String label; + + /** + * 表名 + */ + private String tableName; + + /** + * 列名 + */ + private String columnName; + + /** + * 排序 + */ + private Integer sort; + + /** + * 等级1阈值 + */ + private Integer level1; + + /** + * 等级2阈值 + */ + private Integer level2; + + /** + * 等级3阈值 + */ + private Integer level3; + + /** + * 删除标识:0.未删除 1.已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private String revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private String createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java new file mode 100644 index 0000000000..cb9082c985 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java @@ -0,0 +1,80 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.UpdateGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryStatsConfigFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + public interface UpdateStatusGroup {} + public interface SelectGroup {} + + /** + * id + */ + @NotBlank(message = "配置项id不能为空",groups = {UpdateGroup.class,UpdateStatusGroup.class,SelectGroup.class}) + private String id; + + /** + * 管理平台分类图标 + */ + @NotBlank(message = "管理平台分类图标不能为空",groups = {UpdateGroup.class}) + private String managementIcon; + + /** + * 数据平台分类图标 + */ + @NotBlank(message = "管理平台分类图标不能为空",groups = {UpdateGroup.class}) + private String dataIcon; + + /** + * 房屋显示分类图标 + */ + @NotBlank(message = "管理平台分类图标不能为空",groups = {UpdateGroup.class}) + private String houseShowIcon; + + /** + * 状态 显示:show;隐藏:hidden + */ + @NotBlank(message = "状态不能为空",groups = {UpdateStatusGroup.class}) + private String status; + + @NotBlank(message = "是否预警",groups = {UpdateGroup.class}) + private String warn; + + private Integer level1; + + private Integer level2; + + private Integer level3; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java new file mode 100644 index 0000000000..b5e7347e4c --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java @@ -0,0 +1,51 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.UpdateGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryStatsConfigSortFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @NotBlank(message = "配置项id不能为空") + private String id; + + /** + * 排序 + */ + @NotBlank(message = "排序不能为空") + private Integer sort; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcResiCategoryStatsConfigResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcResiCategoryStatsConfigResultDTO.java new file mode 100644 index 0000000000..d9199b99cc --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/IcResiCategoryStatsConfigResultDTO.java @@ -0,0 +1,88 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryStatsConfigResultDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + + /** + * 项标签 + */ + private String label; + + + + /** + * 管理平台分类图标 + */ + private String managementIcon; + + /** + * 数据平台分类图标 + */ + private String dataIcon; + + /** + * 房屋显示分类图标 + */ + private String houseShowIcon; + + /** + * 状态 显示:show;隐藏:hidden + */ + private String status; + + /** + * 排序 + */ + private Integer sort; + + private String warn; + /** + * 等级1阈值 + */ + private Integer level1; + /** + * 等级2阈值 + */ + private Integer level2; + /** + * 等级3阈值 + */ + private Integer level3; +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/constant/IcResiCategoryStatsConfigConstant.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/constant/IcResiCategoryStatsConfigConstant.java new file mode 100644 index 0000000000..9919ca35f6 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/constant/IcResiCategoryStatsConfigConstant.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + *

+ * https://www.renren.io + *

+ * 版权所有,侵权必究! + */ + +package com.epmet.constant; + +/** + * 常量 + * @author sun + * @since 1.0.0 + */ +public interface IcResiCategoryStatsConfigConstant { + /** + * 是否需要预警 + */ + String WARN_YES = "1"; + String WARN_NO = "0"; + + String IC_RESI_USER = "ic_resi_user"; + + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java new file mode 100644 index 0000000000..f088a65265 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.excel.IcResiCategoryStatsConfigExcel; +import com.epmet.service.IcResiCategoryStatsConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@RestController +@RequestMapping("icresicategorystatsconfig") +public class IcResiCategoryStatsConfigController { + + @Autowired + private IcResiCategoryStatsConfigService icResiCategoryStatsConfigService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icResiCategoryStatsConfigService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcResiCategoryStatsConfigDTO data = icResiCategoryStatsConfigService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcResiCategoryStatsConfigDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icResiCategoryStatsConfigService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcResiCategoryStatsConfigDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icResiCategoryStatsConfigService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icResiCategoryStatsConfigService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icResiCategoryStatsConfigService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcResiCategoryStatsConfigExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryWarnConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryWarnConfigController.java new file mode 100644 index 0000000000..5e1ac6667b --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryWarnConfigController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; +import com.epmet.excel.IcResiCategoryWarnConfigExcel; +import com.epmet.service.IcResiCategoryWarnConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@RestController +@RequestMapping("icresicategorywarnconfig") +public class IcResiCategoryWarnConfigController { + + @Autowired + private IcResiCategoryWarnConfigService icResiCategoryWarnConfigService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icResiCategoryWarnConfigService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcResiCategoryWarnConfigDTO data = icResiCategoryWarnConfigService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcResiCategoryWarnConfigDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icResiCategoryWarnConfigService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcResiCategoryWarnConfigDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icResiCategoryWarnConfigService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icResiCategoryWarnConfigService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icResiCategoryWarnConfigService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcResiCategoryWarnConfigExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java new file mode 100644 index 0000000000..be1a538f1b --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -0,0 +1,107 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.ExcelUtils; +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.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; +import com.epmet.dto.form.UpGovRoleFormDTO; +import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; +import com.epmet.excel.IcResiCategoryStatsConfigExcel; +import com.epmet.service.IcResiCategoryStatsConfigService; +import com.epmet.service.ResiCategoryStatsConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@RestController +@RequestMapping("resicategorystatsconfig") +public class ResiCategoryStatsConfigController { + + @Autowired + private IcResiCategoryStatsConfigService icResiCategoryStatsConfigService; + @Autowired + private ResiCategoryStatsConfigService resiCategoryStatsConfigService; + + + /** + * 居民类别配置列表 + * @return + */ + @PostMapping("list") + public Result> list(@LoginUser TokenDto tokenDTO){ + String customerId = tokenDTO.getCustomerId(); +// String customerId = "123123"; + return new Result>().ok(resiCategoryStatsConfigService.list(customerId)); + } + + @PostMapping("update") + public Result update(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, UpdateGroup.class); + String customerId = tokenDTO.getCustomerId(); +// String customerId = "123123"; + resiCategoryStatsConfigService.update(customerId,formDTO); + return new Result(); + } + @PostMapping("updatestatus") + public Result updateStatus(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, IcResiCategoryStatsConfigFormDTO.UpdateStatusGroup.class); + String customerId = tokenDTO.getCustomerId(); +// String customerId = "123123"; + resiCategoryStatsConfigService.updateStatus(customerId,formDTO); + return new Result(); + } + @PostMapping("updatesort") + public Result updateSort(@LoginUser TokenDto tokenDTO,@RequestBody List formDTOs){ + for(IcResiCategoryStatsConfigSortFormDTO dto : formDTOs){ + ValidatorUtils.validateEntity(dto); + } + String customerId = tokenDTO.getCustomerId(); +// String customerId = "123123"; + resiCategoryStatsConfigService.updateSort(customerId,formDTOs); + return new Result(); + } + + @PostMapping("info") + public Result info(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, IcResiCategoryStatsConfigFormDTO.SelectGroup.class); + return new Result().ok(resiCategoryStatsConfigService.info(formDTO.getId())); + } + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java new file mode 100644 index 0000000000..bb55c52594 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcResiCategoryStatsConfigEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Mapper +public interface IcResiCategoryStatsConfigDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryWarnConfigDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryWarnConfigDao.java new file mode 100644 index 0000000000..d9a9e0a2b0 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryWarnConfigDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.IcResiCategoryWarnConfigEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Mapper +public interface IcResiCategoryWarnConfigDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryStatsConfigEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryStatsConfigEntity.java new file mode 100644 index 0000000000..d0201db93d --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryStatsConfigEntity.java @@ -0,0 +1,83 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_resi_category_stats_config") +public class IcResiCategoryStatsConfigEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 项标签 + */ + private String label; + + /** + * 表名 + */ + private String tableName; + + /** + * 列名 + */ + private String columnName; + + /** + * 管理平台分类图标 + */ + private String managementIcon; + + /** + * 数据平台分类图标 + */ + private String dataIcon; + + /** + * 房屋显示分类图标 + */ + private String houseShowIcon; + + /** + * 状态 显示:show;隐藏:hidden + */ + private String status; + + /** + * 排序 + */ + private Integer sort; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java new file mode 100644 index 0000000000..a15c0c7958 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-11-04 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_resi_category_warn_config") +public class IcResiCategoryWarnConfigEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 项标签 + */ + private String label; + + /** + * 表名 + */ + private String tableName; + + /** + * 列名 + */ + private String columnName; + + /** + * 排序 + */ + private Integer sort; + + /** + * 等级1阈值 + */ + private Integer level1; + + /** + * 等级2阈值 + */ + private Integer level2; + + /** + * 等级3阈值 + */ + private Integer level3; + +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryStatsConfigExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryStatsConfigExcel.java new file mode 100644 index 0000000000..1e8f335885 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryStatsConfigExcel.java @@ -0,0 +1,83 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryStatsConfigExcel { + + @Excel(name = "id") + private String id; + + @Excel(name = "客户id") + private String customerId; + + @Excel(name = "项标签") + private String label; + + @Excel(name = "表名") + private String tableName; + + @Excel(name = "列名") + private String columnName; + + @Excel(name = "管理平台分类图标") + private String managementIcon; + + @Excel(name = "数据平台分类图标") + private String dataIcon; + + @Excel(name = "房屋显示分类图标") + private String houseShowIcon; + + @Excel(name = "状态 显示:show;隐藏:hidden") + private String status; + + @Excel(name = "排序") + private Integer sort; + + @Excel(name = "删除标识:0.未删除 1.已删除") + private String delFlag; + + @Excel(name = "乐观锁") + private String revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private String createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryWarnConfigExcel.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryWarnConfigExcel.java new file mode 100644 index 0000000000..d9d5edf543 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/excel/IcResiCategoryWarnConfigExcel.java @@ -0,0 +1,80 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcResiCategoryWarnConfigExcel { + + @Excel(name = "id") + private String id; + + @Excel(name = "客户id") + private String customerId; + + @Excel(name = "项标签") + private String label; + + @Excel(name = "表名") + private String tableName; + + @Excel(name = "列名") + private String columnName; + + @Excel(name = "排序") + private Integer sort; + + @Excel(name = "等级1阈值") + private Integer level1; + + @Excel(name = "等级2阈值") + private Integer level2; + + @Excel(name = "等级3阈值") + private Integer level3; + + @Excel(name = "删除标识:0.未删除 1.已删除") + private String delFlag; + + @Excel(name = "乐观锁") + private String revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private String createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryStatsConfigRedis.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryStatsConfigRedis.java new file mode 100644 index 0000000000..789965c0c9 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryStatsConfigRedis.java @@ -0,0 +1,47 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.redis; + +import com.epmet.commons.tools.redis.RedisUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Component +public class IcResiCategoryStatsConfigRedis { + @Autowired + private RedisUtils redisUtils; + + public void delete(Object[] ids) { + + } + + public void set(){ + + } + + public String get(String id){ + return null; + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryWarnConfigRedis.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryWarnConfigRedis.java new file mode 100644 index 0000000000..eee6ae7fc6 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/IcResiCategoryWarnConfigRedis.java @@ -0,0 +1,47 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.redis; + +import com.epmet.commons.tools.redis.RedisUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Component +public class IcResiCategoryWarnConfigRedis { + @Autowired + private RedisUtils redisUtils; + + public void delete(Object[] ids) { + + } + + public void set(){ + + } + + public String get(String id){ + return null; + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java new file mode 100644 index 0000000000..b7c5938162 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.entity.IcResiCategoryStatsConfigEntity; + +import java.util.List; +import java.util.Map; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +public interface IcResiCategoryStatsConfigService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-11-04 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-11-04 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcResiCategoryStatsConfigDTO + * @author generator + * @date 2021-11-04 + */ + IcResiCategoryStatsConfigDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-11-04 + */ + void save(IcResiCategoryStatsConfigDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-11-04 + */ + void update(IcResiCategoryStatsConfigDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-11-04 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryWarnConfigService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryWarnConfigService.java new file mode 100644 index 0000000000..bef9c7360f --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryWarnConfigService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; +import com.epmet.entity.IcResiCategoryWarnConfigEntity; + +import java.util.List; +import java.util.Map; + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +public interface IcResiCategoryWarnConfigService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-11-04 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-11-04 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcResiCategoryWarnConfigDTO + * @author generator + * @date 2021-11-04 + */ + IcResiCategoryWarnConfigDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-11-04 + */ + void save(IcResiCategoryWarnConfigDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-11-04 + */ + void update(IcResiCategoryWarnConfigDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-11-04 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java new file mode 100644 index 0000000000..9f351d91b4 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java @@ -0,0 +1,48 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; +import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; +import com.epmet.entity.IcResiCategoryStatsConfigEntity; + +import java.util.List; +import java.util.Map; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +public interface ResiCategoryStatsConfigService { + + List list(String customerId); + + IcResiCategoryStatsConfigResultDTO info(String id); + + void update(String customerId,IcResiCategoryStatsConfigFormDTO formDTO); + + void updateStatus(String customerId,IcResiCategoryStatsConfigFormDTO formDTO); + + void updateSort(String customerId,List formDTOs); +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java new file mode 100644 index 0000000000..368ecec876 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java @@ -0,0 +1,104 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcResiCategoryStatsConfigDao; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.entity.IcResiCategoryStatsConfigEntity; +import com.epmet.redis.IcResiCategoryStatsConfigRedis; +import com.epmet.service.IcResiCategoryStatsConfigService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Service +public class IcResiCategoryStatsConfigServiceImpl extends BaseServiceImpl implements IcResiCategoryStatsConfigService { + + @Autowired + private IcResiCategoryStatsConfigRedis icResiCategoryStatsConfigRedis; + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcResiCategoryStatsConfigDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcResiCategoryStatsConfigDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcResiCategoryStatsConfigDTO get(String id) { + IcResiCategoryStatsConfigEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcResiCategoryStatsConfigDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcResiCategoryStatsConfigDTO dto) { + IcResiCategoryStatsConfigEntity entity = ConvertUtils.sourceToTarget(dto, IcResiCategoryStatsConfigEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcResiCategoryStatsConfigDTO dto) { + IcResiCategoryStatsConfigEntity entity = ConvertUtils.sourceToTarget(dto, IcResiCategoryStatsConfigEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryWarnConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryWarnConfigServiceImpl.java new file mode 100644 index 0000000000..3235b04f0d --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryWarnConfigServiceImpl.java @@ -0,0 +1,104 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcResiCategoryWarnConfigDao; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; +import com.epmet.entity.IcResiCategoryWarnConfigEntity; +import com.epmet.redis.IcResiCategoryWarnConfigRedis; +import com.epmet.service.IcResiCategoryWarnConfigService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 居民类别预警配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Service +public class IcResiCategoryWarnConfigServiceImpl extends BaseServiceImpl implements IcResiCategoryWarnConfigService { + + @Autowired + private IcResiCategoryWarnConfigRedis icResiCategoryWarnConfigRedis; + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcResiCategoryWarnConfigDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcResiCategoryWarnConfigDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcResiCategoryWarnConfigDTO get(String id) { + IcResiCategoryWarnConfigEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcResiCategoryWarnConfigDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcResiCategoryWarnConfigDTO dto) { + IcResiCategoryWarnConfigEntity entity = ConvertUtils.sourceToTarget(dto, IcResiCategoryWarnConfigEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcResiCategoryWarnConfigDTO dto) { + IcResiCategoryWarnConfigEntity entity = ConvertUtils.sourceToTarget(dto, IcResiCategoryWarnConfigEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java new file mode 100644 index 0000000000..c5003a5d78 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -0,0 +1,264 @@ +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.epmet.constant.IcResiCategoryStatsConfigConstant; +import com.epmet.dao.IcFormItemDao; +import com.epmet.dao.IcFormItemGroupDao; +import com.epmet.dao.IcResiCategoryStatsConfigDao; +import com.epmet.dao.IcResiCategoryWarnConfigDao; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; +import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; +import com.epmet.entity.IcFormItemEntity; +import com.epmet.entity.IcFormItemGroupEntity; +import com.epmet.entity.IcResiCategoryStatsConfigEntity; +import com.epmet.entity.IcResiCategoryWarnConfigEntity; +import com.epmet.service.IcResiCategoryStatsConfigService; +import com.epmet.service.IcResiCategoryWarnConfigService; +import com.epmet.service.ResiCategoryStatsConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConfigService { + @Autowired + private IcResiCategoryStatsConfigService icResiCategoryStatsConfigService; + + @Resource + private IcFormItemDao icFormItemDao; + @Resource + private IcFormItemGroupDao icFormItemGroupDao; + @Resource + private IcResiCategoryStatsConfigDao icResiCategoryStatsConfigDao; + @Resource + private IcResiCategoryWarnConfigDao icResiCategoryWarnConfigDao; + @Autowired + private IcResiCategoryWarnConfigService icResiCategoryWarnConfigService; + + @Override + @Transactional(rollbackFor = Exception.class) + public List list(String customerId) { + //1.获取IC_FORM_ITEM 中 用于数据分析字段的 id 和label + List icFormItemEntityList = icFormItemDao.selectList(new QueryWrapper().lambda().eq(IcFormItemEntity::getDataAnalyse, 1)); + if(CollectionUtils.isEmpty(icFormItemEntityList)){ + return new ArrayList<>(); + } + Set groupIds = icFormItemEntityList.stream().filter(item-> !"0".equals(item.getItemGroupId())).map(item->item.getItemGroupId()).collect(Collectors.toSet()); + List icFormItemGroupEntityList = icFormItemGroupDao.selectList(new QueryWrapper().lambda().in(IcFormItemGroupEntity::getId, groupIds)); + //获取tableName和COLUMN_NAME + Map tableColumnMap = new HashMap<>(); + Map idTableMap = new HashMap<>(); + icFormItemEntityList.forEach(item->{ + Map map = new HashMap<>(); + if("0".equals(item.getItemGroupId())){ + tableColumnMap.put(IcResiCategoryStatsConfigConstant.IC_RESI_USER+"-"+item.getColumnName(),item); + idTableMap.put(item.getId(),IcResiCategoryStatsConfigConstant.IC_RESI_USER); + }else{ + List collect = icFormItemGroupEntityList.stream().filter(i -> item.getItemGroupId().equals(i.getId())).collect(Collectors.toList()); + tableColumnMap.put(CollectionUtils.isEmpty(collect)?IcResiCategoryStatsConfigConstant.IC_RESI_USER:collect.get(0).getTableName()+"-"+item.getColumnName(),item); + idTableMap.put(item.getId(),CollectionUtils.isEmpty(collect)?IcResiCategoryStatsConfigConstant.IC_RESI_USER:collect.get(0).getTableName()); + } + + }); + + //2.获取ic_resi_category_stats_config 和 ic_resi_category_warn_config 表中的数据 + List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(null); + List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(null); + //3.新增不存在的,删除不在tableColumnMap的 + + Map statsTableColumnMap = new HashMap<>(); + statsConfigEntityList.stream().forEach(item->{ + statsTableColumnMap.put(item.getTableName()+"-"+item.getColumnName(),item); + }); + Map warnTableColumnMap = new HashMap<>(); + warnConfigEntityList.stream().forEach(item->{ + warnTableColumnMap.put(item.getTableName()+"-"+item.getColumnName(),item); + }); + //差集 + //新增 + List newStatsList = tableColumnMap.keySet().stream().filter(item -> !statsTableColumnMap.keySet().contains(item)).collect(Collectors.toList()); + + List newStatsEntityList = new ArrayList<>(); + newStatsList.forEach(item->{ + IcFormItemEntity icFormItemEntity = tableColumnMap.get(item); + IcResiCategoryStatsConfigEntity entity = new IcResiCategoryStatsConfigEntity(); + entity.setCustomerId(customerId); + entity.setLabel(icFormItemEntity.getLabel()); + entity.setTableName(idTableMap.get(icFormItemEntity.getId())); + entity.setColumnName(icFormItemEntity.getColumnName()); + entity.setManagementIcon(""); + entity.setDataIcon(""); + entity.setHouseShowIcon(""); + entity.setStatus("show"); + entity.setSort(0); + newStatsEntityList.add(entity); + }); + if(!CollectionUtils.isEmpty(newStatsEntityList)){ + icResiCategoryStatsConfigService.insertBatch(newStatsEntityList); + } + + List delStatsEntityIdList = new ArrayList<>(); + List delWarnEntityIdList = new ArrayList<>(); + //需要删除的 + List delStatsList = statsTableColumnMap.keySet().stream().filter(item -> !tableColumnMap.keySet().contains(item)).collect(Collectors.toList()); + List delWarnList = warnTableColumnMap.keySet().stream().filter(item -> !tableColumnMap.keySet().contains(item)).collect(Collectors.toList()); + delStatsList.forEach(item->{ + delStatsEntityIdList.add(statsTableColumnMap.get(item).getId()); + }); + delWarnList.forEach(item->{ + delWarnEntityIdList.add(warnTableColumnMap.get(item).getId()); + }); + if(!CollectionUtils.isEmpty(delStatsEntityIdList)){ + icResiCategoryStatsConfigService.deleteBatchIds(delStatsEntityIdList); + } + if(!CollectionUtils.isEmpty(delWarnEntityIdList)){ + icResiCategoryWarnConfigService.deleteBatchIds(delWarnEntityIdList); + } + + //4.返回数据 + List statsConfigList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper().lambda().orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); + List warnConfigList = icResiCategoryWarnConfigDao.selectList(null); + Map warnMap =new HashMap<>(); + warnConfigList.forEach(item->{ + warnMap.put(item.getTableName()+"-"+item.getColumnName(),item); + }); + List result = new ArrayList<>(); + statsConfigList.forEach(item->{ + IcResiCategoryStatsConfigResultDTO icResiCategoryStatsConfigResultDTO = new IcResiCategoryStatsConfigResultDTO(); + icResiCategoryStatsConfigResultDTO.setId(item.getId()); + icResiCategoryStatsConfigResultDTO.setLabel(item.getLabel()); + icResiCategoryStatsConfigResultDTO.setManagementIcon(item.getManagementIcon()); + icResiCategoryStatsConfigResultDTO.setDataIcon(item.getDataIcon()); + icResiCategoryStatsConfigResultDTO.setHouseShowIcon(item.getHouseShowIcon()); + icResiCategoryStatsConfigResultDTO.setStatus(item.getStatus()); + icResiCategoryStatsConfigResultDTO.setSort(item.getSort()); + IcResiCategoryWarnConfigEntity warnConfigEntity = warnMap.get(item.getTableName() + "-" + item.getColumnName()); + if(warnConfigEntity==null){ + icResiCategoryStatsConfigResultDTO.setWarn(IcResiCategoryStatsConfigConstant.WARN_NO); + }else{ + icResiCategoryStatsConfigResultDTO.setWarn(IcResiCategoryStatsConfigConstant.WARN_YES); + icResiCategoryStatsConfigResultDTO.setLevel1(warnConfigEntity.getLevel1()); + icResiCategoryStatsConfigResultDTO.setLevel2(warnConfigEntity.getLevel2()); + icResiCategoryStatsConfigResultDTO.setLevel3(warnConfigEntity.getLevel3()); + } + result.add(icResiCategoryStatsConfigResultDTO); + + }); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public IcResiCategoryStatsConfigResultDTO info(String id) { + IcResiCategoryStatsConfigResultDTO result =new IcResiCategoryStatsConfigResultDTO(); + IcResiCategoryStatsConfigDTO icResiCategoryStatsConfigDTO = icResiCategoryStatsConfigService.get(id); + if(null == icResiCategoryStatsConfigDTO){ + return result; + } + IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) + .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); + +// IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = Optional.ofNullable(entity).orElse(new IcResiCategoryWarnConfigEntity()); + result.setId(icResiCategoryStatsConfigDTO.getId()); + result.setLabel(icResiCategoryStatsConfigDTO.getLabel()); + result.setManagementIcon(icResiCategoryStatsConfigDTO.getManagementIcon()); + result.setDataIcon(icResiCategoryStatsConfigDTO.getDataIcon()); + result.setHouseShowIcon(icResiCategoryStatsConfigDTO.getHouseShowIcon()); + result.setStatus(icResiCategoryStatsConfigDTO.getStatus()); + result.setSort(icResiCategoryStatsConfigDTO.getSort()); + result.setWarn(null==icResiCategoryWarnConfigEntity?IcResiCategoryStatsConfigConstant.WARN_NO:IcResiCategoryStatsConfigConstant.WARN_YES); + if(null!=icResiCategoryWarnConfigEntity){ + result.setLevel1(icResiCategoryWarnConfigEntity.getLevel1()); + result.setLevel2(icResiCategoryWarnConfigEntity.getLevel2()); + result.setLevel3(icResiCategoryWarnConfigEntity.getLevel3()); + } + return result; + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(String customerId,IcResiCategoryStatsConfigFormDTO formDTO) { + IcResiCategoryStatsConfigDTO icResiCategoryStatsConfigDTO = icResiCategoryStatsConfigService.get(formDTO.getId()); + if(null == icResiCategoryStatsConfigDTO){ + return ; + } + //更新配置类别 + IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); + BeanUtils.copyProperties(formDTO,icResiCategoryStatsConfigEntity); + icResiCategoryStatsConfigEntity.setCustomerId(customerId); + icResiCategoryStatsConfigDao.updateById(icResiCategoryStatsConfigEntity); + + //更新配置预警 + if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ + //更新 + IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) + .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); + if(null == icResiCategoryWarnConfigEntity){ + icResiCategoryWarnConfigEntity = new IcResiCategoryWarnConfigEntity(); + icResiCategoryWarnConfigEntity.setCustomerId(customerId); + icResiCategoryWarnConfigEntity.setLabel(icResiCategoryStatsConfigDTO.getLabel()); + icResiCategoryWarnConfigEntity.setTableName(icResiCategoryStatsConfigDTO.getTableName()); + icResiCategoryWarnConfigEntity.setColumnName(icResiCategoryStatsConfigDTO.getColumnName()); + icResiCategoryWarnConfigEntity.setLevel1(formDTO.getLevel1()); + icResiCategoryWarnConfigEntity.setLevel2(formDTO.getLevel2()); + icResiCategoryWarnConfigEntity.setLevel3(formDTO.getLevel3()); + icResiCategoryWarnConfigEntity.setSort(icResiCategoryStatsConfigDTO.getSort()); + icResiCategoryWarnConfigDao.insert(icResiCategoryWarnConfigEntity); + }else{ + icResiCategoryWarnConfigEntity.setCustomerId(customerId); + icResiCategoryWarnConfigEntity.setLabel(icResiCategoryStatsConfigDTO.getLabel()); + icResiCategoryWarnConfigEntity.setTableName(icResiCategoryStatsConfigDTO.getTableName()); + icResiCategoryWarnConfigEntity.setColumnName(icResiCategoryStatsConfigDTO.getColumnName()); + icResiCategoryWarnConfigEntity.setLevel1(formDTO.getLevel1()); + icResiCategoryWarnConfigEntity.setLevel2(formDTO.getLevel2()); + icResiCategoryWarnConfigEntity.setLevel3(formDTO.getLevel3()); + icResiCategoryWarnConfigEntity.setSort(icResiCategoryStatsConfigDTO.getSort()); + icResiCategoryWarnConfigDao.updateById(icResiCategoryWarnConfigEntity); + } + }else if(IcResiCategoryStatsConfigConstant.WARN_NO.equals(formDTO.getWarn())){ + //删除 + icResiCategoryWarnConfigDao.delete(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getTableName,icResiCategoryStatsConfigDTO.getTableName()) + .eq(IcResiCategoryWarnConfigEntity::getColumnName,icResiCategoryStatsConfigDTO.getColumnName())); + } + + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStatus(String customerId,IcResiCategoryStatsConfigFormDTO formDTO) { + //更新配置类别 + IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); + BeanUtils.copyProperties(formDTO,icResiCategoryStatsConfigEntity); + icResiCategoryStatsConfigEntity.setCustomerId(customerId); + icResiCategoryStatsConfigDao.updateById(icResiCategoryStatsConfigEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSort(String customerId,List formDTOs) { + List entityList = new ArrayList<>(); + for (IcResiCategoryStatsConfigSortFormDTO formDTO : formDTOs) { + IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); + icResiCategoryStatsConfigEntity.setId(formDTO.getId()); + icResiCategoryStatsConfigEntity.setCustomerId(customerId); + icResiCategoryStatsConfigEntity.setSort(formDTO.getSort()); + entityList.add(icResiCategoryStatsConfigEntity); + } + icResiCategoryStatsConfigService.updateBatchById(entityList); + } +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml new file mode 100644 index 0000000000..5fb6f245b4 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml new file mode 100644 index 0000000000..419adda97c --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3d71a6f0337539150e988c688b6469914b5f52aa Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 5 Nov 2021 11:14:25 +0800 Subject: [PATCH 127/253] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF-?= =?UTF-8?q?=E5=AE=B6=E5=BA=AD=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/enums/RelationshipEnum.java | 58 +++++++++++++++++++ .../epmet/feign/GovOrgOpenFeignClient.java | 3 + .../GovOrgOpenFeignClientFallback.java | 5 ++ .../dto/result/OwnerRelationResultDTO.java | 29 ++++++++++ .../controller/IcResiUserController.java | 13 ++++- .../com/epmet/service/IcResiUserService.java | 13 +++-- .../service/impl/IcResiUserServiceImpl.java | 42 ++++++++++++++ 7 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/RelationshipEnum.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/OwnerRelationResultDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/RelationshipEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/RelationshipEnum.java new file mode 100644 index 0000000000..39a0f81550 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/RelationshipEnum.java @@ -0,0 +1,58 @@ +package com.epmet.commons.tools.enums; + +/** + * @author Administrator + */ + +public enum RelationshipEnum { + /** + * 环境变量枚举 + */ + UN_KNOWN("0", "暂不清楚", 0), + SELF("1", "本人", 1), + spouse("2", "配偶", 2), + CHILD("3", "子女", 3), + PARENT("4", "父母", 4), + PARENT_IN_LAW("5", "岳父母或公婆", 5), + GRANDPARENT_IN_LAW("6", "祖父母", 6), + CHILD_IN_LAW("7", "媳婿", 7), + GRANDCHILD("8", "孙子女", 8), + BROTHER_AND_SISTER("9", "兄弟姐妹", 9), + OTHER("10", "其他", 10), + ; + + private final String code; + private final String name; + private final Integer sort; + + + + RelationshipEnum(String code, String name, Integer sort) { + this.code = code; + this.name = name; + this.sort = sort; + } + + public static RelationshipEnum getEnum(String code) { + RelationshipEnum[] values = RelationshipEnum.values(); + for (RelationshipEnum value : values) { + if (value.getCode().equals(code)) { + return value; + } + } + return RelationshipEnum.UN_KNOWN; + } + + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public Integer getSort(){ + return sort; + } +} \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index 4784584218..5b18f345d2 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -516,4 +516,7 @@ public interface GovOrgOpenFeignClient { */ @PostMapping("/gov/org/ichouse/selecthouseinfobyidcard") Result> selectHouseInfoByIdCard(@RequestParam("idCard")String idCard); + + @GetMapping("/gov/org/ichouse/{id}") + Result get(@PathVariable("id") String id); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 95219d6b1b..c6e0f96aa4 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -310,6 +310,11 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectHouseInfoByIdCard", idCard); } + @Override + public Result get(String id) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "get", id); + } + @Override public Result selectPidsByGridId(String gridId) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectPidsByGridId", gridId); diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/OwnerRelationResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/OwnerRelationResultDTO.java new file mode 100644 index 0000000000..9a3e0c23d7 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/OwnerRelationResultDTO.java @@ -0,0 +1,29 @@ +package com.epmet.dto.result; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author zhaoqifeng + * @DateTime 2020/11/18 下午1:47 + */ +@NoArgsConstructor +@Data +public class OwnerRelationResultDTO implements Serializable { + + private static final long serialVersionUID = 2876258704168954941L; + private String ownerName; + private List userList; + + @NoArgsConstructor + @Data + public static class UserListBean { + private String userId; + private String userName; + private String isSelf; + private String relation; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index f525d82218..7030248522 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -31,7 +31,6 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; -import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; @@ -272,4 +271,16 @@ public class IcResiUserController { return resultForm.getData(); } + /** + * @Description 个人信息-家庭关系 + * @Param formDTO + * @Return {@link Result< OwnerRelationResultDTO>} + * @Author zhaoqifeng + * @Date 2021/11/5 11:13 + */ + @PostMapping("ownerrelation") + public Result getOwnerRelation(@RequestBody PersonDataFormDTO formDTO) { + return new Result().ok(icResiUserService.getOwnerRelation(formDTO.getUserId())); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 2e9e5cf70d..ea67a9b872 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -21,10 +21,7 @@ import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.form.*; -import com.epmet.dto.result.FormItem; -import com.epmet.dto.result.HomeUserResultDTO; -import com.epmet.dto.result.PersonDataResultDTO; -import com.epmet.dto.result.SearchByNameResultDTO; +import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; import java.util.List; @@ -107,4 +104,12 @@ public interface IcResiUserService extends BaseService { */ Map> getDataForExport(Map itemList, String customerId, String formCode, String baseTableName, List conditions); + /** + * @Description 家庭关系 + * @Param userId + * @Return {@link OwnerRelationResultDTO} + * @Author zhaoqifeng + * @Date 2021/11/5 10:28 + */ + OwnerRelationResultDTO getOwnerRelation(String userId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index b353507792..33db29fba4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -28,6 +28,7 @@ import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; +import com.epmet.commons.tools.enums.RelationshipEnum; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; @@ -39,6 +40,7 @@ import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.CustomerGridDTO; +import com.epmet.dto.IcHouseDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; @@ -603,4 +605,44 @@ public class IcResiUserServiceImpl extends BaseServiceImpl houseResult = govOrgOpenFeignClient.get(user.getHomeId()); + if (!houseResult.success()) { + throw new RenException(houseResult.getCode(),houseResult.getMsg()); + } + result.setOwnerName(houseResult.getData().getOwnerName()); + + //获取用户所在家庭里所有人员信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcResiUserEntity::getHomeId, user.getHomeId()); + wrapper.orderByAsc(IcResiUserEntity::getYhzgx); + List resiUserList = baseDao.selectList(wrapper); + List userList = resiUserList.stream().map(item -> { + OwnerRelationResultDTO.UserListBean bean = new OwnerRelationResultDTO.UserListBean(); + bean.setUserId(item.getId()); + bean.setUserName(item.getName()); + bean.setRelation(RelationshipEnum.getEnum(item.getYhzgx()).getName()); + if (userId.equals(item.getId())) { + bean.setIsSelf(NumConstant.ONE_STR); + } + return bean; + }).collect(Collectors.toList()); + result.setUserList(userList); + return result; + } } From 5ea973af033b0d368a48baeecae8091d574d227a Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 5 Nov 2021 11:22:04 +0800 Subject: [PATCH 128/253] =?UTF-8?q?getcustomerform=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 8 +++++-- .../com/epmet/redis/CustomerFootBarRedis.java | 24 +++++++++++++++---- .../epmet/service/impl/IcFormServiceImpl.java | 4 ++-- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 9b7a7afccb..62557e2892 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -586,7 +586,11 @@ public class RedisKeys { * @param customerId * @return */ - public static String getIcFormKey(String formCode,String customerId) { - return rootPrefix.concat("icform:").concat(formCode).concat(":").concat(customerId); + public static String getIcFormKeyForAdd(String formCode,String customerId) { + return rootPrefix.concat("icform:").concat(formCode).concat(":add:").concat(customerId); + } + + public static String getIcFormKeyForExport(String formCode,String customerId) { + return rootPrefix.concat("icform:").concat(formCode).concat(":export:").concat(customerId); } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java index 8cded15b44..0c549999ed 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/redis/CustomerFootBarRedis.java @@ -51,18 +51,32 @@ public class CustomerFootBarRedis { } public void deleteIcForm(String formCode,String customerId) { - String key = RedisKeys.getIcFormKey(formCode,customerId); + String key = RedisKeys.getIcFormKeyForAdd(formCode,customerId); redisUtils.delete(key); } - public void setCustomerFormResultDTO(String formCode,String customerId, CustomerFormResultDTO value){ - String key = RedisKeys.getIcFormKey(formCode,customerId); + public void setCustomerFormResultDTO(String formCode,String customerId, CustomerFormResultDTO value,Boolean dynamic){ + String key=""; + if (null != dynamic && dynamic) { + //新增表单 + key = RedisKeys.getIcFormKeyForAdd(formCode,customerId); + }else{ + //导出 + key = RedisKeys.getIcFormKeyForExport(formCode,customerId); + } Map map = BeanUtil.beanToMap(value, false, true); redisUtils.hMSet(key, map); } - public CustomerFormResultDTO getCustomerFormResultDTO(String formCode,String customerId){ - String key = RedisKeys.getIcFormKey(formCode,customerId); + public CustomerFormResultDTO getCustomerFormResultDTO(String formCode,String customerId,Boolean dynamic){ + String key=""; + if (null != dynamic && dynamic) { + //新增表单 + key = RedisKeys.getIcFormKeyForAdd(formCode,customerId); + }else{ + //导出 + key = RedisKeys.getIcFormKeyForExport(formCode,customerId); + } Map resultMap = redisUtils.hGetAll(key); if (CollectionUtils.isEmpty(resultMap)) { return null; diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index 23088c3024..06da023015 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -116,7 +116,7 @@ public class IcFormServiceImpl extends BaseServiceImpl */ @Override public CustomerFormResultDTO getCustomerForm(CustomerFormQueryDTO formDto) { - CustomerFormResultDTO customerFormResultDTO = customerFootBarRedis.getCustomerFormResultDTO(formDto.getFormCode(), formDto.getCustomerId()); + CustomerFormResultDTO customerFormResultDTO = customerFootBarRedis.getCustomerFormResultDTO(formDto.getFormCode(), formDto.getCustomerId(),formDto.getDynamic()); if (null != customerFormResultDTO) { return customerFormResultDTO; } @@ -128,7 +128,7 @@ public class IcFormServiceImpl extends BaseServiceImpl List groupList=baseDao.selectListGroup(resultDTO.getFormId()); resultDTO.setItemList(itemList); resultDTO.setGroupList(groupList); - customerFootBarRedis.setCustomerFormResultDTO(formDto.getFormCode(),formDto.getCustomerId(),resultDTO); + customerFootBarRedis.setCustomerFormResultDTO(formDto.getFormCode(),formDto.getCustomerId(),resultDTO,formDto.getDynamic()); return resultDTO; } From f83ee0bb4615747b95687ee62512f6bac7f6f8e3 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 5 Nov 2021 13:31:02 +0800 Subject: [PATCH 129/253] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E8=A2=AB=E5=88=A0=EF=BC=8C=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/IcResiUserController.java | 9 +++++++++ .../java/com/epmet/service/IcResiUserService.java | 8 ++++++++ .../epmet/service/impl/IcResiUserServiceImpl.java | 13 +++++++++++++ 3 files changed, 30 insertions(+) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 7030248522..dd62a9fd02 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -69,6 +69,15 @@ public class IcResiUserController { @Autowired private IcResiUserImportService icResiUserImportService; + @PostMapping("delete") + public Result delete(@LoginUser TokenDto tokenDto,@RequestBody DelIcResiUserFormDTO formDTO){ + formDTO.setCustomerId(tokenDto.getCustomerId()); + ValidatorUtils.validateEntity(formDTO,DelIcResiUserFormDTO.IdGroup.class); + icResiUserService.delete(formDTO); + return new Result(); + } + + /** * @Author sun * @Description 党建互联平台--保存居民信息 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index ea67a9b872..db49d560d5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -34,6 +34,14 @@ import java.util.Map; * @since v1.0.0 2021-10-26 */ public interface IcResiUserService extends BaseService { + /** + * 单个删除 + * + * @return void + * @author generator + * @date 2021-10-26 + */ + void delete(DelIcResiUserFormDTO formDTO); /** * @Author sun diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 33db29fba4..edec6e3d51 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -90,6 +90,19 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> subTableRes = operCustomizeOpenFeignClient.queryIcResiSubTables(queryDTO); + if (subTableRes.success() && !CollectionUtils.isEmpty(subTableRes.getData())) { + for (String subTalbeName : subTableRes.getData()) { + baseDao.updateSubTableToDel(subTalbeName, formDTO.getIcResiUserId()); + } + } + } + /** * @Author sun * @Description 党建互联平台--保存居民信息 From d9a23bc20520f1308bf5ae6a9e4441d1b54787f2 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 5 Nov 2021 16:34:32 +0800 Subject: [PATCH 130/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E5=AE=B6=E5=BA=AD=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=88=BF=E5=B1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/result/HouseListResultDTO.java | 30 ++++++++ epmet-module/gov-org/gov-org-server/pom.xml | 6 ++ .../epmet/controller/IcHouseController.java | 15 ++++ .../com/epmet/service/IcHouseService.java | 12 +++ .../service/impl/IcHouseServiceImpl.java | 77 +++++++++++++++++++ .../feign/OperCustomizeOpenFeignClient.java | 4 + .../OperCustomizeOpenFeignClientFallback.java | 6 ++ .../IcResiCategoryStatsConfigController.java | 5 ++ .../IcResiCategoryStatsConfigService.java | 9 +++ .../IcResiCategoryStatsConfigServiceImpl.java | 24 +++++- .../epmet/feign/EpmetUserOpenFeignClient.java | 3 + .../EpmetUserOpenFeignClientFallback.java | 5 ++ .../controller/IcResiUserController.java | 16 +++- .../java/com/epmet/dao/IcResiUserDao.java | 5 +- .../com/epmet/service/IcResiUserService.java | 9 +++ .../service/impl/IcResiUserServiceImpl.java | 13 ++++ .../main/resources/mapper/IcResiUserDao.xml | 26 +++++++ 17 files changed, 261 insertions(+), 4 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseListResultDTO.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseListResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseListResultDTO.java new file mode 100644 index 0000000000..a63f415e94 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/HouseListResultDTO.java @@ -0,0 +1,30 @@ +package com.epmet.dto.result; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/11/5 15:59 + */ +@NoArgsConstructor +@Data +public class HouseListResultDTO implements Serializable { + + private static final long serialVersionUID = 2063032844842070847L; + private String houseId; + private String houseName; + private List categoryList; + + @NoArgsConstructor + @Data + public static class CategoryListBean { + private String name; + private String iconUrl; + private String isSpecial; + } +} diff --git a/epmet-module/gov-org/gov-org-server/pom.xml b/epmet-module/gov-org/gov-org-server/pom.xml index ccbc334ede..5b9c7fbf37 100644 --- a/epmet-module/gov-org/gov-org-server/pom.xml +++ b/epmet-module/gov-org/gov-org-server/pom.xml @@ -113,6 +113,12 @@ 2.0.0 compile + + com.epmet + oper-customize-client + 2.0.0 + compile + diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java index 4092579603..2409edaad0 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcHouseController.java @@ -17,8 +17,10 @@ package com.epmet.controller; +import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.dto.result.OptionResultDTO; 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; @@ -27,6 +29,7 @@ import com.epmet.commons.tools.validator.group.DefaultGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.IcHouseDTO; import com.epmet.dto.form.HouseFormDTO; +import com.epmet.dto.result.HouseListResultDTO; import com.epmet.service.IcHouseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -99,4 +102,16 @@ public class IcHouseController { return new Result>().ok(icHouseService.selectHouseInfoByIdCard(idCard)); } + /** + * @Description 房屋查询 + * @Param formDTO + * @Return {@link Result< List< HouseListResultDTO>>} + * @Author zhaoqifeng + * @Date 2021/11/5 16:01 + */ + @PostMapping("houselist") + public Result> getHouseList(@LoginUser TokenDto tokenDto, @RequestBody HouseFormDTO formDTO){ + return new Result>().ok(icHouseService.getHouseList(tokenDto, formDTO)); + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java index 2f434ab350..66f02d80fa 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcHouseService.java @@ -20,8 +20,10 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.IcHouseDTO; import com.epmet.dto.form.HouseFormDTO; +import com.epmet.dto.result.HouseListResultDTO; import com.epmet.entity.IcHouseEntity; import java.util.List; @@ -112,4 +114,14 @@ public interface IcHouseService extends BaseService { */ List selectHouseInfoByIdCard(String idCard); + /** + * @Description 楼栋下房屋列表 + * @Param tokenDto + * @Param formDTO + * @Return {@link List< HouseListResultDTO>} + * @Author zhaoqifeng + * @Date 2021/11/5 16:01 + */ + List getHouseList(TokenDto tokenDto, HouseFormDTO formDTO); + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 041bdc6b54..2858eb6d31 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -22,13 +22,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.dto.result.OptionResultDTO; +import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; import com.epmet.dao.IcHouseDao; import com.epmet.dto.IcHouseDTO; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.HouseFormDTO; +import com.epmet.dto.result.HouseListResultDTO; import com.epmet.entity.IcHouseEntity; +import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcHouseService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -36,6 +45,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @@ -48,6 +58,10 @@ import java.util.stream.Collectors; @Slf4j @Service public class IcHouseServiceImpl extends BaseServiceImpl implements IcHouseService { + @Resource + private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; + @Resource + private EpmetUserOpenFeignClient epmetUserOpenFeignClient; @Override @@ -147,4 +161,67 @@ public class IcHouseServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/11/5 16:01 + */ + @Override + public List getHouseList(TokenDto tokenDto, HouseFormDTO formDTO) { + //查询楼栋下房屋列表 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcHouseEntity::getBuildingId, formDTO.getBuildingId()); + wrapper.last("ORDER BY CONVERT ( HOUSE_NAME USING gbk ) ASC"); + List list = baseDao.selectList(wrapper); + if(CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + //获取居民分类列表 + IcResiCategoryStatsConfigDTO categoryDto = new IcResiCategoryStatsConfigDTO(); + categoryDto.setCustomerId(tokenDto.getCustomerId()); + Result> categoryResult = operCustomizeOpenFeignClient.getCategoryList(categoryDto); + if (!categoryResult.success()) { + throw new RenException(categoryResult.getCode(), categoryResult.getMsg()); + } + List categoryList = categoryResult.getData(); + //获取居民分类数量统计 + IcResiUserDTO userDTO = new IcResiUserDTO(); + userDTO.setBuildId(formDTO.getBuildingId()); + Result>> resultMap = epmetUserOpenFeignClient.getHomeUserCategoryCount(userDTO); + if (!resultMap.success()) { + throw new RenException(resultMap.getCode(), resultMap.getMsg()); + } + Map> map = resultMap.getData(); + + return list.stream().map(item -> { + Map countMap = map.get(item.getId()); + HouseListResultDTO dto = new HouseListResultDTO(); + dto.setHouseId(item.getId()); + dto.setHouseName(item.getHouseName()); + List categories = new ArrayList<>(); + if (null != countMap && CollectionUtils.isNotEmpty(categoryList)) { + for (IcResiCategoryStatsConfigDTO category : categoryList) { + if (null == countMap.get(category.getColumnName()) || countMap.get(category.getColumnName()) == NumConstant.ZERO) { + continue; + } + HouseListResultDTO.CategoryListBean bean = new HouseListResultDTO.CategoryListBean(); + bean.setName(category.getLabel()); + bean.setIconUrl(category.getHouseShowIcon()); + if ("党员".equals(category.getLabel())) { + bean.setIsSpecial(NumConstant.ONE_STR); + } else { + bean.setIsSpecial(NumConstant.ZERO_STR); + } + categories.add(bean); + } + } + dto.setCategoryList(categories); + return dto; + }).collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 28693abe46..7726abe6dd 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -3,6 +3,7 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; @@ -97,4 +98,7 @@ public interface OperCustomizeOpenFeignClient { @PostMapping("/oper/customize/icformitem/getmustcolumn/{customerId}") Result> getMustColumn(@PathVariable("customerId") String customerId); + @PostMapping("/oper/customize/icresicategorystatsconfig/categorylist") + Result> getCategoryList(@RequestBody IcResiCategoryStatsConfigDTO dto); + } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 6aa1809620..c08fe76f86 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -4,6 +4,7 @@ import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; @@ -79,4 +80,9 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result> getMustColumn(String customerId) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getMustColumn", customerId); } + + @Override + public Result> getCategoryList(IcResiCategoryStatsConfigDTO dto) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getCategoryList", dto); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java index f088a65265..70880418dd 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcResiCategoryStatsConfigController.java @@ -91,4 +91,9 @@ public class IcResiCategoryStatsConfigController { ExcelUtils.exportExcelToTarget(response, null, list, IcResiCategoryStatsConfigExcel.class); } + @PostMapping("categorylist") + public Result> getCategoryList(@RequestBody IcResiCategoryStatsConfigDTO dto) { + return new Result>().ok(icResiCategoryStatsConfigService.getCategoryList(dto)); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java index b7c5938162..aa99453387 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcResiCategoryStatsConfigService.java @@ -92,4 +92,13 @@ public interface IcResiCategoryStatsConfigService extends BaseService} + * @Author zhaoqifeng + * @Date 2021/11/5 15:43 + */ + List getCategoryList(IcResiCategoryStatsConfigDTO dto); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java index 368ecec876..d0183a03f9 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcResiCategoryStatsConfigServiceImpl.java @@ -17,12 +17,13 @@ package com.epmet.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.dao.IcResiCategoryStatsConfigDao; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.entity.IcResiCategoryStatsConfigEntity; @@ -34,6 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -101,4 +103,24 @@ public class IcResiCategoryStatsConfigServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/11/5 15:43 + */ + @Override + public List getCategoryList(IcResiCategoryStatsConfigDTO dto) { + if(StringUtils.isBlank(dto.getCustomerId())) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcResiCategoryStatsConfigEntity::getCustomerId, dto.getCustomerId()); + wrapper.orderByAsc(IcResiCategoryStatsConfigEntity::getSort); + List list = baseDao.selectList(wrapper); + return ConvertUtils.sourceToTarget(list, IcResiCategoryStatsConfigDTO.class); + } + } \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index 47567c16f7..26fe630e6e 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -650,4 +650,7 @@ public interface EpmetUserOpenFeignClient { @PostMapping("/epmetuser/icresidemanddict/demandoption/demandoption") Result> getDemandOptions(); + + @PostMapping("/epmetuser/icresiuser/categorycount") + Result>> getHomeUserCategoryCount(@RequestBody IcResiUserDTO formDTO); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index c32f26501b..3db8c923f9 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -469,4 +469,9 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien public Result> getDemandOptions() { return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getDemandOptions", null); } + + @Override + public Result>> getHomeUserCategoryCount(IcResiUserDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getHomeUserCategoryCount", formDTO); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index dd62a9fd02..760fd526eb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -162,7 +162,7 @@ public class IcResiUserController { continue; } - if (item2.getItemType().equals("checkbox") || item2.getItemType().equals("select") || item2.getItemType().equals("radio")) { + if ("checkbox".equals(item2.getItemType()) || "select".equals(item2.getItemType()) || "radio".equals(item2.getItemType())) { itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2, FormItem.class)); } } @@ -181,7 +181,7 @@ public class IcResiUserController { if (StringUtils.isBlank(formItem2.getColumnName())) { continue; } - if (formItem2.getItemType().equals("checkbox") || formItem2.getItemType().equals("select") || formItem2.getItemType().equals("radio")) { + if ("checkbox".equals(formItem2.getItemType()) || "select".equals(formItem2.getItemType()) || "radio".equals(formItem2.getItemType())) { itemMap.put(formItem2.getColumnName().concat(formItem2.getColumnNum() == 0 ? "" : formItem2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItem2, FormItem.class)); } } @@ -292,4 +292,16 @@ public class IcResiUserController { return new Result().ok(icResiUserService.getOwnerRelation(formDTO.getUserId())); } + /** + * @Description 获取一栋楼每个房间人员分类的数量 + * @Param formDTO + * @Return {@link Result< Map< String, Map< String, Integer>>>} + * @Author zhaoqifeng + * @Date 2021/11/5 15:10 + */ + @PostMapping("categorycount") + public Result>> getHomeUserCategoryCount(@RequestBody IcResiUserDTO formDTO) { + return new Result>>().ok(icResiUserService.getHomeUserCategoryCount(formDTO.getBuildId())); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 45e31dd726..7a8d0e2478 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -23,6 +23,7 @@ import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.PersonDataResultDTO; import com.epmet.dto.result.SearchByNameResultDTO; import com.epmet.entity.IcResiUserEntity; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -119,6 +120,8 @@ public interface IcResiUserDao extends BaseDao { List searchByName(@Param("name")String name, @Param("agencyId")String agencyId,@Param("pageNo")Integer pageNo); Set selectUserDemandCode(String icResiUserId); - String selectCategoryNames(@Param("customerId") String customerId,@Param("codeSet") Set codeSet); + + @MapKey("HOME_ID") + Map> getHomeUserCategoryCount(@Param("buildId") String buildId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index db49d560d5..b84138258a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -120,4 +120,13 @@ public interface IcResiUserService extends BaseService { * @Date 2021/11/5 10:28 */ OwnerRelationResultDTO getOwnerRelation(String userId); + + /** + * @Description 获取一栋楼每个房间人员分类的数量 + * @Param buildId + * @Return {@link Map< String, Map< String, Integer>>} + * @Author zhaoqifeng + * @Date 2021/11/5 14:40 + */ + Map> getHomeUserCategoryCount(String buildId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index edec6e3d51..df5d844ea0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -658,4 +658,17 @@ public class IcResiUserServiceImpl extends BaseServiceImpl>} + * @Author zhaoqifeng + * @Date 2021/11/5 14:40 + */ + @Override + public Map> getHomeUserCategoryCount(String buildId) { + return baseDao.getHomeUserCategoryCount(buildId); + } } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index b3fce33028..95762a74ee 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -214,4 +214,30 @@ + \ No newline at end of file From cbc77998cf55fda950625791698f48c49ad23819 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Fri, 5 Nov 2021 17:54:19 +0800 Subject: [PATCH 131/253] emm --- .../java/com/epmet/dto/result/PersonDataResultDTO.java | 6 ++++++ .../src/main/java/com/epmet/dao/IcResiUserDao.java | 9 +++++++++ .../com/epmet/service/impl/IcResiUserServiceImpl.java | 8 ++++++++ .../src/main/resources/mapper/IcResiUserDao.xml | 5 +++++ 4 files changed, 28 insertions(+) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java index ae4082c383..9cc92f1a37 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java @@ -72,4 +72,10 @@ public class PersonDataResultDTO implements Serializable { */ @JsonIgnore private String idCard; + + /** + * 是否是志愿者 1是,0否 + */ + @JsonIgnore + private String isVolunteer; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 7a8d0e2478..0288fea156 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -124,4 +124,13 @@ public interface IcResiUserDao extends BaseDao { @MapKey("HOME_ID") Map> getHomeUserCategoryCount(@Param("buildId") String buildId); + + /** + * @Description 根据userId查询志愿者 + * @param userId + * @author zxc + * @date 2021/11/5 5:44 下午 + */ + List selectVolunteerByUserId(@Param("userId")String userId); + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index df5d844ea0..18c8896477 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -493,6 +493,14 @@ public class IcResiUserServiceImpl extends BaseServiceImpl volunteers = baseDao.selectVolunteerByUserId(formDTO.getUserId()); + volunteers.forEach(v -> { + + }); + } // TODO return personData; } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 95762a74ee..319743fe3e 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -240,4 +240,9 @@ AND BUILD_ID = #{buildId} GROUP BY HOME_ID + + + \ No newline at end of file From 0cfcd837874b716dbd4cad6c82b86ddaa8464d31 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Sun, 7 Nov 2021 00:06:54 +0800 Subject: [PATCH 132/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9:=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=B1=85=E6=B0=91=E5=AF=BC=E5=85=A5=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=92=8C=E8=B7=B3=E8=BF=87=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=9A=84=E6=94=B6=E9=9B=86=20=E5=AE=8C=E6=88=90=E9=99=84?= =?UTF-8?q?=E5=8A=A0=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=E5=90=8E=E5=AF=B9?= =?UTF-8?q?=E4=B8=BB=E8=A1=A8=E4=BF=A1=E6=81=AF=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dao/IcResiUserDao.java | 2 +- .../com/epmet/enums/IcResiUserTableEnums.java | 82 +++++ .../handler/DynamicEasyExcelListener.java | 6 +- .../impl/IcResiUserImportServiceImpl.java | 288 +++++++++++++----- 4 files changed, 299 insertions(+), 79 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 45e31dd726..02f4fc5386 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -49,7 +49,7 @@ public interface IcResiUserDao extends BaseDao { * @Author sun * @Description 更新或新增居民信息各表数据 **/ - void upTable(@Param("tableName") String tableName, @Param("id") String id, @Param("map") Map map); + void upTable(@Param("tableName") String tableName, @Param("id") String id, @Param("map") Map map); List> selectListResiMap(@Param("customerId") String customerId, @Param("formCode") String formCode, diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java new file mode 100644 index 0000000000..c03d5649c3 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java @@ -0,0 +1,82 @@ +package com.epmet.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @Description 描述 + * @Author wangxianzhang + * @Date 2021/11/5 10:37 上午 + * @Version 1.0 + */ +@AllArgsConstructor +public enum IcResiUserTableEnums { + + IC_RESI_USER("ic_resi_user","社区居民基本信息录入表", 0, 3, null), + IC_PARTY_MEMBER("ic_party_member","党员信息录入表", 1, 2, "IS_PARTY"), + IC_ENSURE_HOUSE("ic_ensure_house","保障房人员信息录入表", 2, 2, "IS_ENSURE_HOUSE"), + IC_UNEMPLOYED("ic_unemployed","失业人员信息录入表", 3, 2, "IS_UNEMPLOYED"), + IC_VETERANS("ic_veterans","退役军人信息录入表", 4, 2, "IS_VETERANS"), + IC_UNITED_FRONT("ic_united_front","统战人员信息录入表", 5, 2, "IS_UNITED_FRONT"), + IC_VOLUNTEER("ic_volunteer","志愿者信息录入表", 6, 3, "IS_VOLUNTEER"), + IC_OLD_PEOPLE("ic_old_people","老年人信息录入表", 7, 2, "IS_OLD_PEOPLE"), + IC_SPECIAL("ic_special","特殊人群信息录入表", 8, 3, "IS_SPECIAL"); + + private String tableName; + private String tableComment; + private int sheetNo; + private int headRowNo; + private String mainTableFlagColumnName; + + public static IcResiUserTableEnums getObjectByTableName(String tableName) { + for (IcResiUserTableEnums i : IcResiUserTableEnums.values()) { + if (i.tableName.equals(tableName)) { + return i; + } + } + return null; + } + + + + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getTableComment() { + return tableComment; + } + + public void setTableComment(String tableComment) { + this.tableComment = tableComment; + } + + public int getSheetNo() { + return sheetNo; + } + + public void setSheetNo(int sheetNo) { + this.sheetNo = sheetNo; + } + + public int getHeadRowNo() { + return headRowNo; + } + + public void setHeadRowNo(int headRowNo) { + this.headRowNo = headRowNo; + } + + public String getMainTableFlagColumnName() { + return mainTableFlagColumnName; + } + + public void setMainTableFlagColumnName(String mainTableFlagColumnName) { + this.mainTableFlagColumnName = mainTableFlagColumnName; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java index 0abf0f28d0..4c12594a45 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/DynamicEasyExcelListener.java @@ -34,7 +34,7 @@ public class DynamicEasyExcelListener extends AnalysisEventListener headMap, AnalysisContext context) { - log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); + //log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); //存储全部表头数据 headList.add(headMap); } @@ -48,7 +48,7 @@ public class DynamicEasyExcelListener extends AnalysisEventListener data, AnalysisContext context) { - log.info("解析到一条数据:{}", JSON.toJSONString(data)); + //log.info("解析到一条数据:{}", JSON.toJSONString(data)); dataList.add(data); } @@ -60,7 +60,7 @@ public class DynamicEasyExcelListener extends AnalysisEventListener> getHeadList() { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 4e121b2e8f..e8fa1ffc79 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -1,10 +1,12 @@ package com.epmet.service.impl; import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.security.user.LoginUserUtil; @@ -19,6 +21,7 @@ import com.epmet.dto.result.FormItem; import com.epmet.dto.result.LoginUserDetailsResultDTO; import com.epmet.dto.result.OptionDTO; import com.epmet.entity.IcResiUserEntity; +import com.epmet.enums.IcResiUserTableEnums; import com.epmet.excel.handler.DynamicEasyExcelListener; import com.epmet.feign.EpmetAdminOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; @@ -47,7 +50,9 @@ import java.util.stream.Collectors; @Service public class IcResiUserImportServiceImpl implements IcResiUserImportService, ResultDataResolver { - public static final ThreadLocal errorRow = new ThreadLocal(); + // 错误和跳过excel行暂存 + public static final ThreadLocal>> errorRows = new ThreadLocal<>(); + public static final ThreadLocal>> skipedRows = new ThreadLocal<>(); @Autowired private LoginUserUtil loginUserUtil; @@ -80,6 +85,9 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res private String columnName; private String itemType; private String itemId; + + // 是否必填 + private Integer required; private List colIndexs; //private List colContents; // 单元格内容 @@ -104,13 +112,20 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res /** * 错误行信息 */ + @Data public static class ErrorRow { - private String sheetName; private String idCard; private String name; private String errorInfo; } + @Data + public static class SkipedRow { + private String idCard; + private String name; + private String info; + } + /** * 导入居民信息 * 导入主表和所有子表信息 @@ -134,19 +149,62 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); String customerId = agencyInfo.getCustomerId(); - importIcResiBaseInfoFromExcel(excelPathName, 0, 3, currUserAgencyId, agencyInfo.getPids(), loginUserId); - importIcResiExtraInfoFromExcel(excelPathName, 1, 2, currUserAgencyId, loginUserId, "ic_party_member", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 2, 2, currUserAgencyId, loginUserId, "ic_ensure_house", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 3, 2, currUserAgencyId, loginUserId, "ic_unemployed", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 4, 2, currUserAgencyId, loginUserId, "ic_veterans", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 5, 2, currUserAgencyId, loginUserId, "ic_united_front", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 6, 3, currUserAgencyId, loginUserId, "ic_volunteer", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 7, 2, currUserAgencyId, loginUserId, "ic_old_people", customerId); - importIcResiExtraInfoFromExcel(excelPathName, 8, 3, currUserAgencyId, loginUserId, "ic_special", customerId); + try { + initThreadLocalRowsStorage(); + + // 上传主表信息 + importIcResiBaseInfoFromExcel(excelPathName, IcResiUserTableEnums.IC_RESI_USER.getSheetNo(), IcResiUserTableEnums.IC_RESI_USER.getHeadRowNo(), + currUserAgencyId, agencyInfo.getPids(), loginUserId, IcResiUserTableEnums.IC_RESI_USER.getTableName()); + + // 上传附表信息 + for (IcResiUserTableEnums sheet : IcResiUserTableEnums.values()) { + if (sheet == IcResiUserTableEnums.IC_RESI_USER) { + continue; + } + + try { + importIcResiExtraInfoFromExcel(excelPathName, sheet.getSheetNo(), sheet.getHeadRowNo(), currUserAgencyId, loginUserId, sheet.getTableName(), customerId); + } catch (Exception e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + log.error("导入IC居民附加信息【{}】错误:{}", sheet.getTableComment(), errorMsg); + ErrorRow errorRow = new ErrorRow(); + errorRow.setName("*"); + errorRow.setIdCard("*"); + errorRows.get().get(sheet.getTableName()).add(errorRow); + } + } + + String errors = JSON.toJSONString(errorRows.get()); + String skipeds = JSON.toJSONString(skipedRows.get()); + + log.error(errors); + log.error(skipeds); + + } finally { + skipedRows.remove(); + errorRows.remove(); + } return null; } + /** + * 暂存rows信息初始化 + */ + private void initThreadLocalRowsStorage() { + Map> skipedRowsMap = new LinkedHashMap<>(); + for (IcResiUserTableEnums e : IcResiUserTableEnums.values()) { + skipedRowsMap.put(e.getTableName(), new LinkedList<>()); + } + skipedRows.set(skipedRowsMap); + + Map> errorRowsMap = new LinkedHashMap<>(); + for (IcResiUserTableEnums e : IcResiUserTableEnums.values()) { + errorRowsMap.put(e.getTableName(), new LinkedList<>()); + } + errorRows.set(errorRowsMap); + } + /** * excel导入居民基本信息 * @param sheetNo @@ -156,7 +214,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param currentUserId * @return */ - private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) { + private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId, + String tableName) { DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); @@ -189,7 +248,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Map headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders); // 持久化 - persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId); + persistIcResiBaseInfo(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, currUserAgencyPids, currentUserId, tableName); return headers; } @@ -249,39 +308,64 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res */ private void persistIcResiBaseInfo(Map headerColumnWrapper, List> dataRows, String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, - String currUserAgencyPids, String currentUserId) { + String currUserAgencyPids, String currentUserId, String tableName) { // 遍历每一行,将行内容转化为 for (Map row : dataRows) { - LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); - - columnAndValues.put("IS_ENSURE_HOUSE", "0"); - columnAndValues.put("IS_OLD_PEOPLE", "0"); - columnAndValues.put("IS_PARTY", "0"); - columnAndValues.put("IS_SPECIAL", "0"); - columnAndValues.put("IS_UNEMPLOYED", "0"); - columnAndValues.put("IS_UNITED_FRONT", "0"); - columnAndValues.put("IS_VETERANS", "0"); - columnAndValues.put("IS_VOLUNTEER", "0"); - - columnAndValues.put("AGENCY_ID", currUserAgencyId); - columnAndValues.put("PIDS", currUserAgencyPids); - columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); - columnAndValues.put("CREATED_BY", currentUserId); - columnAndValues.put("UPDATED_BY", currentUserId); - columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); - - // 验证居民信息是否存在 - String idCard = columnAndValues.get("ID_CARD"); - LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); - idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); - - if (icResiUserDao.selectCount(idCardQuery) > 0) { - log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard); - } + LinkedHashMap columnAndValues = new LinkedHashMap<>(); + try { + convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel, columnAndValues); + + columnAndValues.put("IS_ENSURE_HOUSE", "0"); + columnAndValues.put("IS_OLD_PEOPLE", "0"); + columnAndValues.put("IS_PARTY", "0"); + columnAndValues.put("IS_SPECIAL", "0"); + columnAndValues.put("IS_UNEMPLOYED", "0"); + columnAndValues.put("IS_UNITED_FRONT", "0"); + columnAndValues.put("IS_VETERANS", "0"); + columnAndValues.put("IS_VOLUNTEER", "0"); + + columnAndValues.put("AGENCY_ID", currUserAgencyId); + columnAndValues.put("PIDS", currUserAgencyPids); + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CREATED_BY", currentUserId); + columnAndValues.put("UPDATED_BY", currentUserId); + columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); + + // 验证居民信息是否存在 + String idCard = columnAndValues.get("ID_CARD"); + LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); + idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); + + if (icResiUserDao.selectCount(idCardQuery) > 0) { + //log.info("身份证号为【{}】的居民信息已存在,跳过导入", idCard); + SkipedRow skipedRow = new SkipedRow(); + skipedRow.setName(columnAndValues.get("NAME")); + skipedRow.setIdCard(idCard); + skipedRow.setInfo("身份证号已存在,跳过导入"); + skipedRows.get().get(IcResiUserTableEnums.IC_RESI_USER.getTableName()).add(skipedRow); + continue; + } - icResiUserDao.add("ic_resi_user", columnAndValues); + icResiUserDao.add(tableName, columnAndValues); + } catch (Exception e) { + String errorMsg; + if (e instanceof RenException) { + errorMsg = e.getMessage(); + } else { + errorMsg = "未知系统错误"; + log.error(ExceptionUtils.getErrorStackTrace(e)); + } + + ErrorRow errorRow = new ErrorRow(); + errorRow.setIdCard(columnAndValues.get("ID_CARD")); + errorRow.setName(columnAndValues.get("NAME")); + errorRow.setErrorInfo(errorMsg); + errorRows.get().get(IcResiUserTableEnums.IC_RESI_USER.getTableName()).add(errorRow); + } finally { + columnAndValues.clear(); + } } } @@ -297,44 +381,73 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, String currentUserId, String targetTableName, String customerId) { + LinkedHashMap columnAndValues = new LinkedHashMap<>(); + // 遍历每一行,将行内容转化为 for (Map row : dataRows) { - LinkedHashMap columnAndValues = convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel); + try { + convertColumnWrappers2Map4Persist(headerColumnWrapper, row, currUserAgencyId, checkBoxOptionColumnIdxAndLabel, columnAndValues); - // 检验身份证号 - String idCard = columnAndValues.get("ID_CARD"); - if (StringUtils.isBlank(idCard)) { - throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME"))); - } + // 检验身份证号 + String idCard = columnAndValues.get("ID_CARD"); + if (StringUtils.isBlank(idCard)) { + throw new RenException(EpmetErrorCode.IDCARDNO_ERROR.getCode(), String.format("用户【%s】身份证号未填写或格式错误", columnAndValues.get("NAME"))); + } - // 检查用户是否存在 - LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); - idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); + // 检查用户是否存在 + LambdaQueryWrapper idCardQuery = new LambdaQueryWrapper<>(); + idCardQuery.eq(IcResiUserEntity::getIdCard, idCard); - IcResiUserEntity icResiUserBaseInfo = icResiUserDao.selectOne(idCardQuery); - if (icResiUserBaseInfo == null) { - throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard)); - } + IcResiUserEntity icResiUserBaseInfo = icResiUserDao.selectOne(idCardQuery); + if (icResiUserBaseInfo == null) { + throw new RenException(EpmetErrorCode.RESI_NOT_FOUND.getCode(), String.format("身份证号为【%s】的居民信息未找到,请确认该居民信息存在", idCard)); + } - String icResiId = icResiUserBaseInfo.getId(); + String icResiId = icResiUserBaseInfo.getId(); - // 验证党员信息是否存在 - if (CollectionUtils.isNotEmpty(icResiUserDao.selectSubTableRecords(customerId, icResiId, targetTableName))) { - log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName); - continue; - } + // 验证党员信息是否存在 + if (CollectionUtils.isNotEmpty(icResiUserDao.selectSubTableRecords(customerId, icResiId, targetTableName))) { + log.info("身份证号为【{}】的居民【{}】信息已存在,跳过导入", idCard, targetTableName); + + SkipedRow skipedRow = new SkipedRow(); + skipedRow.setName(columnAndValues.get("NAME")); + skipedRow.setIdCard(columnAndValues.get("ID_CARD")); + skipedRow.setInfo("信息已存在,跳过导入"); + skipedRows.get().get(targetTableName).add(skipedRow); + + continue; + } + + columnAndValues.put("IC_RESI_USER", icResiId); - columnAndValues.put("IC_RESI_USER", icResiId); + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CREATED_BY", currentUserId); + columnAndValues.put("UPDATED_BY", currentUserId); + columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); - columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); - columnAndValues.put("CREATED_BY", currentUserId); - columnAndValues.put("UPDATED_BY", currentUserId); - columnAndValues.put("ID", UUID.randomUUID().toString().replace("-", "")); + columnAndValues = removeNeedlessColumns(columnAndValues); - columnAndValues = removeNeedlessColumns(columnAndValues); + icResiUserDao.add(targetTableName, columnAndValues); - icResiUserDao.add(targetTableName, columnAndValues); + updateMainTableResiTypeFlag(Objects.requireNonNull(IcResiUserTableEnums.getObjectByTableName(targetTableName)), icResiId); + } catch (Exception e) { + String errorMsg; + if (e instanceof RenException) { + errorMsg = e.getMessage(); + } else { + errorMsg = "未知系统错误"; + log.error(ExceptionUtils.getErrorStackTrace(e)); + } + + ErrorRow errorRow = new ErrorRow(); + errorRow.setName(columnAndValues.get("NAME")); + errorRow.setIdCard(columnAndValues.get("ID_CARD")); + errorRow.setErrorInfo(errorMsg); + errorRows.get().get(targetTableName).add(errorRow); + } finally { + columnAndValues.clear(); + } } } @@ -365,12 +478,16 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param row 当前行数据 * @param currUserAgencyId 当前用户所属机构ID * @param checkBoxOptionColumnIdxAndLabel 复选框options列表。key:列号,value:复选框中文 - * @return + * @param target 要将数据放到哪个对象中 */ - private LinkedHashMap convertColumnWrappers2Map4Persist(Map headerColumnWrapper, Map row, - String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel) { - LinkedHashMap columnAndValues = new LinkedHashMap<>(); - + private void convertColumnWrappers2Map4Persist(Map headerColumnWrapper, Map row, + String currUserAgencyId, Map checkBoxOptionColumnIdxAndLabel, + LinkedHashMap target) { + + boolean interupt = false; + + List errorColumnNames = new LinkedList<>(); + for (Map.Entry columnWrapperEntry : headerColumnWrapper.entrySet()) { ColumnWrapper columnWrapper = columnWrapperEntry.getValue(); @@ -408,10 +525,19 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String checkBoxColValue = getCheckBoxColValue(columnWrapper, row, checkBoxOptionColumnIdxAndLabel); columnWrapper.setColValue(checkBoxColValue); } - columnAndValues.put(columnWrapper.columnName, columnWrapper.colValue); + + // requiredColumns中的值为必填项 + if (columnWrapper.getRequired() == 1 && StringUtils.isBlank(columnWrapper.colValue)) { + interupt = true; + errorColumnNames.add(columnWrapper.combinedLabel); + } + + target.put(columnWrapper.columnName, columnWrapper.colValue); + } + + if (interupt) { + throw new RenException(String.join(",", errorColumnNames) + "的值未填写"); } - - return columnAndValues; } /** @@ -517,6 +643,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res columnWrapper.setCombinedLabel(combinedLabel); columnWrapper.setColumnName(item.getColumnName()); columnWrapper.setColIndexs(entry.getValue()); + columnWrapper.setRequired(item.getRequired()); columnWrapper.setOptionSourceType(item.getOptionSourceType()); columnWrapper.setOptionSourceValue(item.getOptionSourceValue()); @@ -714,5 +841,16 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res }*/ } + + /** + * 更新主表中人员类别标记 + * @param icResiUserTableEnum + * @param resiUserId + */ + private void updateMainTableResiTypeFlag(IcResiUserTableEnums icResiUserTableEnum, String resiUserId) { + HashMap map = new HashMap<>(); + map.put(icResiUserTableEnum.getMainTableFlagColumnName(), true); + icResiUserDao.upTable("ic_resi_user", resiUserId, map); + } } From 76de3478bb5e41e4be9ab0e23cf21ce2203f6533 Mon Sep 17 00:00:00 2001 From: lzh Date: Sun, 7 Nov 2021 15:33:54 +0800 Subject: [PATCH 133/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E7=B1=BB=E5=88=AB?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/result/BuildingResultDTO.java | 24 ++ .../epmet/feign/GovOrgOpenFeignClient.java | 3 + .../GovOrgOpenFeignClientFallback.java | 5 + .../epmet/controller/BuildingController.java | 14 +- .../java/com/epmet/dao/IcBuildingDao.java | 3 + .../com/epmet/service/BuildingService.java | 3 + .../service/impl/BuildingServiceImpl.java | 7 + .../main/resources/mapper/IcBuildingDao.xml | 20 ++ .../IcResiCategoryStatsConfigSortFormDTO.java | 3 +- .../feign/OperCustomizeOpenFeignClient.java | 14 ++ .../OperCustomizeOpenFeignClientFallback.java | 16 ++ .../ResiCategoryStatsConfigController.java | 43 ++++ .../IcResiCategoryWarnConfigEntity.java | 4 + .../ResiCategoryStatsConfigServiceImpl.java | 26 ++- .../com/epmet/dto/IcStatsResiWarnDTO.java | 111 +++++++++ .../epmet/dto/form/StatsResiListFormDTO.java | 46 ++++ .../epmet/dto/form/StatsResiWarnFormDTO.java | 55 +++++ .../dto/result/IcStatsResiResultDTO.java | 44 ++++ .../IcStatsResiWarnBuildingResultDTO.java | 58 +++++ .../result/IcStatsResiWarnUserResultDTO.java | 47 ++++ .../com/epmet/constant/LevelConstant.java | 8 + .../controller/IcStatsResiWarnController.java | 94 ++++++++ .../controller/StatsResiWarnController.java | 95 ++++++++ .../com/epmet/dao/IcStatsResiWarnDao.java | 49 ++++ .../epmet/entity/IcStatsResiWarnEntity.java | 81 +++++++ .../com/epmet/excel/IcStatsResiWarnExcel.java | 80 +++++++ .../com/epmet/redis/IcStatsResiWarnRedis.java | 47 ++++ .../epmet/service/IcStatsResiWarnService.java | 95 ++++++++ .../epmet/service/StatsResiWarnService.java | 41 ++++ .../impl/IcStatsResiWarnServiceImpl.java | 104 +++++++++ .../impl/StatsResiWarnServiceImpl.java | 210 ++++++++++++++++++ .../resources/mapper/IcStatsResiWarnDao.xml | 106 +++++++++ 32 files changed, 1553 insertions(+), 3 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcStatsResiWarnDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiListFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiResultDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnUserResultDTO.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/constant/LevelConstant.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcStatsResiWarnController.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcStatsResiWarnEntity.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcStatsResiWarnExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcStatsResiWarnRedis.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcStatsResiWarnService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcStatsResiWarnServiceImpl.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java create mode 100644 epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultDTO.java new file mode 100644 index 0000000000..4835cefba5 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultDTO.java @@ -0,0 +1,24 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 15:03 + */ +@Data +public class BuildingResultDTO implements Serializable { + private static final long serialVersionUID = -2129418426919785999L; + private String buildingId; + + private String gridName; + + private String neighborhoodName; + + private String buildingName; + +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index 5b18f345d2..08cee7d65d 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -519,4 +519,7 @@ public interface GovOrgOpenFeignClient { @GetMapping("/gov/org/ichouse/{id}") Result get(@PathVariable("id") String id); + + @PostMapping("/gov/org/building/buildinglistbyids") + Result> buildingListByIds(@RequestBody List buildingIdList); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index c6e0f96aa4..7734d66901 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -315,6 +315,11 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "get", id); } + @Override + public Result> buildingListByIds(List buildingIdList) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "buildingListByIds", buildingIdList); + } + @Override public Result selectPidsByGridId(String gridId) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "selectPidsByGridId", gridId); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index e576abec7c..c3222f2ad4 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -37,6 +37,7 @@ import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.IcBulidingUnitFormDTO; import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.IcBuildingUnitEntity; import com.epmet.excel.IcBuildingExcel; @@ -206,7 +207,7 @@ public class BuildingController { * @return * @throws IOException */ - @PostMapping("buildingunitlist") + public Result buildingunitlist(@LoginUser TokenDto tokenDTO,@RequestBody IcBulidingUnitFormDTO icBulidingUnitFormDTO ){ ValidatorUtils.validateEntity(icBulidingUnitFormDTO); List icBuildingUnitEntityList = icBuildingUnitDao.selectList(new QueryWrapper().lambda().eq(IcBuildingUnitEntity::getBuildingId, icBulidingUnitFormDTO.getBuildingId()).orderByAsc(IcBuildingUnitEntity::getUnitNum)); @@ -221,4 +222,15 @@ public class BuildingController { return new Result().ok(result); } + + @PostMapping("buildinglistbyids") + public Result> buildingListByIds(@RequestBody List buildingIdList){ + if(CollectionUtils.isEmpty(buildingIdList)){ + return new Result(); + } + List result = buildingService.buildingListByIds(buildingIdList); + return new Result>().ok(result); + + } + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java index ddae0aca45..accf59bb87 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.result.BaseInfoFamilyBuildingResultDTO; +import com.epmet.dto.result.BuildingResultDTO; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; @@ -69,4 +70,6 @@ public interface IcBuildingDao extends BaseDao { * @date 2021/11/2 9:25 上午 */ List baseInfoFamilyBuilding(@Param("neighborHoodId")String neighborHoodId); + + List buildingListByIds(@Param("buildingIdList") List buildingIdList); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java index 39df4d14df..728c472116 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java @@ -20,6 +20,7 @@ package com.epmet.service; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcNeighborHoodExcel; @@ -57,4 +58,6 @@ public interface BuildingService { IcNeighborHoodResultDTO listBuilding(ListIcNeighborHoodFormDTO formDTO); void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception ; + + List buildingListByIds(List buildingIdList); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 10371e3369..ef09973b53 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -13,6 +13,7 @@ import com.epmet.dto.CustomerStaffAgencyDTO; import com.epmet.dto.IcBuildingDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; import com.epmet.enums.BuildingTypeEnums; @@ -278,6 +279,12 @@ public class BuildingServiceImpl implements BuildingService { ExcelPoiUtils.exportExcel(templatePath ,map,"楼宇信息录入表",response); return ; } + + @Override + public List buildingListByIds(List buildingIdList) { + return icBuildingDao.buildingListByIds(buildingIdList); + } + private List searchAllBuilding(ListIcNeighborHoodFormDTO formDTO) { // QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index 3d110df7bd..6be098c62c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -300,5 +300,25 @@ AND b.NEIGHBOR_HOOD_ID = #{neighborHoodId} + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java index b5e7347e4c..9e843dd7da 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigSortFormDTO.java @@ -21,6 +21,7 @@ import com.epmet.commons.tools.validator.group.UpdateGroup; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.io.Serializable; @@ -44,7 +45,7 @@ public class IcResiCategoryStatsConfigSortFormDTO implements Serializable { /** * 排序 */ - @NotBlank(message = "排序不能为空") + @NotNull(message = "排序不能为空") private Integer sort; diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 7726abe6dd..519594fb62 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -4,6 +4,7 @@ import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; @@ -101,4 +102,17 @@ public interface OperCustomizeOpenFeignClient { @PostMapping("/oper/customize/icresicategorystatsconfig/categorylist") Result> getCategoryList(@RequestBody IcResiCategoryStatsConfigDTO dto); + + + @PostMapping("/oper/customize/resicategorystatsconfig/resicategorystatslistshowd") + Result> resiCategoryStatsListShowd(); + + @PostMapping("/oper/customize/resicategorystatsconfig/resicategorywarnlist") + Result> resiCategoryWarnList(); + + @PostMapping("/oper/customize/resicategorystatsconfig/resicategorywarninfobyid") + Result resiCategoryWarnInfoById(@RequestBody IcResiCategoryWarnConfigDTO dto); + + + } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index c08fe76f86..cad357aca5 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -5,6 +5,7 @@ import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; import com.epmet.dto.form.CheckFloatFootBarFormDTO; import com.epmet.dto.form.CustomerFootBarFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; @@ -85,4 +86,19 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result> getCategoryList(IcResiCategoryStatsConfigDTO dto) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "getCategoryList", dto); } + + @Override + public Result> resiCategoryStatsListShowd() { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryStatsListShowd"); + } + + @Override + public Result> resiCategoryWarnList() { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryWarnList"); + } + + @Override + public Result resiCategoryWarnInfoById(IcResiCategoryWarnConfigDTO dto) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryWarnInfoById",dto); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index be1a538f1b..c2639023d4 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -17,9 +17,11 @@ package com.epmet.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -27,17 +29,25 @@ 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.dao.IcResiCategoryStatsConfigDao; +import com.epmet.dao.IcResiCategoryWarnConfigDao; import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; import com.epmet.dto.form.UpGovRoleFormDTO; import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; +import com.epmet.entity.IcResiCategoryStatsConfigEntity; +import com.epmet.entity.IcResiCategoryWarnConfigEntity; import com.epmet.excel.IcResiCategoryStatsConfigExcel; import com.epmet.service.IcResiCategoryStatsConfigService; import com.epmet.service.ResiCategoryStatsConfigService; +import com.github.pagehelper.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -58,6 +68,10 @@ public class ResiCategoryStatsConfigController { @Autowired private ResiCategoryStatsConfigService resiCategoryStatsConfigService; + @Resource + private IcResiCategoryWarnConfigDao icResiCategoryWarnConfigDao; + @Resource + private IcResiCategoryStatsConfigDao icResiCategoryStatsConfigDao; /** * 居民类别配置列表 @@ -103,5 +117,34 @@ public class ResiCategoryStatsConfigController { return new Result().ok(resiCategoryStatsConfigService.info(formDTO.getId())); } + @PostMapping("resicategorystatslistshowd") + public Result> resiCategoryStatsListShowd(){ + //获取预警配置列表 + List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper() + .lambda() + .eq(IcResiCategoryStatsConfigEntity::getStatus,"show") + .orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); + + return new Result>().ok(ConvertUtils.sourceToTarget(statsConfigEntityList, IcResiCategoryStatsConfigDTO.class)); + } + + @PostMapping("resicategorywarnlist") + public Result> resiCategoryWarnList(){ + //获取预警配置列表 + List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper() + .lambda() + .orderByAsc(IcResiCategoryWarnConfigEntity::getSort)); + + return new Result>().ok(ConvertUtils.sourceToTarget(warnConfigEntityList, IcResiCategoryWarnConfigDTO.class)); + } + @PostMapping("resicategorywarninfobyid") + public Result resiCategoryWarnInfoById(@RequestBody IcResiCategoryWarnConfigDTO dto){ + //获取预警配置列表 + if(StringUtils.isEmpty(dto.getId())){ + return new Result<>(); + } + return new Result().ok(ConvertUtils.sourceToTarget(icResiCategoryWarnConfigDao.selectById(dto.getId()),IcResiCategoryWarnConfigDTO.class)); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java index a15c0c7958..f604689f81 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java @@ -17,6 +17,7 @@ package com.epmet.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.epmet.commons.mybatis.entity.BaseEpmetEntity; @@ -66,16 +67,19 @@ public class IcResiCategoryWarnConfigEntity extends BaseEpmetEntity { /** * 等级1阈值 */ + @TableField(value = "LEVEL_1") private Integer level1; /** * 等级2阈值 */ + @TableField(value = "LEVEL_2") private Integer level2; /** * 等级3阈值 */ + @TableField(value = "LEVEL_3") private Integer level3; } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index c5003a5d78..25eb5eafd0 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -54,7 +54,10 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf return new ArrayList<>(); } Set groupIds = icFormItemEntityList.stream().filter(item-> !"0".equals(item.getItemGroupId())).map(item->item.getItemGroupId()).collect(Collectors.toSet()); - List icFormItemGroupEntityList = icFormItemGroupDao.selectList(new QueryWrapper().lambda().in(IcFormItemGroupEntity::getId, groupIds)); + List icFormItemGroupEntityList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(groupIds)){ + icFormItemGroupEntityList.addAll(icFormItemGroupDao.selectList(new QueryWrapper().lambda().in(IcFormItemGroupEntity::getId, groupIds))); + } //获取tableName和COLUMN_NAME Map tableColumnMap = new HashMap<>(); Map idTableMap = new HashMap<>(); @@ -202,6 +205,8 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf //更新配置预警 if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ + //TODO 判断阈值范围 + //更新 IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) @@ -259,6 +264,25 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf icResiCategoryStatsConfigEntity.setSort(formDTO.getSort()); entityList.add(icResiCategoryStatsConfigEntity); } + if(CollectionUtils.isEmpty(entityList)){ + return ; + } icResiCategoryStatsConfigService.updateBatchById(entityList); + //排序更新预警的 + List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(null); + List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(null); + if(CollectionUtils.isEmpty(warnConfigEntityList)){ + return ; + } + for (IcResiCategoryWarnConfigEntity warnConfigEntity : warnConfigEntityList) { + List collect = statsConfigEntityList.stream().filter(i -> i.getTableName().equals(warnConfigEntity.getTableName()) && i.getColumnName().equals(warnConfigEntity.getColumnName())).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(collect)){ + continue; + } + warnConfigEntity.setSort(collect.get(0).getSort()); + } + icResiCategoryWarnConfigService.updateBatchById(warnConfigEntityList); + + } } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcStatsResiWarnDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcStatsResiWarnDTO.java new file mode 100644 index 0000000000..006cf7fb67 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcStatsResiWarnDTO.java @@ -0,0 +1,111 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcStatsResiWarnDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + /** + * 客户id + */ + private String customerId; + + /** + * 预警配置ID + */ + private String configId; + + /** + * 网格id + */ + private String gridId; + + /** + * 组织id + */ + private String agencyId; + + /** + * 组织的所有上级组织id + */ + private String agencyPids; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 楼宇id + */ + private String buildingId; + + /** + * 该分类的居民数量 + */ + private Integer count; + + /** + * 删除标识:0.未删除 1.已删除 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private String revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private String createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiListFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiListFormDTO.java new file mode 100644 index 0000000000..1bb20c647a --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiListFormDTO.java @@ -0,0 +1,46 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class StatsResiListFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 组织id + */ + @NotBlank(message = "id不能为空") + private String id; + + @NotBlank(message = "level不能为空") + private String level; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java new file mode 100644 index 0000000000..f14b15d409 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java @@ -0,0 +1,55 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class StatsResiWarnFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + public interface ListSelectedBuilding {}; + public interface ListSelectedUser {}; + + /** + * 组织id + */ + @NotBlank(message = "组织id不能为空",groups = {ListSelectedBuilding.class}) + private String agencyId; + + @NotBlank(message = "配置id不能为空",groups = {ListSelectedUser.class}) + private String configId; + @NotNull(message = "楼宇不能为空",groups = {ListSelectedUser.class}) + private List buildingIdList; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiResultDTO.java new file mode 100644 index 0000000000..4f670770f3 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiResultDTO.java @@ -0,0 +1,44 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcStatsResiResultDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + + private String id; + private String label; + private Integer count; + private String managementIcon; + private String dataIcon; + private String houseShowIcon; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java new file mode 100644 index 0000000000..5a4369d6ba --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java @@ -0,0 +1,58 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcStatsResiWarnBuildingResultDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 预警配置ID + */ + private String configId; + + private String label; + + private Integer sort; + private Integer level1; + private Integer levelCount1; + private Integer level2; + private Integer levelCount2; + private Integer level3; + private Integer levelCount3; + + private List buildingIdList1; + private List buildingIdList2; + private List buildingIdList3; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnUserResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnUserResultDTO.java new file mode 100644 index 0000000000..4cd3332dca --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnUserResultDTO.java @@ -0,0 +1,47 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcStatsResiWarnUserResultDTO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 预警配置ID + */ + private String configId; + private String buildingId; + private String gridName; + private String neighborhoodName; + private String buildingName; + private String residentNames; + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/LevelConstant.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/LevelConstant.java new file mode 100644 index 0000000000..5cd985c11a --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/constant/LevelConstant.java @@ -0,0 +1,8 @@ +package com.epmet.constant; + +public interface LevelConstant { + String AGENCY = "agency"; + String GRID = "grid"; + String NEIGHBORHOOD = "neighborHood"; + String BUILDING = "building"; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcStatsResiWarnController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcStatsResiWarnController.java new file mode 100644 index 0000000000..f0b9860e45 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcStatsResiWarnController.java @@ -0,0 +1,94 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.commons.tools.validator.group.AddGroup; +import com.epmet.commons.tools.validator.group.UpdateGroup; +import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.dto.IcStatsResiWarnDTO; +import com.epmet.excel.IcStatsResiWarnExcel; +import com.epmet.service.IcStatsResiWarnService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@RestController +@RequestMapping("icstatsresiwarn") +public class IcStatsResiWarnController { + + @Autowired + private IcStatsResiWarnService icStatsResiWarnService; + + @GetMapping("page") + public Result> page(@RequestParam Map params){ + PageData page = icStatsResiWarnService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + public Result get(@PathVariable("id") String id){ + IcStatsResiWarnDTO data = icStatsResiWarnService.get(id); + return new Result().ok(data); + } + + @PostMapping + public Result save(@RequestBody IcStatsResiWarnDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + icStatsResiWarnService.save(dto); + return new Result(); + } + + @PutMapping + public Result update(@RequestBody IcStatsResiWarnDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + icStatsResiWarnService.update(dto); + return new Result(); + } + + @DeleteMapping + public Result delete(@RequestBody String[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + icStatsResiWarnService.delete(ids); + return new Result(); + } + + @GetMapping("export") + public void export(@RequestParam Map params, HttpServletResponse response) throws Exception { + List list = icStatsResiWarnService.list(params); + ExcelUtils.exportExcelToTarget(response, null, list, IcStatsResiWarnExcel.class); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java new file mode 100644 index 0000000000..6a872d078d --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.controller; + +import com.epmet.common.token.annotation.Login; +import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.form.StatsResiListFormDTO; +import com.epmet.dto.form.StatsResiWarnFormDTO; +import com.epmet.dto.result.IcStatsResiResultDTO; +import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; +import com.epmet.dto.result.IcStatsResiWarnUserResultDTO; +import com.epmet.service.IcStatsResiWarnService; +import com.epmet.service.StatsResiWarnService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@RestController +@RequestMapping("statsresiwarn") +public class StatsResiWarnController { + + @Autowired + private IcStatsResiWarnService icStatsResiWarnService; + + @Autowired + private StatsResiWarnService statsResiWarnService; + + @PostMapping("list") + public Result list(@RequestBody StatsResiListFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO); + List icStatsResiResultDTOList = statsResiWarnService.list(formDTO.getId(),formDTO.getLevel()); + return new Result().ok(icStatsResiResultDTOList); + + } + + @PostMapping("buildingwarnlist") + public Result buildingWarnList(@RequestBody StatsResiWarnFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, StatsResiWarnFormDTO.ListSelectedBuilding.class); + String agencyID = formDTO.getAgencyId(); + List icStatsResiWarnBuildingResultDTOS = statsResiWarnService.buildingwWarnList(agencyID); + return new Result().ok(icStatsResiWarnBuildingResultDTOS); + + } + @PostMapping("userwarnlist") + public Result userWarnList(@RequestBody StatsResiWarnFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, StatsResiWarnFormDTO.ListSelectedUser.class); + List buildingIdList = formDTO.getBuildingIdList(); + if(CollectionUtils.isEmpty(buildingIdList)){ + return new Result(); + } + List icStatsResiWarnUserResultDTOS = statsResiWarnService.userWarnList(formDTO.getConfigId(), formDTO.getBuildingIdList()); + return new Result().ok(icStatsResiWarnUserResultDTOS); + } + + /** + * 统计 + * @return + */ + @PostMapping("resiwarn") + public Result resiWarn(@LoginUser TokenDto tokenDto){ + statsResiWarnService.resiWarn(tokenDto.getCustomerId()); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java new file mode 100644 index 0000000000..0cd26050a0 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java @@ -0,0 +1,49 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.entity.IcStatsResiWarnEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Mapper +public interface IcStatsResiWarnDao extends BaseDao { + + List selectResiWarnByAgencyId(@Param("agencyId") String agencyId); + + List> userWarnList(@Param("buildingIdList") List buildingIdList, @Param("tableName") String tableName, @Param("columnName") String columnName); + + Integer countListByLevelAndCol( + @Param("tableName") String tableName, + @Param("columnName") String columnName, + @Param("id")String id, + @Param("level")String level); + + List resiWarn(@Param("tableName") String tableName,@Param("columnName") String columnName); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcStatsResiWarnEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcStatsResiWarnEntity.java new file mode 100644 index 0000000000..fd636c095b --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcStatsResiWarnEntity.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.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 2021-11-04 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ic_stats_resi_warn") +public class IcStatsResiWarnEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户id + */ + private String customerId; + + /** + * 预警配置ID + */ + private String configId; + + /** + * 网格id + */ + private String gridId; + + /** + * 组织id + */ + private String agencyId; + + /** + * 组织的所有上级组织id + */ + private String agencyPids; + + /** + * 小区id + */ + private String neighborHoodId; + + /** + * 楼宇id + */ + private String buildingId; + + /** + * 该分类的居民数量 + */ + private Integer count; + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcStatsResiWarnExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcStatsResiWarnExcel.java new file mode 100644 index 0000000000..59983add12 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcStatsResiWarnExcel.java @@ -0,0 +1,80 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class IcStatsResiWarnExcel { + + @Excel(name = "id") + private String id; + + @Excel(name = "客户id") + private String customerId; + + @Excel(name = "预警配置ID") + private String configId; + + @Excel(name = "网格id") + private String gridId; + + @Excel(name = "组织id") + private String agencyId; + + @Excel(name = "组织的所有上级组织id") + private String agencyPids; + + @Excel(name = "小区id") + private String neighborHoodId; + + @Excel(name = "楼宇id") + private String buildingId; + + @Excel(name = "该分类的居民数量") + private Integer count; + + @Excel(name = "删除标识:0.未删除 1.已删除") + private String delFlag; + + @Excel(name = "乐观锁") + private String revision; + + @Excel(name = "创建人") + private String createdBy; + + @Excel(name = "创建时间") + private String createdTime; + + @Excel(name = "更新人") + private String updatedBy; + + @Excel(name = "更新时间") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcStatsResiWarnRedis.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcStatsResiWarnRedis.java new file mode 100644 index 0000000000..6f143a4264 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/redis/IcStatsResiWarnRedis.java @@ -0,0 +1,47 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.redis; + +import com.epmet.commons.tools.redis.RedisUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Component +public class IcStatsResiWarnRedis { + @Autowired + private RedisUtils redisUtils; + + public void delete(Object[] ids) { + + } + + public void set(){ + + } + + public String get(String id){ + return null; + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcStatsResiWarnService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcStatsResiWarnService.java new file mode 100644 index 0000000000..6a0592adbe --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcStatsResiWarnService.java @@ -0,0 +1,95 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.dto.IcStatsResiWarnDTO; +import com.epmet.entity.IcStatsResiWarnEntity; + +import java.util.List; +import java.util.Map; + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +public interface IcStatsResiWarnService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-11-04 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-11-04 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return IcStatsResiWarnDTO + * @author generator + * @date 2021-11-04 + */ + IcStatsResiWarnDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-11-04 + */ + void save(IcStatsResiWarnDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-11-04 + */ + void update(IcStatsResiWarnDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-11-04 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java new file mode 100644 index 0000000000..5192e27981 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java @@ -0,0 +1,41 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service; + +import com.epmet.dto.result.IcStatsResiResultDTO; +import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; +import com.epmet.dto.result.IcStatsResiWarnUserResultDTO; + +import java.util.List; + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +public interface StatsResiWarnService{ + + List buildingwWarnList(String agencyID); + + List userWarnList(String configId, List buildingIdList); + + List list(String id, String level); + + void resiWarn(String customerId); +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcStatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcStatsResiWarnServiceImpl.java new file mode 100644 index 0000000000..6d17d804ca --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcStatsResiWarnServiceImpl.java @@ -0,0 +1,104 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.dao.IcStatsResiWarnDao; +import com.epmet.dto.IcStatsResiWarnDTO; +import com.epmet.entity.IcStatsResiWarnEntity; +import com.epmet.redis.IcStatsResiWarnRedis; +import com.epmet.service.IcStatsResiWarnService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Service +public class IcStatsResiWarnServiceImpl extends BaseServiceImpl implements IcStatsResiWarnService { + + @Autowired + private IcStatsResiWarnRedis icStatsResiWarnRedis; + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, IcStatsResiWarnDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, IcStatsResiWarnDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + String id = (String)params.get(FieldConstant.ID_HUMP); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); + + return wrapper; + } + + @Override + public IcStatsResiWarnDTO get(String id) { + IcStatsResiWarnEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, IcStatsResiWarnDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(IcStatsResiWarnDTO dto) { + IcStatsResiWarnEntity entity = ConvertUtils.sourceToTarget(dto, IcStatsResiWarnEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(IcStatsResiWarnDTO dto) { + IcStatsResiWarnEntity entity = ConvertUtils.sourceToTarget(dto, IcStatsResiWarnEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java new file mode 100644 index 0000000000..33d30a3212 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java @@ -0,0 +1,210 @@ +package com.epmet.service.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dao.IcStatsResiWarnDao; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.IcResiCategoryWarnConfigDTO; +import com.epmet.dto.result.BuildingResultDTO; +import com.epmet.dto.result.IcStatsResiResultDTO; +import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; +import com.epmet.dto.result.IcStatsResiWarnUserResultDTO; +import com.epmet.entity.IcStatsResiWarnEntity; +import com.epmet.feign.GovOrgOpenFeignClient; +import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.service.IcStatsResiWarnService; +import com.epmet.service.StatsResiWarnService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class StatsResiWarnServiceImpl implements StatsResiWarnService { + @Resource + private IcStatsResiWarnDao icStatsResiWarnDao; + + @Autowired + private IcStatsResiWarnService icStatsResiWarnService; + + @Autowired + private GovOrgOpenFeignClient govOrgOpenFeignClient; + + @Autowired + private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; + + @Override + public List buildingwWarnList(String agencyID) { + List result = new ArrayList<>(); + //feign获取当前需要预警的配置信息以及阈值 + Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + if (!warnResult.success() || null == warnResult.getData()) { + throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); + } + List icResiCategoryWarnConfigDTOList = warnResult.getData(); + + if(CollectionUtils.isEmpty(icResiCategoryWarnConfigDTOList )){ + return result; + } + result = icResiCategoryWarnConfigDTOList.stream().map(item -> { + IcStatsResiWarnBuildingResultDTO resiWarnBuildingResultDTO = new IcStatsResiWarnBuildingResultDTO(); + resiWarnBuildingResultDTO.setConfigId(item.getId()); + resiWarnBuildingResultDTO.setLabel(item.getLabel()); + resiWarnBuildingResultDTO.setLevel1(item.getLevel1()); + resiWarnBuildingResultDTO.setLevel2(item.getLevel2()); + resiWarnBuildingResultDTO.setLevel3(item.getLevel3()); + resiWarnBuildingResultDTO.setSort(item.getSort()); + resiWarnBuildingResultDTO.setLevelCount1(0); + resiWarnBuildingResultDTO.setLevelCount2(0); + resiWarnBuildingResultDTO.setLevelCount3(0); + resiWarnBuildingResultDTO.setBuildingIdList1(new ArrayList<>()); + resiWarnBuildingResultDTO.setBuildingIdList2(new ArrayList<>()); + resiWarnBuildingResultDTO.setBuildingIdList3(new ArrayList<>()); + return resiWarnBuildingResultDTO; + }).collect(Collectors.toList()); + //统计数量 + List icStatsResiWarnEntityList = icStatsResiWarnDao.selectResiWarnByAgencyId(agencyID); + if(CollectionUtils.isEmpty(icStatsResiWarnEntityList )){ + return result; + } + Map warnResultMap = result.stream().collect(Collectors.toMap(IcStatsResiWarnBuildingResultDTO::getConfigId, Function.identity(),(k1, k2)->k1)); + for (IcStatsResiWarnEntity item : icStatsResiWarnEntityList) { + //每栋楼的数量 + Integer count = Optional.ofNullable(item.getCount()).orElse(0); + IcStatsResiWarnBuildingResultDTO resiWarnBuildingResultDTO = warnResultMap.get(item.getConfigId()); + //判断数量 + Integer levle1= resiWarnBuildingResultDTO.getLevel1(); + Integer levle2= resiWarnBuildingResultDTO.getLevel2(); + Integer levle3= resiWarnBuildingResultDTO.getLevel3(); + if(0 == count){ + continue; + } + if(null!=levle1 && count>levle1){ + resiWarnBuildingResultDTO.setLevelCount1(resiWarnBuildingResultDTO.getLevelCount1()+1); + resiWarnBuildingResultDTO.getBuildingIdList1().add(item.getBuildingId()); + } + if(null!=levle1 && null!=levle2 && count<=levle1 && count>=levle2){ + resiWarnBuildingResultDTO.setLevelCount2(resiWarnBuildingResultDTO.getLevelCount2()+1); + resiWarnBuildingResultDTO.getBuildingIdList2().add(item.getBuildingId()); + } + if(null!=levle2 && null!=levle3 && count<=levle2 && count>=levle3){ + resiWarnBuildingResultDTO.setLevelCount3(resiWarnBuildingResultDTO.getLevelCount3()+1); + resiWarnBuildingResultDTO.getBuildingIdList3().add(item.getBuildingId()); + } + } + return result; + + } + + @Override + public List userWarnList(String configId, List buildingIdList) { + //feign根据buildingIdList 获取网格,小区,楼宇 信息 + Result> buildingList = govOrgOpenFeignClient.buildingListByIds(buildingIdList); + if (!buildingList.success() || null == buildingList.getData()) { + throw new RenException("楼宇信息查询失败,buildingList="+ JSON.toJSONString(buildingIdList)); + } + List buildingResultDTOList = buildingList.getData(); + + List result = ConvertUtils.sourceToTarget(buildingResultDTOList,IcStatsResiWarnUserResultDTO.class); + if(CollectionUtils.isEmpty(result)){ + return new ArrayList<>(); + } + //获取configId预警配置信息 + IcResiCategoryWarnConfigDTO formDto = new IcResiCategoryWarnConfigDTO(); + formDto.setId(configId); + Result warnResult = operCustomizeOpenFeignClient.resiCategoryWarnInfoById(formDto); + if (!warnResult.success() || null == warnResult.getData()) { + throw new RenException("获取预警配置信息失败,configId="+ configId); + } + IcResiCategoryWarnConfigDTO icResiCategoryWarnConfigDTO = warnResult.getData(); + + //根据buildingID,tableName he columnName获取名字 + List> maps = icStatsResiWarnDao.userWarnList(buildingIdList, icResiCategoryWarnConfigDTO.getTableName(), icResiCategoryWarnConfigDTO.getColumnName()); + result.forEach(item->{ + item.setConfigId(configId); + List> buildingIds = maps.stream().filter(map -> item.getBuildingId().equals(map.get("buildingId"))).collect(Collectors.toList()); + item.setResidentNames(CollectionUtils.isEmpty(buildingIds)?"":buildingIds.get(0).get("residentNames")); + }); + return result; + } + + @Override + public List list(String id, String level) { + //获取所有配置类项 getshow + Result> statsResult = operCustomizeOpenFeignClient.resiCategoryStatsListShowd(); + if (!statsResult.success() || null == statsResult.getData()) { + throw new RenException("获取配置类项失败"); + } + List icResiCategoryStatsConfigDTOList = statsResult.getData(); + //获取tableName 和columnName + List result = new ArrayList<>(); + icResiCategoryStatsConfigDTOList.forEach(item->{ + IcStatsResiResultDTO resultDTO = new IcStatsResiResultDTO(); + resultDTO.setId(item.getId()); + resultDTO.setLabel(item.getLabel()); + resultDTO.setDataIcon(item.getDataIcon()); + resultDTO.setHouseShowIcon(item.getHouseShowIcon()); + resultDTO.setManagementIcon(item.getManagementIcon()); + //根据id ,level 获取count + Integer count = icStatsResiWarnDao.countListByLevelAndCol(item.getTableName(),item.getColumnName(),id,level); + resultDTO.setCount(count); + result.add(resultDTO); + }); + return result; + } + + /** + * 统计 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void resiWarn(String customerId) { + // 获取预警配置项 + Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + if (!warnResult.success() || null == warnResult.getData()) { + throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); + } + List icResiCategoryWarnConfigDTOList = warnResult.getData(); + + //保存数据 + List icStatsResiWarnEntities = new ArrayList<>(); + for (IcResiCategoryWarnConfigDTO item : icResiCategoryWarnConfigDTOList) { + icStatsResiWarnDao.delete(new QueryWrapper().lambda().eq(IcStatsResiWarnEntity::getConfigId,item.getId())); + List maps = icStatsResiWarnDao.resiWarn(item.getTableName(), item.getColumnName()); + + + if(CollectionUtils.isEmpty(maps)){ + continue; + } + + maps.forEach(map->{ + IcStatsResiWarnEntity icStatsResiWarnEntity = new IcStatsResiWarnEntity(); + icStatsResiWarnEntity.setAgencyId(map.getAgencyId()); + icStatsResiWarnEntity.setAgencyPids(map.getAgencyPids()); + icStatsResiWarnEntity.setBuildingId(map.getBuildingId()); + icStatsResiWarnEntity.setConfigId(item.getId()); + icStatsResiWarnEntity.setCount(map.getCount()); + icStatsResiWarnEntity.setCustomerId(customerId); + icStatsResiWarnEntity.setGridId(map.getGridId()); + icStatsResiWarnEntity.setNeighborHoodId(map.getNeighborHoodId()); + icStatsResiWarnEntities.add(icStatsResiWarnEntity); + }); + + } + icStatsResiWarnService.insertBatch(icStatsResiWarnEntities,500); + + } +} diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml new file mode 100644 index 0000000000..4416ac2f2e --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3f34a5b7acfbcd91f4039566e2698e952b9dbf48 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Sun, 7 Nov 2021 22:00:04 +0800 Subject: [PATCH 134/253] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 57 +++++++++++++- .../service/IcResiUserImportService.java | 6 +- .../impl/IcResiUserImportServiceImpl.java | 74 +++++++++++++++++-- 3 files changed, 125 insertions(+), 12 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 760fd526eb..0428c20b84 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -22,6 +22,7 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; @@ -35,18 +36,26 @@ import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -62,12 +71,28 @@ import java.util.concurrent.atomic.AtomicInteger; public class IcResiUserController { private static final String BASE_TABLE_NAME = "ic_resi_user"; + private Path IC_RESI_UPLOAD_DIR; + @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @Autowired private IcResiUserService icResiUserService; @Autowired private IcResiUserImportService icResiUserImportService; + + { + // 初始化上传目录 + String home = System.getProperty("user.home"); + Path importDir = Paths.get(home, "epmet_files", "ic_user_import"); + if (Files.notExists(importDir)) { + try { + Files.createDirectories(importDir); + } catch (IOException e) { + log.error("创建数字赋能平台上传目录失败"); + } + } + IC_RESI_UPLOAD_DIR = importDir; + } @PostMapping("delete") public Result delete(@LoginUser TokenDto tokenDto,@RequestBody DelIcResiUserFormDTO formDTO){ @@ -228,9 +253,35 @@ public class IcResiUserController { * @return */ @PostMapping("import/excel") - public Result importExcelByEasyExcel() { - Object result = icResiUserImportService.importIcResiInfoFromExcel(); - return new Result().ok(result); + public void importExcelByEasyExcel(@RequestPart("file") MultipartFile file, HttpServletResponse response) { + if (file.isEmpty()) { + throw new RenException("请上传文件"); + } + + // 校验文件类型 + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (!"xls".equals(extension) && !"xlsx".equals(extension)) { + throw new RenException("文件类型不匹配"); + } + + Path savePath = null; + try { + String fileName = UUID.randomUUID().toString().concat(".").concat(extension); + savePath = IC_RESI_UPLOAD_DIR.resolve(fileName); + + IOUtils.copy(file.getInputStream(), new FileOutputStream(savePath.toString())); + icResiUserImportService.importIcResiInfoFromExcel(savePath.toString(), response); + } catch (IOException e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + log.error("【导入居民信息失败】导入失败:{}", errorMsg); + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } finally { + try { + Files.delete(savePath); + } catch (IOException e) { + log.error("【导入居民信息失败】清理上传的文件失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } } @PostMapping("test") diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java index be0d40187d..ba4d0c9458 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java @@ -1,5 +1,8 @@ package com.epmet.service; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + /** *@Description 居民信息导入service *@Author wangxianzhang @@ -7,6 +10,5 @@ package com.epmet.service; */ public interface IcResiUserImportService { - Object importIcResiInfoFromExcel(); - + void importIcResiInfoFromExcel(String excelPathName, HttpServletResponse response); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index e8fa1ffc79..6d4c874f59 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -1,5 +1,8 @@ package com.epmet.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.excel.entity.ExportParams; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -32,10 +35,14 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletResponse; import java.io.File; +import java.io.IOException; +import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; @@ -114,15 +121,37 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res */ @Data public static class ErrorRow { + + @Excel(name = "工作表", width = 30) + private String sheetName; + + private String tableName; + + @Excel(name = "身份证号", width = 40) private String idCard; + + @Excel(name = "姓名", width = 25) private String name; + + @Excel(name = "错误信息", width = 40) private String errorInfo; } @Data public static class SkipedRow { + + @Excel(name = "工作表") + private String sheetName; + + private String tableName; + + @Excel(name = "身份证号") private String idCard; + + @Excel(name = "姓名") private String name; + + @Excel(name = "信息") private String info; } @@ -132,7 +161,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @return */ @Override - public Object importIcResiInfoFromExcel() { + public void importIcResiInfoFromExcel(String excelPathName, HttpServletResponse response) { String loginUserId = loginUserUtil.getLoginUserId(); String loginUserApp = loginUserUtil.getLoginUserApp(); String loginUserClient = loginUserUtil.getLoginUserClient(); @@ -145,7 +174,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res LoginUserDetailsResultDTO loginUserDetails = getResultDataOrThrowsException(epmetUserOpenFeignClient.getLoginUserDetails(userForm), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); String currUserAgencyId = loginUserDetails.getAgencyId(); - String excelPathName = "/opt/test/基础信息表/resi_info.xls"; + //String excelPathName = "/opt/test/基础信息表/resi_info.xls"; CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); String customerId = agencyInfo.getCustomerId(); @@ -175,17 +204,20 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } String errors = JSON.toJSONString(errorRows.get()); - String skipeds = JSON.toJSONString(skipedRows.get()); + //String skipeds = JSON.toJSONString(skipedRows.get()); log.error(errors); - log.error(skipeds); + //log.error(skipeds); + try { + downLoadResults(response); + } catch (IOException e) { + log.error("【导入IC居民附加信息】下载导入结果信息失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } } finally { skipedRows.remove(); errorRows.remove(); } - - return null; } /** @@ -344,6 +376,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res skipedRow.setName(columnAndValues.get("NAME")); skipedRow.setIdCard(idCard); skipedRow.setInfo("身份证号已存在,跳过导入"); + skipedRow.setTableName(tableName); skipedRows.get().get(IcResiUserTableEnums.IC_RESI_USER.getTableName()).add(skipedRow); continue; } @@ -362,6 +395,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res errorRow.setIdCard(columnAndValues.get("ID_CARD")); errorRow.setName(columnAndValues.get("NAME")); errorRow.setErrorInfo(errorMsg); + errorRow.setTableName(tableName); errorRows.get().get(IcResiUserTableEnums.IC_RESI_USER.getTableName()).add(errorRow); } finally { columnAndValues.clear(); @@ -414,6 +448,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res skipedRow.setName(columnAndValues.get("NAME")); skipedRow.setIdCard(columnAndValues.get("ID_CARD")); skipedRow.setInfo("信息已存在,跳过导入"); + skipedRow.setTableName(targetTableName); skipedRows.get().get(targetTableName).add(skipedRow); continue; @@ -444,6 +479,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res errorRow.setName(columnAndValues.get("NAME")); errorRow.setIdCard(columnAndValues.get("ID_CARD")); errorRow.setErrorInfo(errorMsg); + errorRow.setTableName(targetTableName); errorRows.get().get(targetTableName).add(errorRow); } finally { columnAndValues.clear(); @@ -852,5 +888,29 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res map.put(icResiUserTableEnum.getMainTableFlagColumnName(), true); icResiUserDao.upTable("ic_resi_user", resiUserId, map); } - + + /** + * 下载导入结果 + * @param response + * @throws IOException + */ + public void downLoadResults(HttpServletResponse response) throws IOException { + //public static final ThreadLocal>> errorRows = new ThreadLocal<>(); + + String fileName = "导入失败条目清单.xls"; + response.setHeader("content-Type", "application/vnd.ms-excel"); + response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); + + LinkedList list = new LinkedList<>(); + for (Map.Entry> entry : errorRows.get().entrySet()) { + list.addAll(entry.getValue()); + } + + list.forEach(row -> row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment())); + + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的条目列表","导入失败"), + ErrorRow.class, list); + + workbook.write(response.getOutputStream()); + } } From d1a1470997fdef5b49181a7d518545334e66be0e Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Sun, 7 Nov 2021 22:03:08 +0800 Subject: [PATCH 135/253] =?UTF-8?q?=E8=B0=83=E6=95=B4url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcResiUserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 0428c20b84..23d7cdfe47 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -252,7 +252,7 @@ public class IcResiUserController { * * @return */ - @PostMapping("import/excel") + @PostMapping("importExcel") public void importExcelByEasyExcel(@RequestPart("file") MultipartFile file, HttpServletResponse response) { if (file.isEmpty()) { throw new RenException("请上传文件"); From e2fd04117924f74bee7687a5dfe7d3066d9064c0 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 8 Nov 2021 10:14:34 +0800 Subject: [PATCH 136/253] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=BF=97=E6=84=BF?= =?UTF-8?q?=E8=80=85=E7=B1=BB=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/feign/OperCustomizeOpenFeignClient.java | 10 +++++++++- .../OperCustomizeOpenFeignClientFallback.java | 5 +++++ .../controller/IcFormItemOptionsController.java | 11 +++++++++++ .../java/com/epmet/dao/IcFormItemOptionsDao.java | 13 ++++++++++++- .../epmet/service/IcFormItemOptionsService.java | 8 ++++++++ .../impl/IcFormItemOptionsServiceImpl.java | 11 +++++++++++ .../resources/mapper/IcFormItemOptionsDao.xml | 15 +++++++++++++-- 7 files changed, 69 insertions(+), 4 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 519594fb62..ecfe051d35 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -16,6 +16,7 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Set; @@ -113,6 +114,13 @@ public interface OperCustomizeOpenFeignClient { @PostMapping("/oper/customize/resicategorystatsconfig/resicategorywarninfobyid") Result resiCategoryWarnInfoById(@RequestBody IcResiCategoryWarnConfigDTO dto); - + /** + * @Description 查询志愿者类型 + * @param volunteers + * @author zxc + * @date 2021/11/8 10:02 上午 + */ + @PostMapping("/oper/customize/icformitemoptions/volunteerlabelbyvalues") + Result> volunteerLabelByValues(@RequestBody List volunteers,@RequestParam("customerId") String customerId); } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index cad357aca5..b1cc198c20 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -101,4 +101,9 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe public Result resiCategoryWarnInfoById(IcResiCategoryWarnConfigDTO dto) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryWarnInfoById",dto); } + + @Override + public Result> volunteerLabelByValues(List volunteers,String customerId) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "volunteerLabelByValues",volunteers,customerId); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java index 5d70a901d7..262255826a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormItemOptionsController.java @@ -91,4 +91,15 @@ public class IcFormItemOptionsController { ExcelUtils.exportExcelToTarget(response, null, list, IcFormItemOptionsExcel.class); } + /** + * @Description 查询志愿者类型 + * @param volunteers + * @author zxc + * @date 2021/11/8 10:02 上午 + */ + @PostMapping("volunteerlabelbyvalues") + public Result> volunteerLabelByValues(@RequestBody List volunteers,@RequestParam("customerId") String customerId){ + return new Result>().ok(icFormItemOptionsService.volunteerLabelByValues(volunteers,customerId)); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java index 3609c41f9e..d731505e3d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormItemOptionsDao.java @@ -20,6 +20,9 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.entity.IcFormItemOptionsEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 表单项的选项 @@ -29,5 +32,13 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface IcFormItemOptionsDao extends BaseDao { - + + /** + * @Description 查询志愿者类型 + * @param volunteers + * @author zxc + * @date 2021/11/8 10:02 上午 + */ + List volunteerLabelByValues(@Param("volunteers") List volunteers,@Param("customerId")String customerId); + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java index 0ffe8fa5ea..387cc05412 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormItemOptionsService.java @@ -92,4 +92,12 @@ public interface IcFormItemOptionsService extends BaseService volunteerLabelByValues(List volunteers, String customerId); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java index c7ed24cd3d..144e56e568 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormItemOptionsServiceImpl.java @@ -97,4 +97,15 @@ public class IcFormItemOptionsServiceImpl extends BaseServiceImpl volunteerLabelByValues(List volunteers,String customerId) { + return baseDao.volunteerLabelByValues(volunteers,customerId); + } + } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml index 910d1f833f..36daa2158d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormItemOptionsDao.xml @@ -3,6 +3,17 @@ - - + + \ No newline at end of file From 9e3faebf7c1adfec72c7a4a49d0f8bab0737c4f0 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 8 Nov 2021 10:52:52 +0800 Subject: [PATCH 137/253] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/result/PersonDataResultDTO.java | 6 ++++ .../service/impl/IcResiUserServiceImpl.java | 33 ++++++++++++++++--- .../main/resources/mapper/IcResiUserDao.xml | 11 +++++-- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java index 9cc92f1a37..bde896c27c 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PersonDataResultDTO.java @@ -78,4 +78,10 @@ public class PersonDataResultDTO implements Serializable { */ @JsonIgnore private String isVolunteer; + + @JsonIgnore + private String customerId; + + @JsonIgnore + private String gridId; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 18c8896477..ae1e48c735 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -31,7 +31,9 @@ import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.enums.RelationshipEnum; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerOrgRedis; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; +import com.epmet.commons.tools.redis.common.bean.GridInfoCache; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; @@ -496,12 +498,33 @@ public class IcResiUserServiceImpl extends BaseServiceImpl volunteers = baseDao.selectVolunteerByUserId(formDTO.getUserId()); - volunteers.forEach(v -> { - - }); + List volunteerList = baseDao.selectVolunteerByUserId(formDTO.getUserId()); + if (!CollectionUtils.isEmpty(volunteerList)){ + List volunteers = new ArrayList<>(); + List finalVolunteers = volunteers; + volunteerList.forEach(v -> { + List collect = Arrays.stream(v.split(",")).collect(Collectors.toList()); + finalVolunteers.addAll(collect); + }); + volunteers = volunteers.stream().distinct().collect(Collectors.toList()); + // 去customize 查询志愿者类别 + Result> volunteerResult = operCustomizeOpenFeignClient.volunteerLabelByValues(volunteers, personData.getCustomerId()); + if (!volunteerResult.success()){ + throw new RenException("查询志愿者类别失败..."); + } + personData.setVolunteerCategory(volunteerResult.getData()); + } } - // TODO + // 网格名 + GridInfoCache gridInfo = CustomerOrgRedis.getGridInfo(personData.getGridId()); + if (null != gridInfo){ + personData.setGridName(gridInfo.getGridNamePath()); + } + /** + * 人员类别 + * 先查询customize配置的 + * 再根据配置去查询字段 + */ return personData; } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 319743fe3e..87ecaf57ca 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -153,6 +153,10 @@ + + + + @@ -160,11 +164,14 @@ SELECT VOLUNTEER_CATEGORY FROM ic_volunteer WHERE DEL_FLAG = '0' AND ic_resi_user = #{userId} + + + \ No newline at end of file From 3ea4aac18ce00e37ba2f6e7898d7e68f762b7282 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Mon, 8 Nov 2021 14:47:53 +0800 Subject: [PATCH 142/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20icform/it?= =?UTF-8?q?ems=E5=A2=9E=E5=8A=A0redis=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 10 ++++++++ .../epmet/service/impl/IcFormServiceImpl.java | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 62557e2892..423ac83966 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -593,4 +593,14 @@ public class RedisKeys { public static String getIcFormKeyForExport(String formCode,String customerId) { return rootPrefix.concat("icform:").concat(formCode).concat(":export:").concat(customerId); } + + /** + * icd form items key + * @param customerId + * @param formCode + * @return + */ + public static String getIcFormItemsKey(String customerId, String formCode) { + return rootPrefix.concat("icform:").concat(formCode).concat(":items:").concat(customerId); + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index 06da023015..1170a08309 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -17,6 +17,9 @@ package com.epmet.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; @@ -24,6 +27,8 @@ import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcFormDao; import com.epmet.dto.IcFormDTO; @@ -36,12 +41,15 @@ import com.epmet.redis.CustomerFootBarRedis; import com.epmet.service.IcFormService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Optional; /** * 配置表单 @@ -53,6 +61,9 @@ import java.util.Map; public class IcFormServiceImpl extends BaseServiceImpl implements IcFormService { @Autowired private CustomerFootBarRedis customerFootBarRedis; + + @Autowired + private RedisUtils redisUtils; @Override public PageData page(Map params) { @@ -134,6 +145,16 @@ public class IcFormServiceImpl extends BaseServiceImpl @Override public List listItems(String customerId, String formCode) { + // 从redis取 + String icFormItemsKey = RedisKeys.getIcFormItemsKey(customerId, formCode); + + Object objValue = redisUtils.get(icFormItemsKey); + if (objValue != null) { + return ((JSONArray) objValue).toJavaList(FormItem.class); + //return JSON.parseObject((String) objValue, type); + } + + // 从db取 CustomerFormResultDTO formResultDto=baseDao.selectByCode(customerId, formCode); if (null == formResultDto) { throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); @@ -143,6 +164,9 @@ public class IcFormServiceImpl extends BaseServiceImpl formItems.forEach(i -> { i.setOptions(baseDao.selectListOption(i.getItemId())); }); + + // 缓存 + redisUtils.set(icFormItemsKey, formItems); return formItems; } From 3063afb3a0090891a16a70239f6e996beeee9539 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 8 Nov 2021 16:24:51 +0800 Subject: [PATCH 143/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E5=AE=B6=E5=BA=AD=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=88=BF=E5=B1=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcHouseServiceImpl.java | 8 ++++---- .../java/com/epmet/feign/EpmetUserOpenFeignClient.java | 2 +- .../java/com/epmet/controller/IcResiUserController.java | 6 +++--- .../src/main/java/com/epmet/dao/IcResiUserDao.java | 2 +- .../main/java/com/epmet/service/IcResiUserService.java | 4 ++-- .../com/epmet/service/impl/IcResiUserServiceImpl.java | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 2858eb6d31..0dbfa5796a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -191,21 +191,21 @@ public class IcHouseServiceImpl extends BaseServiceImpl>> resultMap = epmetUserOpenFeignClient.getHomeUserCategoryCount(userDTO); + Result>> resultMap = epmetUserOpenFeignClient.getHomeUserCategoryCount(userDTO); if (!resultMap.success()) { throw new RenException(resultMap.getCode(), resultMap.getMsg()); } - Map> map = resultMap.getData(); + Map> map = resultMap.getData(); return list.stream().map(item -> { - Map countMap = map.get(item.getId()); + Map countMap = map.get(item.getId()); HouseListResultDTO dto = new HouseListResultDTO(); dto.setHouseId(item.getId()); dto.setHouseName(item.getHouseName()); List categories = new ArrayList<>(); if (null != countMap && CollectionUtils.isNotEmpty(categoryList)) { for (IcResiCategoryStatsConfigDTO category : categoryList) { - if (null == countMap.get(category.getColumnName()) || countMap.get(category.getColumnName()) == NumConstant.ZERO) { + if (null == countMap.get(category.getColumnName()) || NumConstant.ZERO_STR.equals(countMap.get(category.getColumnName()))) { continue; } HouseListResultDTO.CategoryListBean bean = new HouseListResultDTO.CategoryListBean(); diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index 26fe630e6e..5637b6b765 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -652,5 +652,5 @@ public interface EpmetUserOpenFeignClient { Result> getDemandOptions(); @PostMapping("/epmetuser/icresiuser/categorycount") - Result>> getHomeUserCategoryCount(@RequestBody IcResiUserDTO formDTO); + Result>> getHomeUserCategoryCount(@RequestBody IcResiUserDTO formDTO); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index d1fa95e43a..24c8b5b5fe 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -346,13 +346,13 @@ public class IcResiUserController { /** * @Description 获取一栋楼每个房间人员分类的数量 * @Param formDTO - * @Return {@link Result< Map< String, Map< String, Integer>>>} + * @Return {@link Result< Map< String, Map< String, String>>>} * @Author zhaoqifeng * @Date 2021/11/5 15:10 */ @PostMapping("categorycount") - public Result>> getHomeUserCategoryCount(@RequestBody IcResiUserDTO formDTO) { - return new Result>>().ok(icResiUserService.getHomeUserCategoryCount(formDTO.getBuildId())); + public Result>> getHomeUserCategoryCount(@RequestBody IcResiUserDTO formDTO) { + return new Result>>().ok(icResiUserService.getHomeUserCategoryCount(formDTO.getBuildId())); } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index c3ed3df1f9..db7344b6ea 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -123,7 +123,7 @@ public interface IcResiUserDao extends BaseDao { String selectCategoryNames(@Param("customerId") String customerId,@Param("codeSet") Set codeSet); @MapKey("HOME_ID") - Map> getHomeUserCategoryCount(@Param("buildId") String buildId); + Map> getHomeUserCategoryCount(@Param("buildId") String buildId); /** * @Description 根据userId查询志愿者 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 76a6a24618..0f82258bf0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -125,9 +125,9 @@ public interface IcResiUserService extends BaseService { /** * @Description 获取一栋楼每个房间人员分类的数量 * @Param buildId - * @Return {@link Map< String, Map< String, Integer>>} + * @Return {@link Map< String, Map< String, String>>} * @Author zhaoqifeng * @Date 2021/11/5 14:40 */ - Map> getHomeUserCategoryCount(String buildId); + Map> getHomeUserCategoryCount(String buildId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 0ad386f461..d91d541047 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -759,12 +759,12 @@ public class IcResiUserServiceImpl extends BaseServiceImpl>} + * @Return {@link Map>} * @Author zhaoqifeng * @Date 2021/11/5 14:40 */ @Override - public Map> getHomeUserCategoryCount(String buildId) { + public Map> getHomeUserCategoryCount(String buildId) { return baseDao.getHomeUserCategoryCount(buildId); } } From 2cc38c1cc32a77503f592d58b3ce1a22b6182223 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 8 Nov 2021 16:29:03 +0800 Subject: [PATCH 144/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E5=AE=B6=E5=BA=AD=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=88=BF=E5=B1=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index 3db8c923f9..e339f2e83b 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -471,7 +471,7 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien } @Override - public Result>> getHomeUserCategoryCount(IcResiUserDTO formDTO) { + public Result>> getHomeUserCategoryCount(IcResiUserDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getHomeUserCategoryCount", formDTO); } } From 85b0d265031e8d2b52209eb18a4fe010000867af Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 8 Nov 2021 16:57:34 +0800 Subject: [PATCH 145/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E6=90=9C=E7=B4=A2=E4=BA=BA=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcResiUserDao.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 427665134c..569880f604 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -179,9 +179,7 @@ - + select count(*) from ic_building b + where b.del_flag='0' + AND b.NEIGHBOR_HOOD_ID = #{neighborHoodId} + and b.BUILDING_NAME=#{buildingName} + + and b.id !=#{buildingId} + - \ No newline at end of file From 5d880c618daaaefebd1497af0b8381bfec3fe4eb Mon Sep 17 00:00:00 2001 From: lzh Date: Mon, 8 Nov 2021 19:31:36 +0800 Subject: [PATCH 147/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=99=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E4=BA=86=EF=BC=8C=E9=87=8D=E6=96=B0=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dao/IcBuildingDao.java | 2 ++ .../service/impl/BuildingServiceImpl.java | 5 +++++ .../main/resources/mapper/IcBuildingDao.xml | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java index 7b45531a0d..e0fce5c740 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -20,6 +20,7 @@ package com.epmet.dao; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.result.BaseInfoFamilyBuildingResultDTO; +import com.epmet.dto.result.BuildingResultDTO; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; @@ -68,4 +69,5 @@ public interface IcBuildingDao extends BaseDao { List baseInfoFamilyBuilding(@Param("neighborHoodId")String neighborHoodId); Integer checkBuildName(@Param("neighborHoodId") String neighborHoodId,@Param("buildingName")String buildingName, @Param("buildingId")String buildingId); + List buildingListByIds(@Param("buildingIdList") List buildingIdList); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index a63374684f..97e77a066e 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -13,6 +13,7 @@ import com.epmet.dto.CustomerStaffAgencyDTO; import com.epmet.dto.IcBuildingDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; +import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; import com.epmet.enums.BuildingTypeEnums; @@ -283,6 +284,10 @@ public class BuildingServiceImpl implements BuildingService { ExcelPoiUtils.exportExcel(templatePath ,map,"楼宇信息录入表",response); return ; } + @Override + public List buildingListByIds(List buildingIdList) { + return icBuildingDao.buildingListByIds(buildingIdList); + } private List searchAllBuilding(ListIcNeighborHoodFormDTO formDTO) { // QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index e937bff689..3c4022ea6f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -310,4 +310,24 @@ + + \ No newline at end of file From c7a1d433ab18be17a055260be4922655cb769494 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 9 Nov 2021 09:00:19 +0800 Subject: [PATCH 148/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E5=90=8D=E5=92=8C?= =?UTF-8?q?=E9=97=A8=E7=89=8C=E5=8F=B7=E5=94=AF=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/exception/EpmetErrorCode.java | 2 ++ .../src/main/java/com/epmet/dao/IcHouseDao.java | 5 +++++ .../main/java/com/epmet/dao/IcNeighborHoodDao.java | 7 ++++--- .../com/epmet/service/impl/HouseServiceImpl.java | 13 ++++++++++++- .../epmet/service/impl/NeighborHoodServiceImpl.java | 11 +++++++++++ .../src/main/resources/mapper/IcHouseDao.xml | 13 +++++++++++++ .../src/main/resources/mapper/IcNeighborHoodDao.xml | 12 +++++++++++- 7 files changed, 58 insertions(+), 5 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index 32c906e323..b57a5c8584 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -80,6 +80,8 @@ public enum EpmetErrorCode { CUSTOMER_FORM_NOT_EXITS(8213,"客户未配置表单"), RESI_NOT_FOUND(8214,"居民信息找不到"), BUILDING_NAME_EXITED(8215,"楼栋名称已存在"), + DOOR_NAME_EXITED(8216,"门牌号已存在"), + NEIGHBOOR_NAME_EXITED(8217,"小区名称已存在"), REQUIRE_PERMISSION(8301, "您没有足够的操作权限"), THIRD_PLAT_REQUEST_ERROR(8302, "请求第三方平台错误"), diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java index 07ca76c21c..1553cccc9d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcHouseDao.java @@ -61,4 +61,9 @@ public interface IcHouseDao extends BaseDao { */ List selectHouseInfoByIdCard(@Param("idCard") String idCard); + Integer checkDoorNameUq(@Param("neighborHoodId") String neighborHoodId, + @Param("buildingId")String buildingId, + @Param("buildingUnitId")String buildingUnitId, + @Param("doorName")String doorName, + @Param("houseId")String houseId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java index 4da3423f9d..19e30210ae 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java @@ -17,9 +17,7 @@ package com.epmet.dao; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.entity.IcHouseEntity; import com.epmet.entity.IcNeighborHoodEntity; @@ -29,7 +27,6 @@ import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; -import java.util.Set; /** * 小区表 @@ -49,4 +46,8 @@ public interface IcNeighborHoodDao extends BaseDao { List selectListByName(@Param("neighborNameList")List neighborNameList, @Param("agencyNameList") List agencyNameList, @Param("gridNameList") List gridNameList); + + Integer checkNameUq(@Param("customerId") String customerId, + @Param("neighborHoodName")String neighborHoodName, + @Param("neighborId")String neighborId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index b481f048e0..25ccc57ca9 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -3,7 +3,8 @@ package com.epmet.service.impl; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.epmet.commons.tools.enums.HouseTypeEnum; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcBuildingDao; import com.epmet.dao.IcBuildingUnitDao; @@ -63,6 +64,11 @@ public class HouseServiceImpl implements HouseService { @Override @Transactional(rollbackFor = Exception.class) public void addHouse(String customerId, IcHouseFormDTO formDTO) { + //同一楼栋,单元内,房屋名称唯一 + Integer count = icHouseDao.checkDoorNameUq(formDTO.getNeighborHoodId(), formDTO.getBuildingId(), formDTO.getBuildingUnitId(), formDTO.getDoorName(),null); + if (null != count && count > 0) { + throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + } IcHouseDTO icHouseDTO= ConvertUtils.sourceToTarget(formDTO, IcHouseDTO.class); icHouseDTO.setCustomerId(customerId); // icHouseDTO.setRentFlag(formDTO.getRentFlag()); @@ -89,6 +95,11 @@ public class HouseServiceImpl implements HouseService { @Override @Transactional(rollbackFor = Exception.class) public void updateHouse(String customerId, IcHouseFormDTO formDTO) { + //同一楼栋,单元内,房屋名称唯一 + Integer count = icHouseDao.checkDoorNameUq(formDTO.getNeighborHoodId(), formDTO.getBuildingId(), formDTO.getBuildingUnitId(),formDTO.getDoorName(), formDTO.getHouseId()); + if (null != count && count > 0) { + throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + } IcHouseDTO icHouseDTO = ConvertUtils.sourceToTarget(formDTO, IcHouseDTO.class); icHouseDTO.setId(formDTO.getHouseId()); icHouseDTO.setCustomerId(customerId); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index 00d96f74f6..d6615145dd 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -69,6 +69,11 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { @Override @Transactional(rollbackFor = Exception.class) public void AddNeighborhood(String customerId, IcNeighborHoodFormDTO formDTO) { + //同一客户下,小区名称唯一 + Integer count = icNeighborHoodDao.checkNameUq(customerId,formDTO.getNeighborHoodName(),null); + if (null != count && count > 0) { + throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + } IcNeighborHoodDTO icNeighborHoodDTO = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodDTO.class); icNeighborHoodDTO.setCustomerId(customerId); Result customerAgencyResult = govOrgOpenFeignClient.getAgencyById(icNeighborHoodDTO.getAgencyId()); @@ -153,6 +158,12 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { @Override @Transactional(rollbackFor = Exception.class) public void UpdateNeighborhood(String customerId, IcNeighborHoodFormDTO formDTO) { + //同一客户下,小区名称唯一 + Integer count = icNeighborHoodDao.checkNameUq(customerId,formDTO.getNeighborHoodName(),formDTO.getNeighborHoodId()); + if (null != count && count > 0) { + throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + } + IcNeighborHoodDTO icNeighborHoodDTO = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodDTO.class); icNeighborHoodDTO.setId(formDTO.getNeighborHoodId()); icNeighborHoodDTO.setCustomerId(customerId); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index e150566f8a..08cf9c92a5 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -264,4 +264,17 @@ WHERE ih.DEL_FLAG = '0' AND ih.OWNER_ID_CARD = #{idCard} + + \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index 342b567ba7..6b8df1f796 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -200,5 +200,15 @@ - + \ No newline at end of file From 08ad7e651ea3fb7d0feb5e1791e0dd2c3ab3c099 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 9 Nov 2021 09:14:35 +0800 Subject: [PATCH 149/253] =?UTF-8?q?@PostMapping("buildingunitlist")?= =?UTF-8?q?=E6=89=BE=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/BuildingController.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index c3222f2ad4..763abf8efc 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -22,40 +22,30 @@ import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; -import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; -import com.epmet.constant.NeighborhoodConstant; import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dto.BuildingTreeLevelDTO; -import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.IcBulidingUnitFormDTO; -import com.epmet.dto.form.IcNeighborHoodFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.IcBuildingUnitEntity; import com.epmet.excel.IcBuildingExcel; -import com.epmet.excel.IcHouseExcel; -import com.epmet.excel.IcNeighborHoodExcel; import com.epmet.service.BuildingService; import com.epmet.service.IcBuildingService; -import com.epmet.service.IcNeighborHoodService; import com.epmet.service.NeighborHoodService; import com.epmet.util.ExcelPoiUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; @@ -207,7 +197,7 @@ public class BuildingController { * @return * @throws IOException */ - + @PostMapping("buildingunitlist") public Result buildingunitlist(@LoginUser TokenDto tokenDTO,@RequestBody IcBulidingUnitFormDTO icBulidingUnitFormDTO ){ ValidatorUtils.validateEntity(icBulidingUnitFormDTO); List icBuildingUnitEntityList = icBuildingUnitDao.selectList(new QueryWrapper().lambda().eq(IcBuildingUnitEntity::getBuildingId, icBulidingUnitFormDTO.getBuildingId()).orderByAsc(IcBuildingUnitEntity::getUnitNum)); From a5a5e244495e77bbfe3dd2e7932f4306173f70e8 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 9 Nov 2021 09:48:12 +0800 Subject: [PATCH 150/253] fadignding --- .../gov-org-server/src/main/resources/logback-spring.xml | 4 ++-- .../src/main/resources/mapper/IcNeighborHoodDao.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/logback-spring.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/logback-spring.xml index 6c2d82a05b..24d44d88f9 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/logback-spring.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/logback-spring.xml @@ -128,14 +128,14 @@ 15 - + diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index 6b8df1f796..dba659f38c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -202,7 +202,7 @@ - \ No newline at end of file + diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index 790d22ecf2..dcd727ce13 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -21,7 +21,7 @@ com.alibaba easyexcel - 2.2.10 + 3.0.3 poi diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 24c8b5b5fe..044e03f476 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -19,6 +19,12 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.converters.date.DateDateConverter; +import com.alibaba.excel.converters.date.DateStringConverter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.exception.EpmetErrorCode; @@ -35,6 +41,7 @@ import com.epmet.dto.result.*; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; +import com.epmet.util.TestFileUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; @@ -48,6 +55,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; @@ -221,6 +229,7 @@ public class IcResiUserController { Map> sheetMap = new HashMap<>(); Map mapData = new HashMap<>(); mapData.put("list", resiMainList.values()); + System.out.println("========="+JSON.toJSONString(resiMainList.values())); sheetMap.put(0, mapData); AtomicInteger n = new AtomicInteger(); for (FormItem item : resiFormItems.getItemList()) { @@ -233,6 +242,7 @@ public class IcResiUserController { Map mapData2 = new HashMap<>(); mapData2.put("list", resiChildMap.values()); + System.out.println("========="+JSON.toJSONString(mapData2)); sheetMap.put(n.incrementAndGet(), mapData2); } } @@ -247,6 +257,152 @@ public class IcResiUserController { workbook.write(response.getOutputStream()); } + @RequestMapping(value = "/exportExcel2") + public void exportExcelByEasyExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + pageFormDTO.setCustomerId(customerId); + pageFormDTO.setPageFlag(false); + CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); + + Map> otherSheetItems = new HashMap<>(); + + //主表的 + for (FormItem formItem : resiFormItems.getItemList()) { + if (StringUtils.isBlank(formItem.getColumnName())) { + continue; + } + + Map itemMap = otherSheetItems.getOrDefault(formItem.getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(formItem.getTableName(), itemMap); + if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select") || formItem.getItemType().equals("radio")) { + itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); + } + if (formItem.getChildGroup() != null) { + itemMap = otherSheetItems.getOrDefault(formItem.getChildGroup().getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(formItem.getChildGroup().getTableName(), itemMap); + for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { + if (StringUtils.isBlank(item2.getColumnName())) { + continue; + } + + if ("checkbox".equals(item2.getItemType()) || "select".equals(item2.getItemType()) || "radio".equals(item2.getItemType())) { + itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2, FormItem.class)); + } + } + + } + } + //其他sheet + + for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { + if (groupItem.getItemList() == null) { + continue; + } + Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(groupItem.getTableName(), itemMap); + for (FormItem2 formItem2 : groupItem.getItemList()) { + if (StringUtils.isBlank(formItem2.getColumnName())) { + continue; + } + if ("checkbox".equals(formItem2.getItemType()) || "select".equals(formItem2.getItemType()) || "radio".equals(formItem2.getItemType())) { + itemMap.put(formItem2.getColumnName().concat(formItem2.getColumnNum() == 0 ? "" : formItem2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItem2, FormItem.class)); + } + } + } + + Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + + //========================================= + + + // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 + // {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list + +// String templatePath = "/excel/ic_resi_info_cid_for_easy_excel.xls"; +// String s1 = this.getClass().getResource(templatePath).getPath(); +// System.out.println("模版路径:"+s1); +// +// String templateFileName = s1; +// System.out.println("=templateFileName=="+templateFileName); +// String fileName = TestFileUtil.getPath() + "/excel/ic_resi_info_cid_for_easy_excel0000.xls"; +// System.out.println(fileName); +// ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); +// WriteSheet writeSheet = EasyExcel.writerSheet(0).build(); +// WriteSheet build = EasyExcel.writerSheet(1).build(); +// // 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹 +// excelWriter.fill(new FillWrapper("t1", resiMainList.values()), writeSheet); +// excelWriter.fill(new FillWrapper("t2", resiMainList.values()), build); + + // 别忘记关闭流 + //excelWriter.finish(); + //EasyExcel.write(new File(fileName)); + //========================================= + //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); + String originValue = JSON.toJSONString(resiMainList.values()); + System.out.println("========="+ originValue); + String templatePath = "/excel/ic_resi_info_cid_for_easy_excel.xls"; + String s1 = this.getClass().getResource(templatePath).getPath(); + System.out.println("模版路径:"+s1); + //TemplateExportParams params = new TemplateExportParams(templatePath, true); + String fileName = TestFileUtil.getPath() + "compositeFill" + "ic_resi_info_cid_for_easy_excel.xls"; + fileName = "/Users/liujianjun/Downloads/ic_resi_info_cid_for_easy_excel2.xls"; + System.out.println("fileName======="+fileName); + //String fileName = "居民基本信息.xls"; + ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).registerConverter(new DateStringConverter()).registerConverter(new DateDateConverter()).withTemplate(s1).build(); + //ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(s1).build(); + WriteSheet fistSheet = EasyExcel.writerSheet(0).build(); + try { + excelWriter.fill(new FillWrapper("t1", resiMainList.values()), fistSheet); + } catch (Exception e) { + e.printStackTrace(); + } + + //======================================= + + /* Map> sheetMap = new HashMap<>(); + Map mapData = new HashMap<>(); + mapData.put("list", resiMainList.values()); + System.out.println("========="+JSON.toJSONString(resiMainList.values())); + sheetMap.put(0, mapData);*/ + AtomicInteger n = new AtomicInteger(); + for (FormItem item : resiFormItems.getItemList()) { + + if (item.getChildGroup() != null) { + if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { + Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); + resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); + + /*Map mapData2 = new HashMap<>(); + mapData2.put("list", resiChildMap.values()); + System.out.println("========="+JSON.toJSONString(mapData2)); + sheetMap.put(n.incrementAndGet(), mapData2);*/ + int sheetNo = n.incrementAndGet(); + WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build(); + System.out.println("======"+JSON.toJSONString(resiChildMap.values())); + excelWriter.fill(new FillWrapper("t"+(sheetNo+1), resiChildMap.values()), writeSheet); + } + } + } + + /* Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); + workbook.setActiveSheet(0);*/ + excelWriter.finish(); + + + /* response.setHeader("content-Type", "application/vnd.ms-excel"); + response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); + workbook.write(response.getOutputStream());*/ + } + private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception { + fileName = URLEncoder.encode(fileName, "UTF-8"); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls"); + response.addHeader("Access-Control-Expose-Headers", "Content-disposition"); + + return response.getOutputStream(); + } + /** * excel导入居民基本信息 * diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index d91d541047..4b2a407e7e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -17,7 +17,6 @@ package com.epmet.service.impl; -import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -37,16 +36,13 @@ import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.redis.common.bean.GridInfoCache; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.IcPlatformConstant; import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.CustomerGridDTO; -import com.epmet.dto.IcHouseDTO; -import com.epmet.dto.IcResiCategoryStatsConfigDTO; -import com.epmet.dto.IcNeighborHoodDTO; +import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; @@ -59,11 +55,12 @@ import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.sql.Date; +import java.sql.Timestamp; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -623,6 +620,15 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions); Map> result = new LinkedHashMap<>(); mapList.stream().filter(Objects::nonNull).forEach(map -> { + map.forEach((k,o) -> { + if (o instanceof java.sql.Date){ + o = DateUtils.format(((Date) o),DateUtils.DATE_PATTERN); + } + if (o instanceof java.sql.Timestamp){ + o = DateUtils.format(new Date(((Timestamp) o).getTime()),DateUtils.DATE_TIME_PATTERN); + } + map.put(k,o); + }); String resiId = (String) map.getOrDefault(UserConstant.IC_RESI_USER, ""); if ("ic_resi_user".equals(baseTableName)) { @@ -707,7 +713,7 @@ public class IcResiUserServiceImpl extends BaseServiceImplBBjt4&UgS@DvlqMS2%LWPDgp`>`UT#k~bQ%EQ(@z_~82~9L1%dV8NzPqV80-WW5WN5C8SeY(T&U%b-AJ>bzFF-)^twgIP^2N_4J zeHd_(b@C*Kmif=Evbzsty6>4U(Ag<_GLG%`JZ$YJTXG&TZ2aoW7xG(2$xy=Jm`LAE zS60zVFp>qadGV)ZYbs`!FN>|%xea{Kf44$7@~CWoePnSp(ke4C#JY2S zZbJ%yIY^s5qEI}aSc?}LgYvOG?*;BsGeCPQz^zM^eUlF~*7@`4l+7T~7U_BF%O=2<f;v1x4}0wW#&YOjDGQkH?)k=bgKp%S`(tQ~M*+ z<@W|70QzX?rfCEs9hZLg$ zTNy3jE}F z#`>w)J|!H~o`q4mT~Dx1j>LVy4Gnh?S!0QkEGz2vh5N#g^t#q8{sh8ec}&Hr-!{dp zTWz7$c0bLxdFZ6YMH_7)zbmWyGP;`4T258PV)W5k7R|NTqxB<7=zX4cIz8MY78Fn? z@=w*+T-7XXeU0{bku9qn?Ukx{fPUGX5w&x%cYWU640Hc+tUxh3hKy2Q_mD&REp@u*Hi!V0qi`l@`Wt1 zDv-)$gLicnhg;X4N?%X?n>&EI*E;)(o+nG#Ci;{NvI%67g9bi>D&!@sOKFj}TABEm zY6ISCR3m}}lBhsza|NnIoK#<-e6O7;@l{R0x{ZLN8Pq!&C8gFOHls+3=$+76jf{QyfSd(W1!7~G`KE&#-nzVn8wwbrMGVuGJ;T?=TOLkiSP^ANCa7(AxMy~Vz4KTeCK;YB zW~fYSV0ae07e3y=e3GN)Y=2K_19M76`v*c#Q;(Uf8hdnErmLsAk@Xg^&Yqu5%xwM( DQrAiP diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls new file mode 100644 index 0000000000000000000000000000000000000000..01ec6893d33393e51f04c07d53642284f3af7235 GIT binary patch literal 96256 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 literal 0 HcmV?d00001 From 6d18eb4e9f5e158d79551469ccf8a81205769047 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Tue, 9 Nov 2021 15:18:45 +0800 Subject: [PATCH 158/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE=E6=97=B6=E9=97=B4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=BD=AC=E4=B8=BAstr=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/dto/IcEnsureHouseDTO.java | 2 +- .../src/main/java/com/epmet/dto/IcPartyMemberDTO.java | 7 ++++--- .../src/main/java/com/epmet/dto/IcResiUserDTO.java | 8 ++++---- .../src/main/java/com/epmet/dto/IcUnemployedDTO.java | 2 +- .../src/main/java/com/epmet/dto/IcVeteransDTO.java | 9 +++++---- .../java/com/epmet/entity/IcEnsureHouseEntity.java | 5 +---- .../java/com/epmet/entity/IcPartyMemberEntity.java | 7 ++----- .../main/java/com/epmet/entity/IcResiUserEntity.java | 11 ++++------- .../java/com/epmet/entity/IcUnemployedEntity.java | 2 +- .../main/java/com/epmet/entity/IcVeteransEntity.java | 9 +++------ .../main/java/com/epmet/excel/IcEnsureHouseExcel.java | 2 +- .../main/java/com/epmet/excel/IcPartyMemberExcel.java | 4 ++-- .../main/java/com/epmet/excel/IcResiUserExcel.java | 8 ++++---- .../main/java/com/epmet/excel/IcUnemployedExcel.java | 2 +- .../main/java/com/epmet/excel/IcVeteransExcel.java | 6 +++--- 15 files changed, 37 insertions(+), 47 deletions(-) diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java index 0868f00f51..1f53e4206a 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcEnsureHouseDTO.java @@ -61,7 +61,7 @@ public class IcEnsureHouseDTO implements Serializable { /** * 发证日期 */ - private Date fzrq; + private String fzrq; /** * 补贴编号 diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java index 7dd3198144..c5df27c097 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcPartyMemberDTO.java @@ -17,9 +17,10 @@ package com.epmet.dto; +import lombok.Data; + import java.io.Serializable; import java.util.Date; -import lombok.Data; /** @@ -51,12 +52,12 @@ public class IcPartyMemberDTO implements Serializable { /** * 入党时间 */ - private Date rdsj; + private String rdsj; /** * 转正时间 */ - private Date zzsj; + private String zzsj; /** * 所属支部 diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java index 12990d491f..62fa0e45cf 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcResiUserDTO.java @@ -301,7 +301,7 @@ public class IcResiUserDTO implements Serializable { /** * 患大病时间 */ - private Date dbsj; + private String dbsj; /** * 所患慢性病 @@ -311,7 +311,7 @@ public class IcResiUserDTO implements Serializable { /** * 患慢性病时间 */ - private Date mxbsj; + private String mxbsj; /** * 是否参保 @@ -331,7 +331,7 @@ public class IcResiUserDTO implements Serializable { /** * 救助时间[yyyy-MM-dd] */ - private Date jzsj; + private String jzsj; /** * 享受救助明细序号 @@ -356,7 +356,7 @@ public class IcResiUserDTO implements Serializable { /** * 离退休时间 */ - private Date ltxsj; + private String ltxsj; /** * 工作信息备注 diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java index 930d40c706..85a3e63feb 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcUnemployedDTO.java @@ -61,7 +61,7 @@ public class IcUnemployedDTO implements Serializable { /** * 失业时间 */ - private Date sysj; + private String sysj; /** * 失业证号 diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java index 9a0c6399aa..351b60a933 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/IcVeteransDTO.java @@ -17,9 +17,10 @@ package com.epmet.dto; +import lombok.Data; + import java.io.Serializable; import java.util.Date; -import lombok.Data; /** @@ -51,12 +52,12 @@ public class IcVeteransDTO implements Serializable { /** * 入伍时间 */ - private Date rwsj; + private String rwsj; /** * 退伍时间 */ - private Date twsj; + private String twsj; /** * 服役单位 @@ -81,7 +82,7 @@ public class IcVeteransDTO implements Serializable { /** * 参战时间【年月日区间值yyyy-MM-dd~yyyy-MM-dd】 */ - private Date czsj; + private String czsj; /** * 现就业情况 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java index 917382ceb9..be467bddb5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcEnsureHouseEntity.java @@ -18,13 +18,10 @@ 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; - /** * 保障房 * @@ -61,7 +58,7 @@ public class IcEnsureHouseEntity extends BaseEpmetEntity { /** * 发证日期 */ - private Date fzrq; + private String fzrq; /** * 补贴编号 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java index 90b543dd6e..10add799d0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcPartyMemberEntity.java @@ -18,13 +18,10 @@ 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; - /** * 党员 * @@ -51,12 +48,12 @@ public class IcPartyMemberEntity extends BaseEpmetEntity { /** * 入党时间 */ - private Date rdsj; + private String rdsj; /** * 转正时间 */ - private Date zzsj; + private String zzsj; /** * 所属支部 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java index 6f9f7d4068..f647871525 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiUserEntity.java @@ -18,13 +18,10 @@ 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; - /** * 用户基础信息 * @@ -301,7 +298,7 @@ public class IcResiUserEntity extends BaseEpmetEntity { /** * 患大病时间 */ - private Date dbsj; + private String dbsj; /** * 所患慢性病 @@ -311,7 +308,7 @@ public class IcResiUserEntity extends BaseEpmetEntity { /** * 患慢性病时间 */ - private Date mxbsj; + private String mxbsj; /** * 是否参保 @@ -331,7 +328,7 @@ public class IcResiUserEntity extends BaseEpmetEntity { /** * 救助时间[yyyy-MM-dd] */ - private Date jzsj; + private String jzsj; /** * 享受救助明细序号 @@ -356,7 +353,7 @@ public class IcResiUserEntity extends BaseEpmetEntity { /** * 离退休时间 */ - private Date ltxsj; + private String ltxsj; /** * 工作信息备注 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java index c81f359e09..9e00e6527f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcUnemployedEntity.java @@ -61,7 +61,7 @@ public class IcUnemployedEntity extends BaseEpmetEntity { /** * 失业时间 */ - private Date sysj; + private String sysj; /** * 失业证号 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java index 68720a6be5..076d6f33fe 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcVeteransEntity.java @@ -18,13 +18,10 @@ 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; - /** * 退役军人 * @@ -51,12 +48,12 @@ public class IcVeteransEntity extends BaseEpmetEntity { /** * 入伍时间 */ - private Date rwsj; + private String rwsj; /** * 退伍时间 */ - private Date twsj; + private String twsj; /** * 服役单位 @@ -81,7 +78,7 @@ public class IcVeteransEntity extends BaseEpmetEntity { /** * 参战时间【年月日区间值yyyy-MM-dd~yyyy-MM-dd】 */ - private Date czsj; + private String czsj; /** * 现就业情况 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java index ea5f69f3d3..dd7995d714 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcEnsureHouseExcel.java @@ -47,7 +47,7 @@ public class IcEnsureHouseExcel { private String bzlx; @Excel(name = "发证日期") - private Date fzrq; + private String fzrq; @Excel(name = "补贴编号") private String btbh; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java index 71e3ed92a9..5374d00284 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcPartyMemberExcel.java @@ -41,10 +41,10 @@ public class IcPartyMemberExcel { private String icResiUser; @Excel(name = "入党时间") - private Date rdsj; + private String rdsj; @Excel(name = "转正时间") - private Date zzsj; + private String zzsj; @Excel(name = "所属支部") private String sszb; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java index a3abac4d57..217223a4bb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcResiUserExcel.java @@ -188,13 +188,13 @@ public class IcResiUserExcel { private String shdb; @Excel(name = "患大病时间") - private Date dbsj; + private String dbsj; @Excel(name = "所患慢性病") private String shmxb; @Excel(name = "患慢性病时间") - private Date mxbsj; + private String mxbsj; @Excel(name = "是否参保") private String isCb; @@ -206,7 +206,7 @@ public class IcResiUserExcel { private String jzje; @Excel(name = "救助时间[yyyy-MM-dd]") - private Date jzsj; + private String jzsj; @Excel(name = "享受救助明细序号") private String jzmxxh; @@ -221,7 +221,7 @@ public class IcResiUserExcel { private String zy; @Excel(name = "离退休时间") - private Date ltxsj; + private String ltxsj; @Excel(name = "工作信息备注") private String workRemake; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java index 9c1b4d7e00..91556105d9 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcUnemployedExcel.java @@ -47,7 +47,7 @@ public class IcUnemployedExcel { private String syrylb; @Excel(name = "失业时间") - private Date sysj; + private String sysj; @Excel(name = "失业证号") private String syzh; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java index 8a290d5b3e..3109a7fa4d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcVeteransExcel.java @@ -41,10 +41,10 @@ public class IcVeteransExcel { private String icResiUser; @Excel(name = "入伍时间") - private Date rwsj; + private String rwsj; @Excel(name = "退伍时间") - private Date twsj; + private String twsj; @Excel(name = "服役单位") private String fydw; @@ -59,7 +59,7 @@ public class IcVeteransExcel { private String pxzk; @Excel(name = "参战时间【年月日区间值yyyy-MM-dd~yyyy-MM-dd】") - private Date czsj; + private String czsj; @Excel(name = "现就业情况") private String xjyqk; From 00a495a73ba328dce5b6bb231bd0add66cddac45 Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 9 Nov 2021 16:17:04 +0800 Subject: [PATCH 159/253] =?UTF-8?q?=E6=8A=A5=E9=94=99=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/read/CustomStringStringConverter.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/read/CustomStringStringConverter.java b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/read/CustomStringStringConverter.java index 584e563a77..8f17f53f13 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/read/CustomStringStringConverter.java +++ b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/read/CustomStringStringConverter.java @@ -2,8 +2,9 @@ package com.epmet.stats.test.read; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; /** @@ -13,7 +14,7 @@ import com.alibaba.excel.metadata.property.ExcelContentProperty; */ public class CustomStringStringConverter implements Converter { @Override - public Class supportJavaTypeKey() { + public Class supportJavaTypeKey() { return String.class; } @@ -34,8 +35,8 @@ public class CustomStringStringConverter implements Converter { * @return */ @Override - public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, - GlobalConfiguration globalConfiguration) { + public String convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { return "自定义:" + cellData.getStringValue(); } @@ -51,9 +52,9 @@ public class CustomStringStringConverter implements Converter { * @return */ @Override - public CellData convertToExcelData(String value, ExcelContentProperty contentProperty, - GlobalConfiguration globalConfiguration) { - return new CellData(value); + public WriteCellData convertToExcelData(String value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(value); } } From 6dd3f8979380367d822ed9e239764405cfe2fff6 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 9 Nov 2021 16:20:07 +0800 Subject: [PATCH 160/253] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/excel/building_template.xlsx | Bin 12353 -> 12352 bytes .../main/resources/excel/house_template.xlsx | Bin 11451 -> 11401 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_template.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/building_template.xlsx index 7950169c04a51b0d75d1b1c4d06aabb044c941b6..cffd4abd6996b7481af66336670bc5dd44629a6a 100644 GIT binary patch delta 2886 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 delta 2903 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 delta 2906 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 klH;$4O!t2c@u&q+B?v1&ibw1w_z-nROpw%4 Date: Tue, 9 Nov 2021 16:27:17 +0800 Subject: [PATCH 161/253] =?UTF-8?q?=E7=89=A9=E4=B8=9A=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=86=85=E5=94=AF=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/form/IcPropertyManagementFormDTO.java | 18 ++++++++++-------- .../PropertyManagementController.java | 6 ++---- .../com/epmet/dao/IcPropertyManagementDao.java | 3 ++- .../impl/PropertyManagementServiceImpl.java | 7 +++++++ .../mapper/IcPropertyManagementDao.xml | 10 +++++++++- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java index cd05a2a13d..63ea329d22 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcPropertyManagementFormDTO.java @@ -17,9 +17,7 @@ package com.epmet.dto.form; -import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; -import com.epmet.commons.tools.validator.group.UpdateGroup; import lombok.Data; import org.hibernate.validator.constraints.Length; @@ -35,17 +33,21 @@ public class IcPropertyManagementFormDTO implements Serializable { public interface DeleteGroup extends CustomerClientShowGroup { } - @NotBlank(message = "物业id不能为空", groups = { UpdateGroup.class,DeleteGroup.class}) - private String id; + public interface AddShowGroup extends CustomerClientShowGroup { + } + + public interface UpdateShowGroup extends CustomerClientShowGroup { + } + @NotBlank(message = "物业id不能为空", groups = {DeleteGroup.class, UpdateShowGroup.class}) + private String id; /** * 物业名称 */ - @NotBlank(message = "物业名称不能为空", groups = {AddGroup.class, UpdateGroup.class}) - @Length(max=50,message = "物业名称不能超过50个字", groups = {AddGroup.class, UpdateGroup.class}) - private String name; - + @NotBlank(message = "物业名称不能为空", groups = {AddShowGroup.class, UpdateShowGroup.class}) + @Length(max = 50, message = "物业名称不能超过50个字", groups = {AddShowGroup.class}) + private String name; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java index d97e1300e1..6a38dd3e39 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/PropertyManagementController.java @@ -21,8 +21,6 @@ import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; -import com.epmet.commons.tools.validator.group.AddGroup; -import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dto.form.IcPropertyManagementFormDTO; import com.epmet.dto.result.IcPropertyManagementResultDTO; import com.epmet.service.IcPropertyManagementService; @@ -64,7 +62,7 @@ public class PropertyManagementController { @PostMapping("add") public Result add(@LoginUser TokenDto tokenDTO, @RequestBody IcPropertyManagementFormDTO formDTO){ //效验数据 - ValidatorUtils.validateEntity(formDTO, AddGroup.class); + ValidatorUtils.validateEntity(formDTO, IcPropertyManagementFormDTO.AddShowGroup.class); Map map=new HashMap<>(); map.put("propertyId",propertyManagementService.add(formDTO)); return new Result().ok(map); @@ -75,7 +73,7 @@ public class PropertyManagementController { @PostMapping("update") public Result update(@LoginUser TokenDto tokenDTO, @RequestBody IcPropertyManagementFormDTO formDTO){ //效验数据 - ValidatorUtils.validateEntity(formDTO, UpdateGroup.class); + ValidatorUtils.validateEntity(formDTO, IcPropertyManagementFormDTO.UpdateShowGroup.class); propertyManagementService.update(formDTO); return new Result(); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java index 545bb0c601..b79a5cc3e6 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcPropertyManagementDao.java @@ -29,5 +29,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface IcPropertyManagementDao extends BaseDao { - + + IcPropertyManagementEntity selectByName(String name); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java index 258a48bd65..bfc46dd0b6 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/PropertyManagementServiceImpl.java @@ -44,6 +44,13 @@ public class PropertyManagementServiceImpl implements PropertyManagementService @Override @Transactional(rollbackFor = Exception.class) public String add(IcPropertyManagementFormDTO formDTO) { + //物业名字平台内唯一 + //如果输入的物业名字已经存在,直接返回物业id + formDTO.setName(formDTO.getName().trim()); + IcPropertyManagementEntity entity = icPropertyManagementDao.selectByName(formDTO.getName()); + if (null != entity) { + return entity.getId(); + } IcPropertyManagementEntity icPropertyManagementEntity = ConvertUtils.sourceToTarget(formDTO, IcPropertyManagementEntity.class); icPropertyManagementDao.insert(icPropertyManagementEntity); return icPropertyManagementEntity.getId(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml index b1b707f456..725fdf969f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcPropertyManagementDao.xml @@ -14,5 +14,13 @@ - + \ No newline at end of file From c1ede5dc7feb8ddc708a18daa9ce3c6e03fb2864 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 9 Nov 2021 16:29:11 +0800 Subject: [PATCH 162/253] @NoRepeatSubmit --- .../src/main/java/com/epmet/controller/BuildingController.java | 2 ++ .../src/main/java/com/epmet/controller/HouseController.java | 3 +++ .../main/java/com/epmet/controller/NeighborHoodController.java | 3 +++ 3 files changed, 8 insertions(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index f3edc781e1..198c398843 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -86,6 +86,7 @@ public class BuildingController { } + @NoRepeatSubmit @PostMapping("buildingadd") public Result buildingAdd(@LoginUser TokenDto tokenDTO, @RequestBody IcBulidingFormDTO formDTO){ //效验数据 @@ -97,6 +98,7 @@ public class BuildingController { return new Result().ok("保存成功"); } + @NoRepeatSubmit @PostMapping("buildingupdate") public Result buildingUpdate(@LoginUser TokenDto tokenDTO, @RequestBody IcBulidingFormDTO formDTO){ //效验数据 diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index 12295301a1..167c7adce3 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -20,6 +20,7 @@ package com.epmet.controller; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -71,6 +72,7 @@ public class HouseController { } + @NoRepeatSubmit @PostMapping("houseadd") public Result houseAdd(@LoginUser TokenDto tokenDTO, @RequestBody IcHouseFormDTO formDTO){ //效验数据 @@ -82,6 +84,7 @@ public class HouseController { return new Result(); } + @NoRepeatSubmit @PostMapping("houseupdate") public Result houseUpdate(@LoginUser TokenDto tokenDTO, @RequestBody IcHouseFormDTO formDTO){ //效验数据 diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index 6bbab45e12..8442207f1a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -21,6 +21,7 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -84,6 +85,7 @@ public class NeighborHoodController { } + @NoRepeatSubmit @PostMapping("neighborhoodadd") public Result neighborhoodadd(@LoginUser TokenDto tokenDTO, @RequestBody IcNeighborHoodFormDTO formDTO){ //效验数据 @@ -95,6 +97,7 @@ public class NeighborHoodController { return new Result(); } + @NoRepeatSubmit @PostMapping("neighborhoodupdate") public Result neighborhoodupdate(@LoginUser TokenDto tokenDTO, @RequestBody IcNeighborHoodFormDTO formDTO){ //效验数据 From 1a8dbdc52f19bd4409a78f84d3a8a0ed6b844b5b Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 9 Nov 2021 16:49:49 +0800 Subject: [PATCH 163/253] =?UTF-8?q?=E6=B7=BB=E5=8A=A0xlsx=E6=A8=A1?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/controller/BuildingController.java | 6 +++--- .../epmet/controller/IcResiUserController.java | 5 +++-- .../main/resources/excel/ic_resi_info_cid.xlsx | Bin 0 -> 38996 bytes .../excel/ic_resi_info_cid_for_easy_excel.xlsx | Bin 0 -> 39499 bytes 4 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 198c398843..5f7533dfaa 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -22,10 +22,10 @@ import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; -import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.form.IcBulidingFormDTO; @@ -63,7 +63,7 @@ import java.util.Map; @RestController @RequestMapping("building") public class BuildingController { - + @Autowired private NeighborHoodService neighborHoodService; @@ -224,4 +224,4 @@ public class BuildingController { } -} \ No newline at end of file +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 044e03f476..d70a7e1ef5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -223,7 +223,7 @@ public class IcResiUserController { Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); - String templatePath = "excel/ic_resi_info_cid.xls"; + String templatePath = "excel/ic_resi_info_cid.xlsx"; TemplateExportParams params = new TemplateExportParams(templatePath, true); Map> sheetMap = new HashMap<>(); @@ -251,8 +251,9 @@ public class IcResiUserController { Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); workbook.setActiveSheet(0); - String fileName = "居民基本信息.xls"; + String fileName = "居民基本信息.xlsx"; response.setHeader("content-Type", "application/vnd.ms-excel"); + response.setCharacterEncoding("UTF-8"); response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); } diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..436e337990332d882b6fa3b59ec5ad28a0394e10 GIT binary patch literal 38996 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 literal 0 HcmV?d00001 From 7c99b0c363a5ea3f6016d243155d044d9c3d9f01 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 9 Nov 2021 16:55:19 +0800 Subject: [PATCH 164/253] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=88=BF=E5=B1=8Bexc?= =?UTF-8?q?el,=E5=8D=95=E5=85=83=E5=8F=B7=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/HouseServiceImpl.java | 8 +++----- .../src/main/resources/mapper/IcHouseDao.xml | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index b1930df4b4..d7fa97e9ed 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -17,9 +17,7 @@ import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.HouseInfoDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; -import com.epmet.entity.IcBuildingEntity; import com.epmet.entity.IcHouseEntity; -import com.epmet.entity.IcNeighborHoodEntity; import com.epmet.enums.HousePurposeEnums; import com.epmet.enums.HouseRentFlagEnums; import com.epmet.enums.HouseTypeEnums; @@ -202,9 +200,9 @@ public class HouseServiceImpl implements HouseService { } private List searchAllHouse(ListIcNeighborHoodFormDTO formDTO) { - IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); - - IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); + //IcNeighborHoodEntity neighbor = ConvertUtils.sourceToTarget(formDTO, IcNeighborHoodEntity.class); + // + //IcBuildingEntity building = ConvertUtils.sourceToTarget(formDTO, IcBuildingEntity.class); IcHouseEntity house = ConvertUtils.sourceToTarget(formDTO, IcHouseEntity.class); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml index 0857166540..61aa971630 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcHouseDao.xml @@ -157,7 +157,7 @@ a.OWNER_ID_CARD as ownerIdCard, b.BUILDING_NAME as buildingName, c.NEIGHBOR_HOOD_NAME as neighborHoodName, - d.UNIT_NUM as unitName + d.UNIT_NUM as buildingUnit from ic_house a INNER JOIN ic_building b on a.BUILDING_ID = b.ID and b.DEL_FLAG = '0' INNER JOIN ic_neighbor_hood c on a.NEIGHBOR_HOOD_ID = c.ID and c.DEL_FLAG = '0' From 10ab91dd0c5bb054bf44156a309b098c2748d394 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 9 Nov 2021 16:57:18 +0800 Subject: [PATCH 165/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A-?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/service/impl/IcResiUserImportServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 9b5908dace..8e47f10f01 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -3,6 +3,7 @@ package com.epmet.service.impl; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -252,7 +253,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId, String tableName) { DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); - EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); + //EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); + EasyExcel.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); List> headList = readListener.getHeadList(); List> dataList = readListener.getDataList(); @@ -592,7 +594,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } if (interupt) { - throw new RenException(String.join(",", errorColumnNames) + "的值未填写"); + throw new RenException(String.join(",", errorColumnNames) + "的值未填写,或者所填写信息在系统中未找到"); } } @@ -919,7 +921,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String fileName = "导入失败条目清单.xls"; response.setHeader("content-Type", "application/vnd.ms-excel"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); + response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); LinkedList list = new LinkedList<>(); for (Map.Entry> entry : errorRows.get().entrySet()) { From 93d48e34d27f11f5dd8aa84117ede991a225d365 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 9 Nov 2021 17:12:00 +0800 Subject: [PATCH 166/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2=EF=BC=9AContent-Disposition=20=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/service/impl/IcResiUserImportServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 8e47f10f01..647f38e8b5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -207,10 +207,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } } - String errors = JSON.toJSONString(errorRows.get()); + //String errors = JSON.toJSONString(errorRows.get()); //String skipeds = JSON.toJSONString(skipedRows.get()); - log.error(errors); + //log.error(errors); //log.error(skipeds); try { @@ -920,6 +920,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res //public static final ThreadLocal>> errorRows = new ThreadLocal<>(); String fileName = "导入失败条目清单.xls"; + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); @@ -928,7 +929,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res list.addAll(entry.getValue()); } - list.forEach(row -> {System.out.println(row.getTableName());row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment());}); + //list.forEach(row -> {System.out.println(row.getTableName());row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment());}); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的条目列表","导入失败"), ErrorRow.class, list); From 47c8e73d7b1ec7bc7b2b1bce3602d9a4859f42a1 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 9 Nov 2021 17:22:51 +0800 Subject: [PATCH 167/253] =?UTF-8?q?=E6=88=BF=E5=B1=8B=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=80=E5=B1=9E=E7=BB=84=E7=BB=87=EF=BC=8C?= =?UTF-8?q?=E6=89=80=E5=B1=9E=E7=BD=91=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/excel/IcHouseExcel.java | 6 ++++++ .../main/resources/excel/house_template.xlsx | Bin 11401 -> 10458 bytes 2 files changed, 6 insertions(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java index c606388a25..ed555f96f5 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java @@ -95,7 +95,13 @@ public class IcHouseExcel extends ExcelVerifyInfo implements Serializable { @Excel(name = "更新时间") private Date updatedTime;*/ + @Excel(name = "所属组织") + @NotBlank(message = "所属组织不能位空") + private String agencyName; + @Excel(name = "所属网格") + @NotBlank(message = "所属网格不能位空") + private String gridName; @Excel(name = "所属小区") @NotBlank(message = "小区名称不能位空") diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_template.xlsx b/epmet-module/gov-org/gov-org-server/src/main/resources/excel/house_template.xlsx index 54d298cd18ae9f37051d4187e628de33f2c0fead..027f37bcad185979d8358f47b5fdff58f2264a32 100644 GIT binary patch literal 10458 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 GdjCJ^VfGjR literal 11401 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 UAXEKWBR~SkfvlaH?&q)n0X_O&pa1{> From dc9f7ddf3fe0d87f4841bbe94073bf34aaaee52d Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 9 Nov 2021 17:25:32 +0800 Subject: [PATCH 168/253] =?UTF-8?q?=E5=A4=A7=E9=A5=BC=E6=85=A2=E7=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 11 +++-------- .../main/resources/excel/ic_resi_info_cid.xls | Bin 92160 -> 92160 bytes .../resources/excel/ic_resi_info_cid.xlsx | Bin 38996 -> 39000 bytes .../excel/ic_resi_info_cid_for_easy_excel.xls | Bin 96256 -> 95744 bytes .../ic_resi_info_cid_for_easy_excel.xlsx | Bin 39499 -> 39496 bytes 5 files changed, 3 insertions(+), 8 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index d70a7e1ef5..6d3a4db52c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -169,7 +169,7 @@ public class IcResiUserController { } @RequestMapping(value = "/exportExcel") - public void exportExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws IOException { + public void exportExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); @@ -250,12 +250,7 @@ public class IcResiUserController { Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); workbook.setActiveSheet(0); - - String fileName = "居民基本信息.xlsx"; - response.setHeader("content-Type", "application/vnd.ms-excel"); - response.setCharacterEncoding("UTF-8"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); - workbook.write(response.getOutputStream()); + workbook.write(getOutputStream("居民基本信息.xlsx",response)); } @RequestMapping(value = "/exportExcel2") @@ -398,7 +393,7 @@ public class IcResiUserController { fileName = URLEncoder.encode(fileName, "UTF-8"); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf8"); - response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.addHeader("Access-Control-Expose-Headers", "Content-disposition"); return response.getOutputStream(); diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index 41f5796a53c1efecc03f365ebeb7c055cd0efdb1..97ae081ae55cda9043f0912bc8f089aa817deec1 100644 GIT binary patch delta 1218 zcmZ{iYe*DP6vxkPX5Dtjb)9t|BsF{Npb?obw$f4|&D5kIMf~EI)(28x zp>RaO%ufad5#bnuelV~U5=tXU2p^FU1X)BG`l0R4j4Q^rcVOn;-~XI*&tux=HEr{n zr|bK4&_9x!4RqnxeP@XmMaH)KZekK}lS#%=HX5HW0W&4E4KfCW`;n z?NIkX)^#Mk++G~08fR4%dRwdRc_xbY#1%40<3n+?vK#d(HwW-1@pG-F0 zg%ASHZ~}4C&FyCg^waSK3X%w9q@#CxdpyfQ)~)(!H-Wj+1QI<8bY_x8XMY(H*vBsh nC&r`82+#6t{L#viw?veyw8f>|SsXu6K_)^-`}kHh(Q5w!2Z}(1 delta 1120 zcmZ`%T}TvB6h6n9U7K0goZWSuT~~Ll(9ECJ!Ym)!)uJ>>SvBzo(y}ZHRO|;VD2a?f zqT+}PDZWGygb+@&U=Kz=hDfF5gD;hlWE4qI85w1FXI!ZkAMU;1eBU|WocZpwkLlXS zbhoA>g!Y!gtWCf{1bvDqqZCdKE(B`fl4%Ps(<{b2W#=4cr7kX$RxxbSIp_{Mn|KRd zU^a*O z3PH6rOLdV#>e5VU%e>X8@+-pX*DX%d5aq6t!_*8_jSlf$jg3RjAt&&;Dj&DROOnP5 zDsK$&6Touv%5>7`LOmIbJJ?=sbQjq|1z#7VgnMcu3s;NyKR!G}EnF-07*m~EpoUOy zuOwLwR(1h))l*N!QK`<28V=Pg#ijKMR2%KKnL_H~*swU2o~}i!SLNKijEfeosBkN1 zIKE=|{fsheDoRI=HhGfHJUYUBArfnRRTXbao9lPi9q=8x&;brueKDwr__DOO+p}-5 z1w%rOYDHh*>w&MO^12b09W z8U#-oLQ1wu2DT>Rv{eXr5QYj75&~H{IOZZ(SyXo=%KZ8#4ebF(B}%;X5HjS_=jdf$ X0jF=C8=VMjslh=#9uNGe$H>S(+|ML( diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx index 436e337990332d882b6fa3b59ec5ad28a0394e10..cbf3c50b7b4947035d8446a16f7ad1e401cf6a8e 100644 GIT binary patch delta 8730 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

Z9F{mK4NMB2=0Jj#qqq7K?8 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 Ho9TZ68oRl| diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls index 01ec6893d33393e51f04c07d53642284f3af7235..86b9efd23f7641e0e0cdec1fb2cc6178b83dddd1 100644 GIT binary patch delta 1289 zcmZ{kZEO@(6o%i^nc3Z${pfDHY-dZC-2zderQ4<S(JC=qB%DxVg@wxMo}F{K!6 zj7X>zbS85mk(m<@&cztlSKTJ&1Q4-jEIj1nz%qk@B1qs%^{vBxWj)+ zI#($=e=i02Z#lrv$Ys1*ykC-aPK$U$#1pcgf0Rr4MG=Fdy-;4jC!`{7R{VThaB6h!?t_4r+PzA5+Ubl}&)Z zbuHm9orRCg=$O5>0W+Nv{>dE`-=)|Sr9yVPgS_3dI_S*XTge3S#j3_RPl+r~ZtDHO zxL&lTl6p82E1$pNRiTHSnwz$6yt#f?%cjJ0P0t@Xh%$`x_E?y<@N2OU5%-DbGCmUv z)vdDU{!a&uC1R~g*Mnnp&{C_9y7ufi+xTE#DaPx$Fus<`jOO@S=ffIkFZQ4YRak=! zNZ?7V#6HZ##_+nc#kTwFfa7j{{Z5rO+767p1RU(-nslR~w4Boy+aN~AMN(}da#sk2 zkZfoWO@d9_4GqT6uXIbAbO`9~0b2Wvnsg}{yzhM2EN6(4sb6D+d$&#s8chiHf8>d3hoo!8w3 z+V~A%_buSr2{E9KjEmpg4x}b_(tQ4U@&_&Z7x1Ro_`8(Us7m(?<9B_!cZ|bnhgv_6 zpoR&~%q5lHEw@YNJe#d~?0jr*lw7G>6*Q#w*AkZ35ki@dD(RR1+GzcagwtCH#VzJU zTyZRt8F-3rhGrIO8LDmcPH&QQx#yw7cQa*4^2uI#@nhT8U!k~20PPo7y_I?V1zKUF qfz-<#bfDn9*37*Qx}XGeC)r6MF+_-sW}a+0mdSkANsFkbL;e?pZ)?o} delta 1298 zcmZ`(e`phT6n`&wmo&NNO!_0e+J>B)h;2=;oj)oSNp#a~N-Y69wUZ`ot%yREQAMqx z0r3Z@RC&6viu&I~7=wDV*Hx&Fj)4>gQ>PY$8vF%gf`Lt~472auHEFf<;NAD`^FHsr z&wG5o-^AZS;-zr9W}Xg{j|X6YeIm1WnM}q&e`Yq+A0eAFvFD4L<-h?)FKlU&cpp9F z=2DB`AxZd%2KfT2=ga9CFVjV4N146ji)bgqerMeI%qoR)dd11~74xkXJX)tvB%q59 zyVOz_EAwxL)&B_~tb`Td7b}mT2)s1viZV`>sJ71Js3vD7F3*B5odsWH;dI`uEIjM= zCdH%(ymJh&gCz*a7yJ@pp!&*)KijW{$q`iZs&heXH7}`z?Bs_b9z2g zjE^3>RW|uTNyS2zyp*;|YfGKkES3~sE{k?uD&hGzckCYRUcr}(@CYfPd1ap;WPEU7 zb7b?zRO9YgQ?w(pAtzpv6|+D*P%yi4zCl-9Dv=>1+`EOpTTN~!xW&6t{*D2r`H4YxhXPG zEsk^ojD7=fU>{H{-Jp46*X87Z1AP)_h-asP?RmCpFZZ9|#Mj3Fdd>he^%?9dni>x( z4jXe1;|4m_?N6S}!zH+k{HdY>B7dCn~p04a9fZ)q**!klm1b-oy(J%G@$kfQ0g`fe9qRvi3PL9{1V zRADVQj0?=7nA}x`!>)=Y2>ta4--XSvU=aT*&K4YZRWu^hZbs;h8D66+ed!uZ`KJ$K zD)Hnfle^mSoUZJ|HvD!Q%KV!x|0VSDZRq7azd}%Myp3Td3m!ZfIjFDPfpvDgn%vuo khi$9c^tYY(o8a$fZsS(d*vf7hxHkE3V1xQt7k-TY12hqIyZ`_I diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx index ca20c158f2a48284479fe476dd43cfd7949a4390..ba72afadb8b07133f0cdf066bd08cc497f4c7718 100644 GIT binary patch delta 8819 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

p*Bnnq4&hEWBLTNw4k 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 From e1dbdacb85cb1bdcfdc7a678a9c5990db499a682 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Tue, 9 Nov 2021 17:30:28 +0800 Subject: [PATCH 169/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=20=E6=8C=89=E9=9C=80=E6=B1=82=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E4=BF=AE=E6=94=B9=E3=80=90=E9=9C=80=E6=B1=82=EF=BC=9A?= =?UTF-8?q?=E5=8F=AA=E8=83=BD=E5=AF=BC=E5=85=A5=E5=BD=93=E5=89=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E4=BA=BA=E6=89=80=E5=B1=9E=E7=BB=84=E7=BB=87=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E7=9A=AE=E9=85=8D=E4=B8=8D=E4=B8=8A=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=88=8D=E5=BC=83=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NeighborHoodController.java | 2 +- .../epmet/service/NeighborHoodService.java | 2 +- .../service/impl/NeighborHoodServiceImpl.java | 28 +++++++++++++++---- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index 8442207f1a..11e1f65d6b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -215,7 +215,7 @@ public class NeighborHoodController { } List result =importResult.getList(); // log.info(JSON.toJSONString(result)); - neighborHoodService.importExcel(customerId,result); + neighborHoodService.importExcel(customerId,result,tokenDTO.getUserId()); return new Result(); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java index f4c612a2b4..266c3b912d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java @@ -52,5 +52,5 @@ public interface NeighborHoodService{ */ void exportNeighborhoodinfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception ; - void importExcel(String customerId,List list); + void importExcel(String customerId,List list,String staffId); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index ad24ef5ab8..fd19173837 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -4,9 +4,11 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.enums.OrgTypeEnum; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.NeighborhoodConstant; @@ -238,7 +240,19 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { @Override @Transactional(rollbackFor = Exception.class) - public void importExcel(String customerId,List list) { + public void importExcel(String customerId,List list,String staffId) { + //2021.11.9 需求变更 当前工作人员只能导致自己所属组织下数据,网格名对应不上的数据舍弃【注:需求就这样】 sun + CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); + //组织名称不一样的数据舍弃 + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + IcNeighborHoodExcel obj = iterator.next(); + if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { + iterator.remove(); + } + } + //end sun + //导入 if(CollectionUtils.isEmpty(list)){ return ; @@ -274,10 +288,14 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { entity.setCustomerId(customerId); entity.setNeighborHoodName(icNeighborHoodExcel.getNeighborHoodName()); - entity.setAgencyId(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName())).map(u->u.getId()).orElse("")); // agencyMap.get(icNeighborHoodExcel.getAgencyName()).getId()); - entity.setParentAgencyId(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName())).map(u->u.getPid()).orElse(""));//agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPid() - entity.setAgencyPids(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName())).map(u->u.getPids()).orElse(""));//agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPids() - entity.setGridId(Optional.ofNullable(gridMap.get(icNeighborHoodExcel.getGridName())).map(u->u.getId()).orElse(""));//gridMap.get(icNeighborHoodExcel.getGridName()).getId() + entity.setAgencyId(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName().trim())).map(u->u.getId()).orElse("")); // agencyMap.get(icNeighborHoodExcel.getAgencyName()).getId()); + entity.setParentAgencyId(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName().trim())).map(u->u.getPid()).orElse(""));//agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPid() + entity.setAgencyPids(Optional.ofNullable(agencyMap.get(icNeighborHoodExcel.getAgencyName().trim())).map(u->u.getPids()).orElse(""));//agencyMap.get(icNeighborHoodExcel.getAgencyName()).getPids() + entity.setGridId(Optional.ofNullable(gridMap.get(icNeighborHoodExcel.getGridName().trim())).map(u->u.getId()).orElse(""));//gridMap.get(icNeighborHoodExcel.getGridName()).getId() + //网格名对应不上的数据舍弃 + if ("".equals(entity.getGridId())) { + continue; + } entity.setAddress(icNeighborHoodExcel.getAddress()); entity.setRemark(icNeighborHoodExcel.getRemark()); neighborHoodEntityList.add(entity); From 900a4f04e4112a2815353a646d0a7a2042d93bd9 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 9 Nov 2021 17:34:46 +0800 Subject: [PATCH 170/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=201.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=87=BAexcel=E7=9A=84sheet?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/IcResiUserImportServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 647f38e8b5..c0a45e6749 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -931,7 +931,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res //list.forEach(row -> {System.out.println(row.getTableName());row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment());}); - Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的条目列表","导入失败"), + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的列表","导入失败列表(没有数据说明全部成功)"), ErrorRow.class, list); workbook.write(response.getOutputStream()); From 436504300e59093766323b45eed5ed424514f615 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Tue, 9 Nov 2021 17:46:25 +0800 Subject: [PATCH 171/253] =?UTF-8?q?=E6=A5=BC=E6=A0=8B=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=20=E6=8C=89=E9=9C=80=E6=B1=82=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E4=BF=AE=E6=94=B9=E3=80=90=E9=9C=80=E6=B1=82=EF=BC=9A?= =?UTF-8?q?=E5=8F=AA=E8=83=BD=E5=AF=BC=E5=85=A5=E5=BD=93=E5=89=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E4=BA=BA=E6=89=80=E5=B1=9E=E7=BB=84=E7=BB=87=E4=B8=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=8C=E5=8C=B9=E9=85=8D=E4=B8=8D=E4=B8=8A?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E8=88=8D=E5=BC=83=EF=BC=8C=E5=B0=86?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E4=B8=8D=E4=B8=8A=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=99=E5=88=B0=E5=89=8D=E7=AB=AF=E6=8F=90=E7=A4=BA=20?= =?UTF-8?q?=E5=A6=82=E5=8D=97=E5=AE=81=E7=A4=BE=E5=8C=BA=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/controller/BuildingController.java | 3 +- .../com/epmet/service/BuildingService.java | 4 +-- .../service/impl/BuildingServiceImpl.java | 28 +++++++++++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 5f7533dfaa..5b408d1367 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -188,8 +188,7 @@ public class BuildingController { } List result =importResult.getList(); - buildingService.importExcel(customerId,result); - return new Result().ok("导入成功"); + return new Result().ok(buildingService.importExcel(customerId,result,tokenDTO.getUserId())); } /** diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java index 728c472116..1a8c8c04e9 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java @@ -17,13 +17,13 @@ package com.epmet.service; +import com.epmet.commons.tools.utils.Result; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.excel.IcBuildingExcel; -import com.epmet.excel.IcNeighborHoodExcel; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -53,7 +53,7 @@ public interface BuildingService { List treeList(String customerId); - void importExcel(String customerId, List list); + Result importExcel(String customerId, List list, String staffId); IcNeighborHoodResultDTO listBuilding(ListIcNeighborHoodFormDTO formDTO); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 61ad0ba641..40659b958f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -4,9 +4,12 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; import com.epmet.dao.*; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.CustomerStaffAgencyDTO; @@ -207,10 +210,23 @@ public class BuildingServiceImpl implements BuildingService { @Override @Transactional(rollbackFor = Exception.class) - public void importExcel(String customerId, List list) { + public Result importExcel(String customerId, List list, String staffId) { + //2021.11.9 需求变更 当前工作人员只能导致自己所属组织下数据,网格名对应不上的数据舍弃【注:需求就这样】 sun + CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); + //组织名称不一样的数据舍弃 + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + IcBuildingExcel obj = iterator.next(); + if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { + iterator.remove(); + } + } + //用于存储匹配不上的数据给前端的提示 如南宁社区不存在 + StringBuffer str = new StringBuffer(""); + //end sun //导入 if(CollectionUtils.isEmpty(list)){ - return ; + return new Result(); } //查询所有组织和网格根据名字 @@ -235,6 +251,10 @@ public class BuildingServiceImpl implements BuildingService { entity.setId(uuid); entity.setCustomerId(customerId); entity.setNeighborHoodId(Optional.ofNullable(neighborHoodMap.get(icBuildingExcel.getNeighborHoodName())).map(u->u.getId()).orElse(""));//neighborHoodMap.get(icBuildingExcel.getNeighborHoodName()).getId() + if ("".equals(entity.getNeighborHoodId())) { + str.append("".equals(str) ? icBuildingExcel.getNeighborHoodName() : str.append("、").append(icBuildingExcel.getNeighborHoodName())); + continue; + } entity.setBuildingName(icBuildingExcel.getBuildingName()); entity.setType(BuildingTypeEnums.getKeyByValue(icBuildingExcel.getType())); entity.setSort(0); @@ -266,6 +286,10 @@ public class BuildingServiceImpl implements BuildingService { icBuildingService.insertBatch(buildingEntityList); icBuildingUnitService.insertBatch(icBuildingUnitEntityList); + if(!"".equals(str)){ + return new Result().error(9999, str.append("不存在").toString()); + } + return new Result(); } @Override From fcd921fcb5a279ca702735e0de41d714820a2fa9 Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 9 Nov 2021 18:05:51 +0800 Subject: [PATCH 172/253] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 72 +++---------------- 1 file changed, 10 insertions(+), 62 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 6d3a4db52c..3fe32e2409 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -21,12 +21,12 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.converters.date.DateDateConverter; -import com.alibaba.excel.converters.date.DateStringConverter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -41,7 +41,6 @@ import com.epmet.dto.result.*; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; -import com.epmet.util.TestFileUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; @@ -238,7 +237,7 @@ public class IcResiUserController { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); - resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); + //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); mapData2.put("list", resiChildMap.values()); @@ -308,57 +307,15 @@ public class IcResiUserController { Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //========================================= - - - // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 - // {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list - -// String templatePath = "/excel/ic_resi_info_cid_for_easy_excel.xls"; -// String s1 = this.getClass().getResource(templatePath).getPath(); -// System.out.println("模版路径:"+s1); -// -// String templateFileName = s1; -// System.out.println("=templateFileName=="+templateFileName); -// String fileName = TestFileUtil.getPath() + "/excel/ic_resi_info_cid_for_easy_excel0000.xls"; -// System.out.println(fileName); -// ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); -// WriteSheet writeSheet = EasyExcel.writerSheet(0).build(); -// WriteSheet build = EasyExcel.writerSheet(1).build(); -// // 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹 -// excelWriter.fill(new FillWrapper("t1", resiMainList.values()), writeSheet); -// excelWriter.fill(new FillWrapper("t2", resiMainList.values()), build); - - // 别忘记关闭流 - //excelWriter.finish(); - //EasyExcel.write(new File(fileName)); - //========================================= //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); - String originValue = JSON.toJSONString(resiMainList.values()); - System.out.println("========="+ originValue); - String templatePath = "/excel/ic_resi_info_cid_for_easy_excel.xls"; - String s1 = this.getClass().getResource(templatePath).getPath(); - System.out.println("模版路径:"+s1); - //TemplateExportParams params = new TemplateExportParams(templatePath, true); - String fileName = TestFileUtil.getPath() + "compositeFill" + "ic_resi_info_cid_for_easy_excel.xls"; - fileName = "/Users/liujianjun/Downloads/ic_resi_info_cid_for_easy_excel2.xls"; - System.out.println("fileName======="+fileName); - //String fileName = "居民基本信息.xls"; - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).registerConverter(new DateStringConverter()).registerConverter(new DateDateConverter()).withTemplate(s1).build(); - //ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(s1).build(); - WriteSheet fistSheet = EasyExcel.writerSheet(0).build(); - try { - excelWriter.fill(new FillWrapper("t1", resiMainList.values()), fistSheet); - } catch (Exception e) { - e.printStackTrace(); - } + String templatePath = this.getClass().getResource("/excel/ic_resi_info_cid_for_easy_excel.xls").getPath(); - //======================================= + String fileName = "居民基本信息.xls"; + ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(templatePath).build(); + WriteSheet fistSheet = EasyExcel.writerSheet(NumConstant.ZERO).build(); + excelWriter.fill(new FillWrapper("t1", resiMainList.values()), fistSheet); - /* Map> sheetMap = new HashMap<>(); - Map mapData = new HashMap<>(); - mapData.put("list", resiMainList.values()); - System.out.println("========="+JSON.toJSONString(resiMainList.values())); - sheetMap.put(0, mapData);*/ + //======================================= AtomicInteger n = new AtomicInteger(); for (FormItem item : resiFormItems.getItemList()) { @@ -368,10 +325,6 @@ public class IcResiUserController { Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); - /*Map mapData2 = new HashMap<>(); - mapData2.put("list", resiChildMap.values()); - System.out.println("========="+JSON.toJSONString(mapData2)); - sheetMap.put(n.incrementAndGet(), mapData2);*/ int sheetNo = n.incrementAndGet(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build(); System.out.println("======"+JSON.toJSONString(resiChildMap.values())); @@ -380,14 +333,8 @@ public class IcResiUserController { } } - /* Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); - workbook.setActiveSheet(0);*/ excelWriter.finish(); - - /* response.setHeader("content-Type", "application/vnd.ms-excel"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); - workbook.write(response.getOutputStream());*/ } private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception { fileName = URLEncoder.encode(fileName, "UTF-8"); @@ -404,6 +351,7 @@ public class IcResiUserController { * * @return */ + @NoRepeatSubmit @PostMapping("importExcel") public void importExcelByEasyExcel(@RequestPart("file") MultipartFile file, HttpServletResponse response) { if (file.isEmpty()) { From 2600373022a4bcabc7486413ee21676681f2b076 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 9 Nov 2021 21:59:37 +0800 Subject: [PATCH 173/253] fix --- .../com/epmet/service/impl/IcResiUserImportServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index c0a45e6749..076a880ff0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -929,7 +929,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res list.addAll(entry.getValue()); } - //list.forEach(row -> {System.out.println(row.getTableName());row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment());}); + list.forEach(row -> {row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment());}); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的列表","导入失败列表(没有数据说明全部成功)"), ErrorRow.class, list); From 29fb0c83e909d441840a737bc0babca325e6dbc1 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 10 Nov 2021 09:53:02 +0800 Subject: [PATCH 174/253] =?UTF-8?q?=E6=88=BF=E5=B1=8B=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20=20=E5=AF=BC=E5=85=A5=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/HouseController.java | 3 +- .../java/com/epmet/excel/IcBuildingExcel.java | 18 +++++------ .../java/com/epmet/excel/IcHouseExcel.java | 26 ++++++++-------- .../com/epmet/excel/IcNeighborHoodExcel.java | 12 +++---- .../java/com/epmet/service/HouseService.java | 3 +- .../epmet/service/impl/HouseServiceImpl.java | 31 +++++++++++++++++-- 6 files changed, 59 insertions(+), 34 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index 167c7adce3..1807565cee 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -153,8 +153,7 @@ public class HouseController { } List result =importResult.getList(); - houseService.importExcel(customerId,result); - return new Result().ok("导入成功"); + return new Result().ok(houseService.importExcel(customerId,result,tokenDTO.getUserId())); } @PostMapping( "queryListHouseInfo") diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java index fbb0f28254..ed1afb786a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcBuildingExcel.java @@ -93,35 +93,35 @@ public class IcBuildingExcel extends ExcelVerifyInfo implements Serializable { private Date updatedTime;*/ @Excel(name = "所属组织") - @NotBlank(message = "所属组织不能位空") + @NotBlank(message = "不能为空") private String agencyName; @Excel(name = "所属网格") - @NotBlank(message = "所属网格不能位空") + @NotBlank(message = "不能为空") private String gridName; @Excel(name = "小区名称") - @NotBlank(message = "小区名称不能位空") - @Length(max=50,message = "小区名称不能超过50个字") + @NotBlank(message = "不能为空") + @Length(max=50,message = "不能超过50个字") private String neighborHoodName; @Excel(name = "楼栋名称") - @NotBlank(message = "楼栋名称不能位空") + @NotBlank(message = "不能为空") private String buildingName; @Excel(name = "楼栋类型") - @NotBlank(message = "楼栋类型不能位空") + @NotBlank(message = "不能为空") private String type; @Excel(name = "单元数") - @NotNull(message = "单元数不能位空") + @NotNull(message = "不能为空") private Integer totalUnitNum; @Excel(name = "层数") - @NotNull(message = "层数不能位空") + @NotNull(message = "不能为空") private Integer totalFloorNum; @Excel(name = "户数") - @NotNull(message = "户数不能位空") + @NotNull(message = "不能为空") private Integer totalHouseNum; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java index ed555f96f5..be6ba11d2f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcHouseExcel.java @@ -96,52 +96,52 @@ public class IcHouseExcel extends ExcelVerifyInfo implements Serializable { private Date updatedTime;*/ @Excel(name = "所属组织") - @NotBlank(message = "所属组织不能位空") + @NotBlank(message = "不能为空") private String agencyName; @Excel(name = "所属网格") - @NotBlank(message = "所属网格不能位空") + @NotBlank(message = "不能为空") private String gridName; @Excel(name = "所属小区") - @NotBlank(message = "小区名称不能位空") - @Length(max=50,message = "小区名称不能超过50个字") + @NotBlank(message = "不能为空") + @Length(max=50,message = "不能超过50个字") private String neighborHoodName; @Excel(name = "所属楼栋") - @NotBlank(message = "楼栋名称不能位空") + @NotBlank(message = "不能为空") private String buildingName; @Excel(name = "单元号") - @NotNull(message = "单元号不能位空") + @NotNull(message = "不能为空") private Integer buildingUnit; @Excel(name = "门牌号") - @NotBlank(message = "门牌号不能位空") + @NotBlank(message = "不能为空") private String doorName; @Excel(name = "房屋类型") - @NotBlank(message = "房屋类型不能位空") + @NotBlank(message = "不能为空") private String houseType; @Excel(name = "房屋用途") - @NotBlank(message = "房屋用途不能位空") + @NotBlank(message = "不能为空") private String purpose; @Excel(name = "出租") - @NotBlank(message = "出租不能位空") + @NotBlank(message = "不能为空") private String rentFlag; @Excel(name = "房主姓名") - @NotBlank(message = "房主姓名不能位空") + @NotBlank(message = "不能为空") private String ownerName; @Excel(name = "房主电话") - @NotBlank(message = "房主电话不能位空") + @NotBlank(message = "不能为空") private String ownerPhone; @Excel(name = "房主身份证") - @NotBlank(message = "房主身份证号不能位空") + @NotBlank(message = "不能为空") private String ownerIdCard; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java index 71fcec8379..72c57047e0 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/excel/IcNeighborHoodExcel.java @@ -98,27 +98,27 @@ public class IcNeighborHoodExcel extends ExcelVerifyInfo implements Serializable @Excel(name = "所属组织") - @NotBlank(message = "所属组织不能位空") + @NotBlank(message = "不能为空") private String agencyName; @Excel(name = "所属网格") - @NotBlank(message = "所属网格不能位空") + @NotBlank(message = "不能为空") private String gridName; @Excel(name = "小区名称") - @NotBlank(message = "小区名称不能位空") - @Length(max=50,message = "小区名称不能超过50个字") + @NotBlank(message = "不能为空") + @Length(max=50,message = "不能超过50个字") private String neighborHoodName; @Excel(name = "关联物业") private String propertyName; @Excel(name = "详细地址") - @NotBlank(message = "详细地址不能位空") + @NotBlank(message = "不能为空") private String address; @Excel(name = "备注") - @Length(max=500,message = "备注不能超过500个字") + @Length(max=500,message = "不能超过500个字") private String remark; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java index 5bd4a78b65..0fd98dc3df 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java @@ -17,6 +17,7 @@ package com.epmet.service; +import com.epmet.commons.tools.utils.Result; import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.HouseInfoDTO; @@ -47,7 +48,7 @@ public interface HouseService { void delHouse(String houseId); - void importExcel(String customerId, List list); + Result importExcel(String customerId, List list, String staffId); IcNeighborHoodResultDTO listNeighborhood(ListIcNeighborHoodFormDTO formDTO); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index d7fa97e9ed..2a0ce1465d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -3,9 +3,12 @@ package com.epmet.service.impl; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; import com.epmet.dao.IcBuildingDao; import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dao.IcHouseDao; @@ -21,6 +24,7 @@ import com.epmet.entity.IcHouseEntity; import com.epmet.enums.HousePurposeEnums; import com.epmet.enums.HouseRentFlagEnums; import com.epmet.enums.HouseTypeEnums; +import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcHouseExcel; import com.epmet.service.HouseService; import com.epmet.service.IcBuildingService; @@ -119,10 +123,23 @@ public class HouseServiceImpl implements HouseService { } @Override - public void importExcel(String customerId, List list) { + public Result importExcel(String customerId, List list, String staffId) { + //2021.11.10 需求变更 当前工作人员只能导致自己所属组织下数据,对应不上的数据舍弃【注:需求就这样】 sun + CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); + //组织名称不一样的数据舍弃 + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + IcHouseExcel obj = iterator.next(); + if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { + iterator.remove(); + } + } + //用于存储匹配不上的数据给前端的提示 如南宁社区不存在 + StringBuffer str = new StringBuffer(""); + //end sun //导入 if(CollectionUtils.isEmpty(list)){ - return ; + return new Result(); } //获取所有小区 list // List neighborNameList = list.stream().map(item -> item.getNeighborHoodName()).collect(Collectors.toList()); @@ -155,7 +172,10 @@ public class HouseServiceImpl implements HouseService { entity.setBuildingId(String.valueOf(Optional.ofNullable(item).map(u->u.get("buildingId")).orElse(""))); entity.setBuildingUnitId(String.valueOf(Optional.ofNullable(item).map(u->u.get("buildingUnitId")).orElse(""))); entity.setHouseName(icHouseExcel.getBuildingName()+"-"+icHouseExcel.getBuildingUnit()+"-"+icHouseExcel.getDoorName()); - + if ("".equals(entity.getNeighborHoodId()) || "".equals(entity.getBuildingId()) || "".equals(entity.getBuildingUnitId())) { + str.append("".equals(str) ? icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit() : str.append("、").append(icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit())); + continue; + } entity.setDoorName(icHouseExcel.getDoorName()); entity.setHouseType(HouseTypeEnums.getKeyByValue(icHouseExcel.getHouseType())); entity.setPurpose(HousePurposeEnums.getKeyByValue(icHouseExcel.getPurpose())); @@ -173,6 +193,11 @@ public class HouseServiceImpl implements HouseService { //3.保存 icHouseService.insertBatch(houseEntityList); + if(!"".equals(str)){ + return new Result().error(9999, str.append("不存在").toString()); + } + return new Result(); + } @Override From 511bd9d8f07bd8f9b97a46646a0d67d8fb552409 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 10 Nov 2021 10:08:26 +0800 Subject: [PATCH 175/253] =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/NeighborHoodServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index fd19173837..4e36375890 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -279,7 +279,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { //同一客户下,小区名称唯一 Integer count = icNeighborHoodDao.checkNameUq(customerId,icNeighborHoodExcel.getNeighborHoodName(),null); if (null != count && count > 0) { - throw new RenException(EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getCode(), EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); + throw new RenException(EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getCode(), icNeighborHoodExcel.getNeighborHoodName()+EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); } IcNeighborHoodEntity entity = new IcNeighborHoodEntity(); From 64d98d2845d985bb936ffa3c31568359b455d188 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 10 Nov 2021 10:16:13 +0800 Subject: [PATCH 176/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 4 ++-- .../main/resources/excel/ic_resi_info_cid.xls | Bin 92160 -> 39424 bytes .../resources/excel/ic_resi_info_cid.xlsx | Bin 39000 -> 23085 bytes .../excel/ic_resi_info_cid_for_easy_excel.xls | Bin 95744 -> 43008 bytes .../ic_resi_info_cid_for_easy_excel.xlsx | Bin 39496 -> 23391 bytes 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 3fe32e2409..1ce7210814 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -222,7 +222,7 @@ public class IcResiUserController { Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); - String templatePath = "excel/ic_resi_info_cid.xlsx"; + String templatePath = "excel/ic_resi_info_cid.xls"; TemplateExportParams params = new TemplateExportParams(templatePath, true); Map> sheetMap = new HashMap<>(); @@ -249,7 +249,7 @@ public class IcResiUserController { Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); workbook.setActiveSheet(0); - workbook.write(getOutputStream("居民基本信息.xlsx",response)); + workbook.write(getOutputStream("居民基本信息.xls",response)); } @RequestMapping(value = "/exportExcel2") diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index 97ae081ae55cda9043f0912bc8f089aa817deec1..e3649188fb6f138191b1f97d9dde66832613155d 100644 GIT binary patch delta 9302 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 P(f zWrco{8E)IafMy%WX`mNnhTAGIpjibn1AQzrblp692B$qBGtdJwL)X`X;j{!~2Kr}a zunr%6v9tjUkjs7L=)IW{vI9(}*+u>zm|Zkt2MARGR@tFA72;w_9RFc?0xgE(6GID@ zP`TnP$d5n&T06jcr8ax|9?sVhK|1G zBJL9ZYtRzYG(m`;;tIlUe*BUL7SbJTpqsu2x*+=eyU$2-Uoc(m{427A{Af5Tp7oKq zE=%0w>>00D_>RJn56M?&=}*BN`IWMsKPfAJ58gh;t#lAJD7((^v+f(0%dav&!SK2) z`4YFzLj2qS9?lK)yQjf?mj3$L7T&k75xy;)m5v^dmrU39Ye(z)4EeI*l(cnybPAT6 zA$%kG^G=`Rar?8m9@6#tAS2CvvPTbvLbms9xcr+#B?|*Lof{!~b-(kiEW+-iqXixC z&!q#~LdMg9b_;VgY{OVh2ew|EMhCW|Y@vfb^|#XxQo5Z;xS!yrpM7cdrSx`T$d>tM zR=c!qo9~@HYsJ$wv&3vMOT-~rD=iV8KD@f*WnV6U)}4B9dhHFL<`B zOQ;N%iKX;60W0bHSI{Qfl~fXSBu}BzSVo~Z4&-$LJyuPjv&<995&7*$DG#LI-n4Ai zhn9o-&=OrATC4&-fcz1z6CGLPKaiHBhSGN+J#gU|LdO8|DX`E%Z{VImsmpQWnvB8wZs2li-Ej4 z)T6Wr{L&o3`lYVO@VSw&TvRgpOr_M9iN&JE%Ew{`oA8@J+mB@WI3F(cMlQzL-nDa}PIyV7Np|A2FfrG$s8SG&uSciREb-^v4!6*PV=CB*wf3PK+)1^ve1UOzVW9Sla!#8%jgBfh@Tv%!V$(8{pcfYjno|p!Sqm|T zj=6Ny&@qpWqv$}(pHIgEIu_Egh>oM_K+jl5$1!v)p<^i>$I@{e9n0ugPR9y5R?@MG zj^pWAO$U1O6X-aR4$NWK(Qy(T>*=Vc<77Hcq2p9KPNQQ39e<+ZbUMzU<4iivqGKZ+ zo9H;3j&tbPOve^F&ZXl#I?ku#&vaZs$5uKnq~jtwE~euWI=0cVosLWCxQvd=>9~T9 yE9tn3j;raohK?O{TuaAwbX-rz4Rl}*aTA?yrsI~N4D9xx`xkQKIPz(F3H(1zDnM)i diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx index cbf3c50b7b4947035d8446a16f7ad1e401cf6a8e..157ff731c47b701d20fbe9e1507b276f09e39916 100644 GIT binary patch delta 18113 zcmZ^KV{m0%*KKS&>Daby+qP|Va5^?lY@=g!Y}@Rh{D~@F~?kIwGOQM7ib+E7$nHXWVu@sG8iFXMi!g}W%x4avTnayVSbI�#EQfCfer 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 literal 39000 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 diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls index 86b9efd23f7641e0e0cdec1fb2cc6178b83dddd1..005e18f20234c565384c7bed8b3353594932e6c9 100644 GIT binary patch delta 10020 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 diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx index ba72afadb8b07133f0cdf066bd08cc497f4c7718..28635f2e998fef68feade0b83e4809d45f1c0327 100644 GIT binary patch delta 15814 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 delta 32083 zcmbTebzD_X)IE$yNFyLfgGh*UcQ*ne-O>#L(s4vmx;qpQBrn||-QC?FUBab#FDic3 z=l8tz&zw0kd-hs;&A#_@&zTML<@Y*Dp$ieAVfTtUa_l3~poxH9sr!srKH&Fz3$jrm)&jZ3_b~(>> zt72iyaZHzzz1VCrg+!jiIDZtO&>uw@^sws&k@c$EeEu>pk)YF-F>olkS}d zA6eS7R{^+8{KJw6VbH?Ră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 K(D$Q{Is6|q6A}La From bd0577286afd1cd4e30ff98b3c11b5bb67c2de00 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 10 Nov 2021 10:19:46 +0800 Subject: [PATCH 177/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/excel/ic_resi_info_cid.xls | Bin 39424 -> 39936 bytes .../resources/excel/ic_resi_info_cid.xlsx | Bin 23085 -> 23202 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index e3649188fb6f138191b1f97d9dde66832613155d..a141d2089e5a2e56af62786b6b34ecfdb9d87eee 100644 GIT binary patch delta 1129 zcmaJ>K}Zx~6n_8Azv8+(yX)>Y&g!l^tO*s>2$2$43|VF>lqpCQ!9o~x=nxqMiGn5O zq0F~ohv@FXBFDl*q~7Xc5YnYfLDV4v2}3Ayd;dQ(nk@DYZ~phb_ulv3|Nh+>npKA8 zl<@|$9lR9-I7uoaSuYlg0_`Mu*7cNOk$qFkLB;RN6h2YgaETkV8+e2#aY9XFYrw$A zq*w52JRi_8NB%QBjq9|3AsHdrPcb^l3(~Lfq;oZ}D}YBMMxu_z0ehq_A1jSs8X~R*UB6uX>~R8jNm( zm-1TpK(laFt0l&c@a}A*tWz52UQUeaTP@{2`)1eMWVvIHY>lTWEr_ei9{O)q*ioYv z=bhKJtkanI+>Y)D5RW3+pxm@U{O7llGA15r=|-cbTTnu;r(8V_Q|>9nE>B83 zha%?lCVse6@0jCrY+}sdFJGU2^SxphLyTe e=T{-l>yMF7d?#9IKS9#w*#hhE^gs8z-u?x4UjJ$U delta 960 zcmZ`&O=uHA6n>MPq)9fLWH)KD%}B-N70+oLLvT8 zq54V+QuN@-ljs)o)TBaBN)H;mXhl%GNImJLP~)53Bp@L>e9W8g&G+8So40eX9doOW z#cX;KnqLrLf=ovE+h{Zddz$c~_?%&b{glYYZO1d*%XO?s6NE5c|}S4BWsiC5fZ5h8ek^xp7Q3W;@kJm#BId{#Y0OP#4~gPqz_w z(g51W^VkBEe1ZT+XMnIzY|hds}?FJclhl+Txc=rE030 z0zPcU2@sU@r`Cj-b`S8r&3(3^nuD%$vAB3SL?;h|=(S&9(VG z%<-!HbiK#|qVz%~J`LVseP&-zhFeSXQhA*P&Xc`MdWpsuoWty$&-n3r#IITH$w)+& z8?$#;@JuPKh;1U3m?dQQ3J(`_j$8EsGqIrZ;CNy3@!9t*FB0VPPhw_naoEMi@kV9d e@#(g?Q_=W<`29|j{}iD>5Nm;{roH>1_~9Q?{p#TW diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx index 157ff731c47b701d20fbe9e1507b276f09e39916..61dbc52dd9e664948d6ecb8a76fc167fc32c3a7b 100644 GIT binary patch delta 14691 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 delta 14549 zcmZ|01ymf()-H^@I|O%k*Wm8%?(Ps|f=jSraCditySoMp5(pC9-7jy>z27kuIz*C)$CC=iT*`BidLZ$x?_IyfyX)Z_$(<83D| z*#dj#uIN0UyP2^@n!ZfbLXBrUtCl7$EK}z6$3HxqNbsxHw%ggk+^!{J682EOc@os- zTyS$vEjzX3GdeYt%Iwf&1i_-GHokOde3pU`PfC~WT6uv#3ATt?OCf; zU#gq()UU0@HFZ@=>WTh1m8NezRHVClVZmXk>)|)GH;C;tBcXm9}sC=rYccuc9 z48l^d+2Z~&w|i*%;>@7@o&#f~bSUGQ{AMlyl+4^4#g}p4H3Mi)+AppzAMz zldjkrh!_217>#Fz(yupJ;@lhil?}@}n+IMh8Z_VcezYs=88(b(FvKK;%#X*v&0lf? zr;%RetJHJbNe$)jZ0oJugC3wG={H3HvNw&{kd5F7>0!V>jR;_1_pBgOEPRkVG!CG* zx&KZIw|n!vg$KqW6YsN8!bk@IAXlc^Qo(*VDY(L+D@&ni*{ruHBmj65%9QG97;;OT z@z%F0{1M&oNK2yp=e(mj;(0)%S#PcZZ+c|FR(Qrs|J`C@DcA4)b!OVT`=RY+w1IpZ z{m;b4lC-LS$?2Wj4R9)aBKCzN(;cwOWIP!T{qBDG%P5e!;kVCi{?G43-u$n34!r3t z73lLr=P|&ZE=8%Ifx=H2me&OY7C^-aXyf-Q^Q$(4_`Caumf=q<;hX-o$H(x@u07EU zJLwXJn-1)HyAv_kIU51vXR1dxJ7R3Y9i^IWwAN2b*{?x;+m@1s0xg2Td6K% z+>RG~*TqoAJ4y@T;^HfdyPG17@^~!l2FCkoa ztnT){ZF(LsYi(&9?V+e~_jM&aX)c&sZWy&*^sc>dtK-#$J^K9!nLD7?OufPFzg*~+ zwy4N1#pIex=)sJvKzD? zjI7#R%DOE*!*Z)lfDIF*-<2hsLGV=_trV+DeR{%RN@_;?cDr385;5oy8eEm?{>sO) zNpR&>O~x|wQB{$#^Z-8UO0wD-f-AEMvf6BdE46a6YNX?0)yD4_RVl%XdUbk8OO<3Q zId%Dq5cPUwTJnQmVxbBVVL@8RWQ&9Si$$8^MqI}hz$G}_*o5WCo>?6Q^p7?@uK$8v zO-zH%w2skZTGFVoZ=DSgiD_M<_Dq0}qv*~jh{OvaUm+MuQ#Ub$*f6m%22MO#gem(a zP`jF@(Ga*SecvJf?=Z(#h4bhb)U2z-R)eLglE)x*BRIaju!JAFaD3VSyV6w2#1*)W zj!325i!L=#kl`Y< zX^d)ydHChChfdX?OPB4#xQ1dn+fVb)cq6oFkA{d5V_y{|Sci4e?lwt5Xh%l%=}BPl zIADki3xRblFZC`<5;zb{ip(GBzSamz$~G^*SDZIoD}9P4oB zcLF4au2zA(K$Jxm*{hk9x&qc;sby1!d<$d~@uj(CErx;080oGSNja0P-qG4t%2w-{ zG^ArOej?D6>8{Rf%8Bu?$Alp;K5mf;9N$oA!VhUUKCaM&$^f`eZE_I_mG;nFOCIapPs?0} zT`S^-Ra4dN-!x-E2?%706=;D4)t)ZZ37H6VsiRFld4?E0zww&AwTTn5y{=Qlr3Db9 zNh=7)M^gOBp&3M1pW)b!Oy7rg9UQ#Ya}5^MKZCE`Jyv&?6<6~44GVfhU;%_Ed6Ml) z;D{-ylkHMsi7By>?Ly6OR85&?6N{xV0N@VoKsDU|ANbL}x^^p+_+LGhUc8VUb{}Wp z1=sffU)?e~3g$h4-#DX|rTGCE7vCn{eLrjNT+DoV+eoy>`HZf91Ew;F)P+iG7Ay>g z#U?@m5uKJ34<DdLQ#My8AUBf_k&0*9^F%MXERYgx>W`yVM$aM=Eyl z#Ir{Z#k?PMIQn513>NU$r_Ub(^oJnuj{y52z$&s40XL-w(E;#*Vjr%=dJr8yP?Qk3 ztv!g&*Ng*{NMRyN9BqW2<|G2zB6iyHlP}}6{upHvM|`o38Eu9};gTv^gNP@fxN;1V zk41-X=`EEy!_eE(Ft->E(vDpa*gcEe*2o z^fptc;KL4c0qQ4t>uREkhk?H4>8`uKbnFO!YCC!A>~88<5#sCoBW=~p@{++;-ur(@ zqaTvDTnkJ@M$Y3V`fAN3d{$q-T`2C~YP%i&}K`8yQDddqhJU1{T+_7o4 zCQd`sI@9Xsc7W%T9e(UpEg!(nJ=0H+%Yf*yot@5^-n~V9i-(#C)%O4__gZGcoRG9( z2L0CoG*CM3!iyoYGvm7;P9B9nJ1NusxhP;alA@EZhJwd+d`c)56=lbxH-L}mH>UFo zeZ}R~1iJ7RrW@S8{yvYo&~%XO;hB$)I)WZnx}IUXm-(U>=E}=T-aTBsSmP18o<+MCE~Uo+)tye?QNU9O z`Zin@vNL7_`)}(zK8WLiPr>D3*xQD^3;hI_OU8Dl$v!Kxs`Hxj`*Wy3H|GW$ZO1chRVjH0%8gh5+ivxi~{eobmQEA)vMG z!+Fzx-VLHyuLJwI5-yt%5;?s6rvOAW-#>8PY@c_-DAp&z&{N972=-3dayn+MeUurQ zo^`)){(_UAXvT@GlbSgDi`2OP$VPuL->3wb?Zoy1BaaNC5J9=jr_>3KtS%K zNKf=Phc?3Q>%P}3INA`{Z<5_MU(Zy$6HyWmNTX0d2eh*BAix1-loDol1tq}>r4X4E z%*(T2l-A66nV|iz*oVha+-a=9IMr0TmktcY4&N|;o?L%2+<~Fz&~uB7uFK$(#`>{R zXPiag`4NfaTU+}IiEkfln>OHe>zym%^73R_Dt^;WpzD^zNw90rH%OfE`;mJD1HyZw z;d^RW*E_h1JUS#478n>999V?X_UFrusVM~){*75V=hBRg+FI}Hg2W&<+8A_Ew@Z}TICpU+IbMZ}z^ng}CUzzOVC&Wgzk z__Z%PnUVgWoOVU>cz>n$f|t0Qwq=p?d6fWCN#YEUkjS18woOt1pF+7a27lX<_S0@W z?r!E@p9gI3Mi-NPlN=AY%G}=_Iam`J041D1=D6>D4dc8YGb*2S-w<564&6frUIMVR zn#HIU`n22JuNB;IjxrNh9Jw-iocarr@DOueqLJ%2q`-5dw-PQi@F@~U6oTF#g~zWN zo8m9z@5IKG>XsWtw3(HrJZ^80z}Jo{~~?b4T{RXVpj>OsHy zI;4PkMu*EZSjihg7!qmW->xShTYE6ycjZq^HGM_;tDW7#Yq`gQ&PAA4Oag;;ae@STwK= za#5IsZd4f8Doj{fdV6BFxZJ?{0{(L8=eo7L)^{A<1O&pfaZ%y84DoxoX9QtjJ#@aN zg_)?HriGp8s-}gND8HtKlW4oI1|BZr($jDgl5+4T3SXEay++T>k<;ZNzv?^ZwU}3JpVaTVgh$&m%C;za(D%Zp!|to2I)b8kJg=$=SDDWL4B6bGsW7cqG4 z8?>nNY&NtgpP>#~(tI(rD1KK9DQ!Ngr-jQ{Y24X(aNa=;6I}FJp=fl-h1z(4#eTU{ z#2qj{HdfU4OEVj-s!PMMdF9b8m1arG6r1DpMCe4e@T@xxS_D?JsDR6AasxgAv8m0h zA<7}E!uk;=-l6%CC}1SmDEbEeHqUkOmhLtWuy~7qn-{xy%XgcXxp*sZB&uF{jCdsK zTzM>iB>JuL_33>LYzrnU?=-~-EHPfrGw(?wVfid0s|{S{wHPya5DQiI>e?LdKa*wg`eMNy`u89 z8I$EzyA2B6>Q`33y49*jj?z1%aMR4@w9f4^47D8$6{9aJX) zrNpAkLlR3J{u*(v{Xt?F<0ktfVOY>o_-(@N#r@({|9x^uI?zOcJTl>ru&_+JZ%Q&O zY|3mWV2C57Kb;5{KKVlPq*@R&CVWp))`71%z?_Ox&K0{4(>SWnyMxxmoR|MG`B?_X?y&F{hl}4+HQ)nV*(SA1_ zN{>{$9)n&u?k6f-mZ;mgD&bg{Gpa zpl3|9kl+4GA#XigfCFy5&SY@Gm&pE+s8}7sXP+~y=eG_dJwkDr$~fNu|0ofrdtVBb zQLh`k3G{e?WWL}->oU1x=~`RY%LwjndhR~sDhcJoS+i#dy2v=M+|TH29VD87lZEma zKzUI}_m(wOha4+Cv)d{j^oYS#5elUJw2i6MHXjNlF4hCl1!>UNtqQ{3AH8S#G%^$q z65+X#eqjmJ?ChjUnE0R2TA~z?WICc0kY!4vCXq%JG1EUKtWh_xl5S8paFTXWyE%W3 zRQr`2rFzuC%_bK_BAh;b%k7ywNn#JDK(9|=Qb?zqaaBdfl5tf*=bX{drNzkVaH>~l z{CgF}XVOBA*D(F2;plfMD4zfiaG%jIpVU+$sDZG4e!C&l9?eC@zWSB+HlQrQsE}1oF8&MNyt>>Qc(^N$7$4{C6!p0_NREzE2 z^*gQ_Z+{9)+7$&!G;FT+cxUBENCTO3(E`X?&mx^m2>p^4ydm=mCQPqpxDpnxR)!5k z%O7Lty;oImAigb%yZnd_xXepEeoFJ1o%0M36FfL>7p5Zi@HWgvNBz=SGZO`yZM2L# z7!p`}EWa(fynO4oEqcCui+#BTpLcA(-RBPGQOS%p8A~?lp-&)vp^J3x`8)q?NZV9K6$fw_FL(C6%aZ)b;D98YK%a+HJm>7WU++|G@ zIMs?ssM%BDp$Y2(Zd#@1L?lrPdzc@5`!fc@W&0)zOg|T@9hE;|b7iE}HZDU+6+<8i#C)0V*@Phn z=CqCeA>S52b@WzN{(%(urex-}%^okoUsPqO-v8rssA@aOe9Q7LS>@+qwqOEWdY%%*x!_`(VrigPCAf~jg0h9d_+dtWlVTSU4;HreO znQ*PU9z#UV*0K+@Sx@HGLA#}nPKcRPF&?>FU)%fskJlJlJ-^Vu6FbZ$Tl)47QK(E_ zCAPQ!7g6x4z>XZOF!)h;qW>zDC7XxOPRVe&H^TM|9?k)GCKOF^TZ)t#2V;rQGEV?N z?uVOKIUxf2^AxpA`nl5`P+c-?@4p;nVENrK4@!R!g@^^_zeM3K5|xDJgD40VA(kRO zzd74}Z-oJAIbJ_KnE{N>uC)>q&R@){sL9`G5Ee~ko|%@szGR>6iFA?9Y?xE$X-A=Jlvez6P8jal2b@s?*{!x1 zh}j3+QN>C(8G~{(Pm0?{GT=cH^KD zLHqG@LT8x6J&x*~$ov6_Dshv@t`bA2XvK`45*o zr&`||t-eNN1TATkgcI`vyv!kkA+qt%u=W?e=CNAC>@tiu6zs!5@o+*0E8X{h%~R7O zK+}+AfDA@BG?IRz?XZUoZs=emrR_k)p6^+eipU=n%)m=ZuZ|Ke_ho0J<(Z*|q1qqn z<)syO{~9_Gz?Zs9i8g|TklXYdKxZ_ucybNah{~Wx zH*ZSa&IAiz6rT?Js@Z+S6TX5!8sFNKlULMU_4dEwR<>l4VEj4p`o5fk8Kq{j_gU8tT z?N%PP5*GkjaH98MIQ1E>Gx`ywqR+`wAZgStsj8b6m@M+bj5Qgtw+H@9h&Lw0t8zeR z=FH%23%&_cEIqY13JYbCMY!-C>_6NC@<*(}qtPRm`r#i)5&sei?!QDL#n63~ z|HCcJD7=SA-4BhTz}v89UnoMzmbxqXRj)t@0+~o;KR=&$G)I4c*>dBVFS2ij^8n!RlHOw5SKd^eRG4`uX;0l3EYCAgtLS8SAR4pvqi2OhulE?1o)vLX3OW$6PIdJrCt z5ABx1yUBRSx%}4MCbgK;CHrWE>@bgaU#VkoQ8Z3$cH#bqgIOYm2OUrJ-59pIhRkAi zu(PXs*m&vrMKeF?{HJVMI+jSo0-?F!5wOFB*QYgbhv7=mXh~3j5c%OO-#Z>Ch!4c} zpO`V|HHjIp0?@fztyom;Lig2R#8hPVqZRHJ#ZG3jvhF8pT2Uq;nYhY^i9i_3;`J#K zEL<0fpiI|A@1nBZ!p~D%38ObhwJA$Dn*GM~b~HQ04B@W7ihAa*zl)0CuD^^j&Gfm7 zQqAsfl2_z1RRkc&l*c(v>>nA%QU6C3OK4&Q~2870B>FGaC&WbJ(Me4_Yl!T80 z6b7)n&3BxB&bm3{N2BRt!NK1+F~{St45!vO^~`+iaImLXQ#r{L+CNfhA&$lHrSBy( zsT^wsI{Ntq-APrfdU)9Q#e3Ge+|cE#^a_hmU>&V2?}v)UuU-`~=Rh5g-x< zx`e1pZ#qhgWVYiBdAZaH5!c1NrAj{4p2Y)Jy@>-Qt%uE!8KG3AMMf^e2&8ti(w(KT z15LpN`L1SL%pdS_Vh%9apA)(PyME!i)!lgAr!ehxp9juYwnhq%>%hHhgb~e5DJ^n{ zLf+?oc1g4~i9|U66bQW|GMjq!b#o=n!Mcm2dfe|&8l?z~VL-V@{+&T+IboB$eM2;s zK(5Ahx)u$({VNMax(t|q`_F%tJCckpW-AgUbIHE}lg zqbp_M1aw`y+jlcNR~g0hhmB?|$7*12_-XQ*|0!}I|Lna)3gpLXi^ZLL?*3f(efn5M zpsq0Bc3b#9up{DOeNG?SEPd(=#e41kX!s`0q)@i`L5I|ydlk(B`!RWHz)gjFtl1gv$K(53HYY`X349+P{2PKlIXH^5BC7c05Xc90mToBzV9dA^kS^>$jpB|GUy(~4VUZFE7DoTNKd{Bcr!_tfzvznbP z6+XD3U4@jkQXV>ZzI`0cCZT}4B7`Kc1)4TXO=D&$P9_;=mrr*MdaPHbJT&nME2Gtbpbrq|fm#`j+N)B1&^&3;^ z4vUnMyH$us!4Sn60Wo!~!~IZ*>Wq_htRwvpi1Lh8p`T51FKF$M6@z)GLaqAr;Dw?S ztd0!f^Z7bd#cUP=EmSIZc{7^zsX}4Sl)$-ET>SbXlW%;*KI6XD4k7s*P(K)3bVMa? zsFRLnc0-6p5yMgbgca z-@_JLAwBs?^Lh$weev9|Qjc>2Ta+G{*@j(cuP|nQ$pp_8<(?98 z{7WG*)5r<`T!0GRUV|_x7Ik|SDtuTU^D%{(Y4^lanhM@^gD@FZNmrFJd{{oqF^8Dx z-NaLtiVlQDfGBMhR6{o<77mo|W+oO4@qrYOmzS2%1hc0_2)Aa;wwe}eq5MUrQ7C@X zFNerqlqer_`b8L-dD&;IU{tt|jT1A%baWt*Hjc3t2XLytIy*0w!rgo@IA4;&-FVPH zuZ0u#CU3w1pn32H{~<3R*tV595;rTpCt~o3^3mpV_MbE^-fPtPWJf1$`l|?L1m{cn~)le@Tj++9mg*O?q#`wGdwME1?3E4QJM1>X22+yjc|wh0uz zG)=`XYd?QupAo@|e$2@ZO_#gmiJD>?96&jI40(IK{bUTxy=vGV`)!kVb|&DBHwHqN z9d7xcT#Vr>wJq%C;ec3aIU_WSWD|{F3nR4rwiG{Bksh)d3-I8ngjNhRworRx9YGoM>3N|TIm|d4CwU}KuDVLbpY%o5h z;&Dewr;=)^v@k_tFB&46h255m+AgNU&Y~WzOX^m*I)VBuTI6eZSZq)SF0KAm}lB97LV!>4BPvX7?Y3M+?!+JLMZv^?{Q< z8bf;r&R{fv87Z1Pb^z7(#;=7*6I+ewY4I@A&69Q{L<%TqIaE*7YpXYL3-^U~#!)^O z4dE5K+UihUEPu)%K#JBQvvLMLti=5mI)B!$=3`Ro%`R$(iqW(`WvJN5Xm6q+1RNg4 zhl=^NKc%P~sA+$2gein}ZCD5^8>H(~R806692Nk(=U1}sDXPKHgw!aLpYnY3H>yTU zx`FHhHCzI{pY&W!f_b&&D#CRXuOq%HL2{zbl7F7~S_APNWtKWmMI%gosx-)&4{w9b zQ>K@p?>^zyX`h(7wu0LGc4V~E|DutTHEv>pqVvc#t$RZ$H$k)o@Y);oJ$3#&OAzd0 zz&8w1I>L%gj*Lvp!oVt?|sG3Cc9f;%qH~y zVdrReJbqpd;592L+BmG&=cSe-C{Bk7gu%YAt*R}0EK^(iwUo^@3cKja5uweigJ!n9 z1GGZOV?FPafSbr!q?a3t>KS+p_PIj8rf9DE~Dk2pI*dSy4(9q zfSh`)Gr~3*e|YDiv1yLJmpUKXD96%`!0(tMacj>ZDdX&sCiN_) zuaA7=SM;m37y6fCzc)#j?S#DLvr@c|e7+a{D`6Oz^pP<1YWqkSc5gWUzl5Q&zd-{D z8gIz%uR`9$o^KvwHY!OjEP#_a(wICXyK~0AIPoiqF7b%3Mrh9H9edu(DXWd%(;^G8 zmb{dX*x!a2RTdllecBq}zwMCe&I_MBze}okB9oo+|9SPq1{j@O8|jb(`iC~tp9xL$6rTr2N@-Aq$k|h{@Xkl;p?NCn`EYSTi%(L?p%?dF8 z3H%4eL1~8)rLvQr{f-zj{Ff_~IQ(;t81mT%Tv5qNH<^QaG_>?b!(a0%oRHz@k832> zJEq+EZQ59{Ar19T01w27wK}}(@Z8@uH}sW$>Q}t>Eb8})JM&ejev2pmkCg%ZzbgZE z{eMG!hx$5(FsoBlicSp$&96c@M)fYOm;_A`*HzO^h_xl=RlCZ{wDPfG@HizpX{M%e zVb+X{b#;UN2#EHK4s~@y{WVyuyLC0uahQ#~~)C>Y{M=G*&}JQd-ttfXw}I%XQm(<`Ez+ ze0cB7L!000O$BM8GJzepm&{G-#5$-Swd^j4Yz*AiJln$tSl1-Mjm}8 zZwD~Z$2F_L53YQc0Wl&v^ot5__MmI2n$avY%An>*)4gTJ=@~;e#LVQ%j`j9suA;-p zp`7B$gKy5}wYQbv&gEU~&YVh{y$&dd&k1KdvpCo+ro+maRoDgx(Cw$cS%#YwwSj-n zFYfNZiAXbCO~d<@&mJWsXi zNVxcM9xq=*jFPihq|`ux9=#*Bbar2BU87J=+zn7jwf&EW0}mpBNO7HU_hJahPSkXL z)e1FlUA6nIu-vu>@YutWTgT!|yWH)1s&^Q7RkB-3;t={Wdcd;+Tm1fqs943r)f7!n z5G}LVg)pcGQN?K;4pu!Kb|@>R-}lG@oCf~=oEg^yO6O=CTIRkF@ol;iSJxxz2O0a0V*`4%^1+9W#Jpa!{0f5G4= zKEfNBh|9d#XRq%Rt>;-gOs_b{B;-}DuF%n{C*b($N!<3aQiVppDwdCttJS8B0-<-8 zD;B>rt*bP-g`^3pzgCj=sFw3IYp{w(ePIoF#4m>rFpGuGsEq^uA}bxFhRXEU*j7mcUmpf)s@;HSMzw&rA1MwAt}kd zrt!PI*}i;j5#Pko*EZd;SE$k6GW)*T8cARJ{5qdSUmq z-a#Ikha)xDvGUKTboEokUhUvJ?OV!?2$4m99l&ez`xn-=VqQ$e3IuUEFDGk1n;S%s6+7Ut@?zEIP^|_Sz6m=PD4om z4R&4PJ5$W^(8yV!(<-IYA;n$cfH>yNhKTXhC5So^!y1$W3*^q=Q0v7PRP?U~cNbBZ zJOH)L*1oN)c#8vkG#R{mnT%Faa{PRP0VH(UpmFKlCRfw;=5g>)nQTFCNu!MLa`G_d zJyn<9#VcwIl!m_KbjYAIR3Z0v5zahlt5_2zMqB^dicsb0(F5cX3g(eR zgL=O~S4kPB9a5+A-S`+m@=v}Zk`iD~@PGtFvtT(fX=gFcnz%^voVZBRl8+jms7v;y zm7hG?ho3w+?W1nx7b8{Uynq)oD}^LEwy}s7ue2@B(9&$tF=3(BC&&|fldWRa#tEI+ z>34yixpZrQA40CEt+#!tiNnIIE+NrNtC>cFlHxQp=k1gXC*C~1HjQ2SYUT}Cmp)!H zF(lEYkzASs*0M_O`&)|RdDS&;;G>`nQ-P_qND1{TejL<+v8bUkMT-TfBpQpoWTyi(TYVFi*YZg|t|5^BF0gAKkQ>Es`F^w#+?)7S1x~bewp|pv9G( z-HFfGyNnZp>FSP9{_O=2(;*u|!KCq64N=xM=^lta!2kPeh?WiiKx~$ytK{i(MjH0* zsSF8a?i4sNHoO;=H)j7Ai2mv}4?hTA;opA3$WfiyYeApbEhJsMaxk)Y$N7`|W48=C zV6c%l!r(?#M@S@Xot&AI&}HW05?)L#IR?P7DrDNaIASJg*QX}|nxY70(z|~YhijO( z(|x#E;!AhOa=5i~6Sd=>;U}jGE0|&ees@lgpfYc9HW7WQ?T~g#ofndNjc#CN0NCh- zc;`J73_-r_L5;^(PtQ5-;Qc}SsaIRq1Wh{c=n3`WQn&O#Hn0RCV$o?2$j=i?ocdi# zwGf-Ig1)2g;8uJ9_U8-a>TT>e`n6A&ZiW}m)Smj`rbj!VMXsZ>I5O$VJt!Mxdd04fe)zSz|~uhn?oqU^Yh zGbZa_q*ZS&iV*f!*yQ>z6F>RA{77r6V6jv2yJ*67Z8%;ofo9;;sAgdsN^tBBCJaD1 zo-9W3v`U%dWR6|oV?A25-SZXE^yv2=_)Cnb-J*MJ*~~X?Iza6(wVn9!A-O5Hg9Iw@ zvgO+A#9y-y>n-`mUfVaMnh;Q2=%T62Kqb(Ko=ANXcDV|DJN zpSZckFFS9K=gQVI#KwUyzlUmtH6LOPFPP2Lij^m4+*LzbFSLS+vSFc@R^;krR9wEe z@xaXeuwC@U!et?uA{KN_rWsl&{Cb;(5v7ObWHdgy4HhpS=ETFx!lU9h9mW{)*SrMt+#BARu)sj{;T?<&G3=&#L)Cx{&Pirw zM;Sblf#gX*Mm27*fUFO)22$BDPrto9ov@_>7{iGLBbmv7I=vyxQbd9r%%(2B=liue zB0KCubs;pZRFpx#&-j#)L=*`i8);Ztb=a=9ME5Hr_Yi(Wgm$I{C5K~h@4pKQ_1qh4 zvm25e1M3vm_6t4le&Y8S#nAhhs8er){PqD~*!>7=kd(jQZbb5jjcB}c~=d%1AK=;k6@A(bq=gA`7`)(IGslA2bA%oOtWN^1#=-H$O z{ps0RlgA%S|Moe%Ny7EHddJGVOxB7gi)cWh>x zCZm3~@O1nsv$=Z?sre1SG%s9n*&KpXs8J4gN#4U-XWL>rH)#Bdk_I2u@eM5VRXLef z=|O?C_OPz3vhA~w+f8a?%t1F3)U{^ zZC(mpfV+$0HJR8Bg@UPP@`ZXaJ)E6ZTHB++MU{mJO4UP)n1L^^Dd&C{8*bU;05l_W zenmiRSA$U;Kx_UMK&hqkwOsg+^^Bri{uh@-FPmHFxB45QLWc~`0qM|w==`zwh(3NI zvmM;Yv&Xb?=umT1StjFFO0>F-BQ#WJCPHv5DCdM)&vPF%ADPiq6yQp|iDW9{AnGSB zI3E_DUlcjQjvABfoU8JnOat7gH2_nv_+?#g5-H_^>2G_5_L>FsB?3>5LoW9B(h^VO zc8Co6j990|<*0VzK@rr2pOnInY_Zcj8w{TAWiYtc*XR5Xl$FTUr9~tCnG%3Yh~P$vIE*Ttf}V^2=rSd6E4)Wd+)^u?fP$v zNG43EX#w~nsm}zg9YolXv+?eS1whsqkA|m`pQDXDd@?CF5So=uZW+n0?=EYNJ<7dM z;FO@R8lS-xKz$k<;4YwBjikTt)Wv9yK%}XFG_|-OdQ?Cvs)V32EqVwt2~ds%4(Lb= z?f=HW?^@U&L$S5_!SO*V+T7ruK@r;2pZ@)a0s}++*hKTs2ONy_1Gzw>+D7pI^9C7+ zMMntw@Ah4gs}42<0~#n#7aOFE1`YDiMI-#5J-SH$+KcmVGul{x6?b&73IDyb@4uDw z@%}2&>0%T9_pY9QTPh;_tK_VU{psIJ`~Pie1eB}G0R69}!x>#{h$PCtgPuPu|5sN3 iAH)CeRO$XIiRxj0`gcO{zb)^BT=f`Ww$%R__J05uxrf&P From 23e30e627631b66454cad70bf1862187f31e96b4 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 10 Nov 2021 13:57:33 +0800 Subject: [PATCH 178/253] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B0=8F=E5=8C=BA?= =?UTF-8?q?=EF=BC=8C=E7=89=A9=E4=B8=9A=E4=B8=8D=E5=BF=85=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java index 97d196e60d..fbeefeadf5 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcNeighborHoodFormDTO.java @@ -66,7 +66,7 @@ public class IcNeighborHoodFormDTO implements Serializable { /** * 关联物业id */ - @NotBlank(message = "关联物业ID不能为空", groups = {AddShowGroup.class,UpdateShowGroup.class}) + //@NotBlank(message = "关联物业ID不能为空", groups = {AddShowGroup.class,UpdateShowGroup.class}) private String propertyId; /** From 03309727291c896170c7986345690f81f52731e4 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 10 Nov 2021 14:10:19 +0800 Subject: [PATCH 179/253] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A5=BC=E6=A0=8B?= =?UTF-8?q?=EF=BC=8C=E5=B1=82=E6=95=B0=E3=80=81=E6=80=BB=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E4=B8=8D=E9=99=90=E5=88=B6=E5=BF=85=E5=A1=AB=E3=80=82=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=B7=B2=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java index b14c58b47c..879fd011c9 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/IcBulidingFormDTO.java @@ -96,13 +96,13 @@ public class IcBulidingFormDTO implements Serializable { /** * 总楼层总数 */ - @NotNull(message = "总楼层总数不能为空", groups = {AddShowGroup.class, UpdateShowGroup.class}) + //@NotNull(message = "总楼层总数不能为空", groups = {AddShowGroup.class, UpdateShowGroup.class}) private Integer totalFloorNum; /** * 总户数 */ - @NotNull(message = "总户数不能为空", groups = {AddShowGroup.class, UpdateShowGroup.class}) + //@NotNull(message = "总户数不能为空", groups = {AddShowGroup.class, UpdateShowGroup.class}) private Integer totalHouseNum; /** * 坐标位置 From beda2355b6017b0fcc5566eb6c9323ceb1f684fd Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 10 Nov 2021 15:03:18 +0800 Subject: [PATCH 180/253] =?UTF-8?q?=E6=9B=B4=E6=8D=A2easyexcel=20=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 31 ++++--- .../service/impl/IcResiUserServiceImpl.java | 81 ++++++++++-------- .../main/resources/excel/ic_resi_info_cid.xls | Bin 39936 -> 39936 bytes 3 files changed, 64 insertions(+), 48 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 1ce7210814..548a9b1a1c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -21,7 +21,9 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; @@ -54,6 +56,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.file.Files; @@ -167,7 +170,14 @@ public class IcResiUserController { return new Result().ok(icResiUserService.queryIcResiDetail(pageFormDTO)); } - @RequestMapping(value = "/exportExcel") + /** + * desc :备用 easypoi + * @param customerId + * @param pageFormDTO + * @param response + * @throws Exception + */ + @RequestMapping(value = "/exportExcel2") public void exportExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); @@ -228,7 +238,7 @@ public class IcResiUserController { Map> sheetMap = new HashMap<>(); Map mapData = new HashMap<>(); mapData.put("list", resiMainList.values()); - System.out.println("========="+JSON.toJSONString(resiMainList.values())); + System.out.println("===resiMainList==="+" "+JSON.toJSONString(resiMainList.values())); sheetMap.put(0, mapData); AtomicInteger n = new AtomicInteger(); for (FormItem item : resiFormItems.getItemList()) { @@ -241,7 +251,7 @@ public class IcResiUserController { Map mapData2 = new HashMap<>(); mapData2.put("list", resiChildMap.values()); - System.out.println("========="+JSON.toJSONString(mapData2)); + System.out.println("===resiChildMap==="+item.getChildGroup().getTableName()+" "+JSON.toJSONString(resiChildMap.values())); sheetMap.put(n.incrementAndGet(), mapData2); } } @@ -252,7 +262,7 @@ public class IcResiUserController { workbook.write(getOutputStream("居民基本信息.xls",response)); } - @RequestMapping(value = "/exportExcel2") + @RequestMapping(value = "/exportExcel") public void exportExcelByEasyExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); @@ -307,13 +317,14 @@ public class IcResiUserController { Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //========================================= - //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); String templatePath = this.getClass().getResource("/excel/ic_resi_info_cid_for_easy_excel.xls").getPath(); - String fileName = "居民基本信息.xls"; - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(templatePath).build(); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); + ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(inputStream).build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); WriteSheet fistSheet = EasyExcel.writerSheet(NumConstant.ZERO).build(); - excelWriter.fill(new FillWrapper("t1", resiMainList.values()), fistSheet); + System.out.println("===resiMainList==="+" "+JSON.toJSONString(resiMainList.values())); + excelWriter.fill(new FillWrapper("t1", resiMainList.values()),fillConfig, fistSheet); //======================================= AtomicInteger n = new AtomicInteger(); @@ -323,11 +334,11 @@ public class IcResiUserController { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); - resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); + //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); int sheetNo = n.incrementAndGet(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build(); - System.out.println("======"+JSON.toJSONString(resiChildMap.values())); + System.out.println("===resiChildMap==="+item.getChildGroup().getTableName()+" "+JSON.toJSONString(resiChildMap.values())); excelWriter.fill(new FillWrapper("t"+(sheetNo+1), resiChildMap.values()), writeSheet); } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 4b2a407e7e..44345d564f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -640,56 +640,61 @@ public class IcResiUserServiceImpl extends BaseServiceImpl e : formItemMap.entrySet()) { String k = e.getKey(); FormItem v = e.getValue(); Object temp = map.get(k); - if (temp != null) { - if (v.getOptionSourceType().equals("remote")) { - try { - Map columnWrappers = new HashMap<>(); - if(v.getItemId().equals("1078")){ - Map userMap = resiMainList.get(map.get(UserConstant.IC_RESI_USER)); - Object gridId = userMap.get(UserConstant.GRID_ID); - IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); - value.setColValue(gridId.toString()); - columnWrappers.put("1001", value); - } - //todo 获取 options - Map stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), null); - if ("checkbox".equals(v.getItemType())) { - stringMap.forEach((label, value) -> map.put(value, temp.toString().contains(value) ? "是" : "否")); - } else if ("select".equals(v.getItemType())) { - stringMap.forEach((label,value)->{ - if (temp.toString().equals(value)){ - map.put(k, label); - } - }); - } - } catch (Exception ex) { - log.warn("listRemoteOptions url:{}",v.getOptionSourceValue()); + String vauleStr = temp == null ? "" : temp.toString(); + + if (v.getOptionSourceType().equals("remote")) { + try { + Map columnWrappers = new HashMap<>(); + if (v.getItemId().equals("1078")) { + Map userMap = resiMainList.get(map.get(UserConstant.IC_RESI_USER)); + Object gridId = userMap.get(UserConstant.GRID_ID); + IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); + value.setColValue(gridId.toString()); + columnWrappers.put("1001", value); } - - } else { + //todo 获取 options + Map stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), null); if ("checkbox".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - map.put(optionDTO.getValue(), temp.toString().contains(optionDTO.getValue()) ? "是" : "否"); - }); + stringMap.forEach((label, value) -> map.put(value, vauleStr.contains(value) ? "是" : "否")); } else if ("select".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - if (optionDTO.getValue().equals(temp.toString())){ - map.put(k, optionDTO.getLabel()); - } - }); - } else if ("radio".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - if (optionDTO.getValue().equals(temp.toString())){ - map.put(k, optionDTO.getLabel()); + stringMap.forEach((label, value) -> { + if (vauleStr.equals(value)) { + map.put(k, label); } }); } + } catch (Exception ex) { + log.warn("listRemoteOptions url:{}", v.getOptionSourceValue()); + } + + } else { + if ("checkbox".equals(v.getItemType())) { + + v.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(), vauleStr.contains(optionDTO.getValue()) ? "是" : "否"); + }); + if (v.getOptions().get(0).getValue().equals("zhianxunluo")) + System.out.println("v=======" + map.get("NAME") + map.get("zhianxunluo")); + } else if ("select".equals(v.getItemType())) { + v.getOptions().forEach(optionDTO -> { + if (optionDTO.getValue().equals(vauleStr)) { + map.put(k, optionDTO.getLabel()); + } + }); + } else if ("radio".equals(v.getItemType())) { + v.getOptions().forEach(optionDTO -> { + if (optionDTO.getValue().equals(vauleStr)) { + map.put(k, optionDTO.getLabel()); + } + }); } } + } if (!"ic_resi_user".equals(baseTableName)) { map.putAll(resiMainList.get(resiId)); diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index a141d2089e5a2e56af62786b6b34ecfdb9d87eee..33b388e4f3846be3aca3a29831a9ae28ca1e69c1 100644 GIT binary patch delta 642 zcmZqJ!PKyWX~PpH&W3_1CKe1pF!?Q05M$nC2WD|NS-@;JIgCYQ@+xMD$xSR$lcz9? zP0nJGnQX@*FpHTqyRnBo#R z#7%LC>);TFm@f!%n-&AZ6hXo1+|#)kSU7QLFaV27PL}4;XB3$14J3soSM%t5^1{3~ zB`s~g{C;@`7IUylF}S#(AVeHuvN%lq3Ii}O93&VR4uI8*PM*!H$u0$EvrmrZlbmeB z>n6zqQ~d=Rcu>{cK-Kz_m3Sq90r;5L9Y|{P=`(Ty_31P6PwwW^mt=?OgxCXg4#Xag z$(Mm@L^d$9-A1?zRP#+@$FA(zaP5xCfWwTG(I|)8E zs5lz~kj1yzqy7lzIqm>U3*p_~2y delta 688 zcmZ{h&r94u6vtmOGmX31WH&WtlkLhbBDC7VEcmMjl|VslD_D9^L9myy1&>8Mv`{^G z5ql^+aY6qF5k`s!K|v9F>7gwiORXMyX-|q5!9Ek$izM)pFQ0to&E#cnQ=i+^*H82m zERXj;h6Z5xSAU83nIF{~k;M5pXuodSG^Svgl6DsS_TFHoL%MsHUPqMSO(rv{sk`N@i_g8oF}H7 zz3s@zxy}6q-j%=~CGfa^Q+&2|fF;MNnKcu5Dq%q-;x69HNG*lW>F(qEjC|_VKX0j8 z-7amHfcHdZaKjxZ=5gn{b^Zfr7@-fa6ZsCVT5U!l$~I2e0rpx0fmOFpuZMSSXUUd< znef)YV{4E``_PtJj(SP00T*o<*mXbNn~omuZQyruGKys-=fg8rNp&}#Jj26jPgN%0 z8D<^~TB$*ve%kqTO$}H7`L+!rf;LbRYG`&Z)p~~rgjBDu0$t6J1tx$|)X1mARAu3h g&bJO;d{M=Z4$sX`jUA1A)50sg&@xt3eV=yC|Af$=!~g&Q From ed157d2f3bdb0dd55d5488941064cb05626f351d Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 10 Nov 2021 16:02:22 +0800 Subject: [PATCH 181/253] =?UTF-8?q?=E6=A8=A1=E7=89=88=E5=86=8D=E6=AC=A1?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 7 +++---- .../service/impl/IcResiUserServiceImpl.java | 3 --- .../main/resources/excel/ic_resi_info_cid.xls | Bin 39936 -> 42496 bytes .../resources/excel/ic_resi_info_cid.xlsx | Bin 23202 -> 0 bytes .../excel/ic_resi_info_cid_for_easy_excel.xls | Bin 43008 -> 45056 bytes .../ic_resi_info_cid_for_easy_excel.xlsx | Bin 23391 -> 0 bytes 6 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx delete mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 548a9b1a1c..39b37f01b6 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -56,7 +56,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.file.Files; @@ -317,10 +316,10 @@ public class IcResiUserController { Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //========================================= - String templatePath = this.getClass().getResource("/excel/ic_resi_info_cid_for_easy_excel.xls").getPath(); String fileName = "居民基本信息.xls"; - InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(inputStream).build(); + String templatePath = this.getClass().getResource("/excel/ic_resi_info_cid_for_easy_excel.xls").getPath(); + //InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); + ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(templatePath).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); WriteSheet fistSheet = EasyExcel.writerSheet(NumConstant.ZERO).build(); System.out.println("===resiMainList==="+" "+JSON.toJSONString(resiMainList.values())); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 44345d564f..27289c392a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -640,7 +640,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl e : formItemMap.entrySet()) { String k = e.getKey(); FormItem v = e.getValue(); @@ -678,8 +677,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl { map.put(optionDTO.getValue(), vauleStr.contains(optionDTO.getValue()) ? "是" : "否"); }); - if (v.getOptions().get(0).getValue().equals("zhianxunluo")) - System.out.println("v=======" + map.get("NAME") + map.get("zhianxunluo")); } else if ("select".equals(v.getItemType())) { v.getOptions().forEach(optionDTO -> { if (optionDTO.getValue().equals(vauleStr)) { diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xls index 33b388e4f3846be3aca3a29831a9ae28ca1e69c1..a3fea99bbcf990cd9a8e0a86a49b172c4346cac6 100644 GIT binary patch delta 5933 zcmd6re{2)i9l*cu;v{xr`y9tkLY$=eK?*D+F@*dep^e+rPU0khlaP?o1=@zTP(oG_ zXjvI{K`V(yQ^rG`v{qZUv9Yax5PDiS+Ac6@>xKkWnkIEyIz}h9bz8S(omy!Wnti`_ z=jV57rcR<#@#$=T-uJzC_rCA@>n`ylC2?Lk5-eQ@=EnoD7XLClKb)VRr`8yrr(!3W zHqSzgFG(xV&j-_0ZGT#!lRxjV@mD=|b_;(>&F61=oP1gh^2=Tue@^xB%j%r=wx^J3 zh28>YJ2vsd60ITkv`abP&C4oE+!36cfen0+23sHC|0*qE9ejOxE9>N;iYoqk*)(r0 z^RTttQ`XAX>5>>fQeMS+>6^D!IQhTJOIg3(`-O_n>AeT_enWcOR~CoZJv5r>umikjjyRMVBL6x(pz``IZ@hjgfx?8KW)RG5|ed%$DPA2(K<137S3 zx_}qFFzZZRAQy5iEA*kM$T#Q*KX|1J=0P3=9I5g7kZ+m40199-9p!OT<%?hu?2!f( zLLp50QWFFqU{PTaTF0K;l)M;9E#u3e41OuiR}SSC4Oc*gzMyz=&lkgDsFp5R36+)! zZ-rYeD_8v+ zlDrc-EgFeJ6dK>pNNJ!8x-1iRLpL}izwLn@_`BgH{Kejf*#N(|;|FyE=zIXz(PaVM zZU9dVrb-5Wt4Kz>2mh(qGJ|Ffki(}({k4UrEPyhM_vV-)F{T**<>+IU;&%y+;b%rO z=!_4b^%yhPVlS`Wi{e-iiH?<~v=0C0V!LratB{OQ_4v=HkD|M6Kr)Wiro0*1ugmlB zyG6*&esSC>W1=<`Q5S>mLdq8uMk){#L0TlJ9f?$7jO#!O2b1umSD04bLh%?%vpxY({n6hli>UQc&3uv=n0s1yvkDJ4uoksZ&rc zQdE!+sY{R_sasGUQjef~B+B2kIt2<8i13b~d+Bzx9}m5gsjzL9+>=<8vO&r{o1{2I zxo0#dC0{7_c%{g_Q105*c7`o3m$0F|G#5eCD2dEW^% zg0ErQjBfYjr}E*$_EOY5VC!ZyhlLKOzMTxcJq%wrXJ@#$Fg!0vMf!#y57IZ2v=NsT zhHoVi7Zrx%f^w0*Ey#!T9g`INjlz0C42fz%!?qNN^2A7hMfs&&0hN3uDal01^fqc6 z5^Y)7HaD`YJqjm8n;Yl*t{@fZdxAU|fxj;(2W2k^^5R@uwnlkyILn5L^YN?W$9VSx zk1CJsl#E-kY!w-=To%}{P?EQDp+f1b6oBnuw^RWRv`u+D*`^t=gL+{_g_4}5T?^RS zalxzHtEMw-!6 zmmA4?_{B~S;JAekBO2ry;ouc>YCRnAOQT^H=8JcZrEP?t@_+0aMSuI5*+W5lXoJ@T zk-z<1kO%1(g2>;_2_k=sjs>csa9*_evBw3ZH*n!|sO+V12?NgUiWgqORy+4h7Lji{ zwdt`Irf8qP8SE~Zb#C;D=c7r(`T+CMBr&U(>&%8(Vvt|h;pSC+c<%dZYYZ-;x{{fp z7g9$*W{Z#a`p@iI!S0XZE*J(zdmM#d3!**#jUd|N-wL8Vo)v_93~vg`Mf#l}AMXFm zc%UpBLfAHfCw+=Bo2HQwVvVOCE}wRFypAdVj7yt+(?wyIC2UiPVAdpB>7y>z6NBH= zf)t7aZs`B`EkNfc*EYQIGLABclJi^q?14Uh;jx{V3IAY9^c~{Sy*0c!o~KRitzgRh zlajtZwV?b-Ifn~6rHYC4J1IRlQ3)21ki-#r#@Fyp1XChi?YE zTYsa)fIgmHLnRD5)Am2%VoN&VJ=8&RC;w;J#9ut{I%?*?!J1?>>C$EnqEj9^dNU~J zlXFV*F-2DvIi>sxjhu2)dK*GcX}ke*rryy7iZ%7g?aUvB|LBT!%g(^34%OZkfvYG< zntB925TxQm=`}(05PV$_Jp_M!w&i&(-uaO-v^}{m}3AFUMZ_FAVKW_W%F@ delta 3207 zcmcJSd2Ccg9LIn2+R{?CZ+F}6x!b0jQiasC<&Z*wbfqob-t?q}mU3vsVviuF6t*pq zBM|~j#R@8wLr@b@UrYoIhTs87g~UHZQL%WT6_duqtCZI7y!UpjSVCgrPTqU-ncrN$ zYbM*?tF*tR>`6~7AoFJ<%14#q86FuK5v@gdUN1Yzv=QcEteJZPqWy2JHDHp3_k{=Y zA*+L*x2AKOZGit_weWYWmN)Eij9&>44YJ!ji5|@!?q-3-nV(p-84;(#_;z<9%j0w0 zX*|VkWBIaH;IHxH?$`LCWE(5xZEhzYNwl#AvR1}DNhz#cym?lVMW3xwj(j?)RUcV{ z{wZvcY~MQ3!|EjkB&X}W8vL_rTa%Z>xjGtz(!p#|Sxx1&(w3!F4G)#A-0=jt=-`9= zR#t+t_z@oOaVh7T`D}cG*6>=7D|6=tF)D;zZpc~|)ING#46WE=$XNTDC8tY9%i`!% zr*_g~vnxS${A}4T{F~}Vp8U9r*ES#URZ$qm-J(#uRjR@RzbNDIwt|dy8){axoS`_p z?Vx{`IJ2)4GPu{A!v!+th)2z?&oK$_1pf>^e`SnssyQ?bvT%K<1@CmT=TuWV4IF`X zW7E??#)9{w=Fmq8m1dZus%Vxe&qPZk`Gi(c=rCJ$@as0u?3fLS=wVEo1B#ZE3yP66 z9~3Jo4un?3Wsfeoh(b^2Be_LaGwclzFDiLD{_|dvq z@bI0>a#{}0iXAHOS~=yJ%PR0yIe8_8gG9y}JtIIOmkn}&3MEB?L@pb$C@ObRvBYQy zOC-fmIp0vfY^;rIH|l>5RytPb;d*JKi_cn_2}Q(DObl;Ry?%Tcq);Uk@XG=~0g?hi zfs%qiL6XLSM5r6H1cQPlg@8gNji*W3h%P($nTD?>)1;OOyeJ!G`R}4C$X9E+fZ!1E zGaSM|;^Hyre~cWTxdcMzKSs_XI*E;*(G^u`v0e(0nf{m=D_V>;5i{D97KO1oKD{*q z??+oxRhOO?3?~n20osYy2~648q}%J^$EsNsFIo8JkrN_%B8nWtBTmn;TPBBvK;PM+Y+#l-s4v{HNpGun>`ft$fge@3GaU>Nd($?Ny7UV zBnj_lu5-G*)GON}(c>e~Wu)W)!gdl}rNdlZt-|M+-mbsskYu0 z7F^wSJgby0Vk&>OE6`{tNI>zC$fsXxc)0k4aUg)Tu^;uYPDSd@;#_gz5#oblF z;U#i|A+K_%&sDefYq=X}$oo4|)p-59WVp#t3(@ZBOks+3vu^FD zo@lg+`@^4hj0%LcQ%dPuv>7+BDlKhTyaLy=-`@FD$osarGjixVy}tw7Ly-NWILvKF zqBT+Pm8f3|MO4i1<8EIWeUDb5ns7=PU6*79{UFH(`caY{)GtZggFi_U_uvgl;vUQc z2~#WBdyc-AxQMdFG0KPQlUWHL-hLB@=HQNW9@816d3GWqw|D5?%6ihm?#-oNF~G0( z9TS|d-gODn%-fx+DrQnESQJUUWp@%&e&2=}2d8efSkV|ro8eN1GBAoo_b&Bsc>tz~ z3eyhlZDf%-^ryZFb+nav0#BQpOM{U3ZJ0|pC0TI*3`w$qZb`C(hGBt$`geJL*Gx8_ zcXp-orOTtW3tbsZOMG?@+qXX^Fzv{5A8W4tGZjA6ZQ-rmb-buMg!gvW@HzO-c_s$W yP!JU^OU>5i9>^HSa{1bxtxD1kZLlXQFjoANn2$Au54?B;i>Hv!J$7#IQpaCWG;Of} diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid.xlsx deleted file mode 100644 index 61dbc52dd9e664948d6ecb8a76fc167fc32c3a7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23202 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 diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls index 005e18f20234c565384c7bed8b3353594932e6c9..a8028e6440d88e26f92a5bb01aba5fd59c92f8e8 100644 GIT binary patch delta 5822 zcmds*dvMg%701v0W%Jzk=D{W*$r2s{0TQGp16HyY7s!(LgCGwRs)&dKDJTMp8&FZS zXyou}LZN~!)<2|mfl*3h9A`Qm%P8aE$RJZ`r?u0T=!~Q7jGdBx&+oO%B&q-K2jkxP z?eBihx%d9=J@?#m@9)=rUhBT1^;Cpf$^7|jvU?rS*c?zdyo&L26>L7fbU8z;D4p$@KoGSfSz}b0 zbU(jDFOz2t&Nj(Z(eiRv@scsabkp@ZS(be7{rA6J@^%S1s&sj_E%*BkxzUe+CBHy0 zdN{~i-66i!6-YPip3hEqxiHtdi?f4P;jhd&q5;0cQzZHlW4!+1C5++nAM|#DBg}K9 z3@SZOFXzVd@_D&uhO{};Fhjo8rqM-MWx#0DlH2B)t()gBoV*E{?ruaQy7GL(iH(6XO70oCrAlhsWN;8^=*pPP-@!>#0+8WyawVMTRQrh&eZ>@VSQ&?$Ev0W zo_!ia@7QT*KYb$j!!z|uT9dUwy7zg}W~h%ls#m6VU$1lT;V-HSw0Q^O&hWYt&u``u zxlp*RmgpC5ZhCfxR<)LAuK$wjUd)Jn;`fq94%&t?3aKwQ!5TD!fdr>e3Jtgu>_9#8 zCO8%IR+*$vqcjRT6Z&*YzfPY)88IsKBno6wCe9HEe-!(kRkUW=Y^zSe4G5B;iG*LsXb0Z#A{Ez!H*-2YwG^Jn%N;a`ajUZKl=3(o*P3b?2}KGSc0xcS}+Hm-p_`-~_|d zDyq|Ms;HSBFmo-)^~0))T9Hdm^3+LKcyO!#lRBvrjwA-r;3V^DfibQa&<|W_ASeK; zu_+rAwJ8U*$fjHnLWJ399;nWyF`#;zf}jRaKXu^=`RIz3*u6TMJwm_Z53a6rWQCnX z-=`NeErs7%Ta+)$3EqaFBDtTSsR@~XrL9^6|9fpsx&)&ZEUlTl*Ti3a=%P}ac>B5{ z<>VvlYOsVf^yiwPncX42 zw7HTeKU|}IvRP(2CR>&`z^2T^4j{ginUP=zwxndeY)OMj`gELP2a-4wD=N9X>^RAK z*>U=eEsgJcWITVwrJ1ehr0gb3xT|Xnk6Zcb?7QhKB>nmp;Gv~@s)fz0i5Y21bXokh zP3cN4<2N3y!v8-Woxv3wvkW6l+I)b2ySoTRh-uE)chA*pw-&{w>6Q#Duf7EfKZ3w1&=2?Q{WT?3*5{Ylk2?<=P(8hKeJn(ZAL6-SgxPyViQ;cxQzhMYZD7WsNie*06$3 z!lNbEf|I;u?L}0_1JC8MbDyg!LKF2ma$=QZLUPJ6t(^;L2v3vx5^?LPf#>WS7i*?T zsB8IuGu>j77boJ$Hu*qPZ1RJq+7tkl*^~{Ey~1cS2PEfT@fQvKZ`S1!<>%3K9L!HY zKTaV8Ui@(dc2l=<#q)O0Q<{JO%`)RHH|n^kzr@Qs@E&Kp{l$Q~rH1CgO4fXidg|bw zo)2K4&X?>};f^1AX*_In=w`9ejr&e;{dWO*8@9d+1k6tW)>#9l!^ze-f8<(1acsL_ z{2J%0+=yOAPJ2mfgQx8)pN-d8+e*h{|JtOEj(}_%%Q_i?Kzm2UY~M$@bsV8#ETAAXD{Dy7$8N*BU=mVT`7`^Ximn{EkCaX{v!AIr^lw;-~!0 o(I?b{@h!(rq)d?rBCmz=GAOTr@(sEX_av6ue{VjktpET3 delta 3994 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 From 701d6b5d1f760effb373ea583a3320b892965442 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 10 Nov 2021 16:27:38 +0800 Subject: [PATCH 182/253] =?UTF-8?q?=E6=A8=A1=E7=89=88=E5=86=8D=E6=AC=A1?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 10 ++++++---- .../excel/ic_resi_info_cid_for_easy_excel.xls | Bin 45056 -> 45056 bytes .../ic_resi_info_cid_for_easy_excel.xlsx | Bin 0 -> 25157 bytes 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 39b37f01b6..52f4ea9adf 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -56,6 +56,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.file.Files; @@ -316,10 +317,11 @@ public class IcResiUserController { Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); //========================================= - String fileName = "居民基本信息.xls"; - String templatePath = this.getClass().getResource("/excel/ic_resi_info_cid_for_easy_excel.xls").getPath(); - //InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(templatePath).build(); + String templatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); + + String fileName = "居民基本信息.xlsx"; + ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(inputStream).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); WriteSheet fistSheet = EasyExcel.writerSheet(NumConstant.ZERO).build(); System.out.println("===resiMainList==="+" "+JSON.toJSONString(resiMainList.values())); diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xls index a8028e6440d88e26f92a5bb01aba5fd59c92f8e8..fcf12bc80522a1bed1d23ca6499dd7555d54f02f 100644 GIT binary patch delta 401 zcmZp8z|`=7X~R9{$#JX#li65gCO=}4n5@JiHMs?d&jH!ypCC5a~^99E2GHf(_HL~jG~h-bL%q-O=jlNXOx(1%%fk= z&A`C$^}hfE!xe@^2L%HO28II)4;Vxk1YzP^7#JKB926K>biv|4l@Rq)($ey21aWRxxg`2;7=;uT_-0;}en%*`7wDGt-~1!_0c zOf&drPY+*w!_sXy=D{7xt_N|BMl z0ccnX5QBg$13v?^00S$K$;co8gsiNa3vyQ&v7B0ya$vK}0znpmmhb&<11>Q-fRw-J M3Gv@-yW}u800}o}J^%m! delta 377 zcmX|*y-Nc@5XEP+dq{F0<}N|+!a)wZEA&JQ8-*(*f|Zqp1Y(+W25TEHjsL({ix3M* zC9GVVfUQ+br-T>_8x<6_RL9E)%d&5NGyC2|gH$v~UG+J}!p0Mk#}97ff+*lE-5;u3 zynySZ>!dBk#a)^+NDqaJCB?=ws+Z{P^Q^2ZWd*ycg%6o;X5gI~urzWlU~{;t1;=>+ z`1;KP^q?Ag%QisA8$cfBC;S>9^g<8BV!|^Mep;)wi|rzawS?!U+%!i#op5Wydq6JX z)SnXnbMaC0nS-icai}%gRt+Z|1NZUr*R@zS6N+WHXY1_7~?#Si(!GpWp%(!gxw}h5sfn^RS~`G?PdJ!yoWBdf(+qGO7|o+&upq?v`oP6>lt1^#Dj@fao^b!7DS>%v zvP7MuQdA2T!qe0&E<|aZ0&U5?ZnF#L`q78eAG3d8P z3qeh`F}IckxB7_YWL-Qf-8@#~V=>TEP{nut&-iK4S@TUW`vhF^N33cN24*Qb(~^907F z_vWc zj3vmGRYAn|P3b%6TlZugi1I8+Zjm&$SM0WoKyy`pWj5%iTbxn>vnwQep<^ENO} z!h#Ux8Xd<`hflXR5Xj?kO0;oL&2m!T(6CS>1T_P{25;L{LS&^2;Es%ZXO6ZJaN`+2 zrLQYY#lSq4Mr8)2MI2Fm(?I`)@-0sRhMd(tOo&gRb;6~+t72Qs1!UXc4jO?!Q%O00yf zfg3^D5k#eM12rYdrOP#K!Rl<)-DkybJG|Qaxc2IN(EI6|6zGPQaMU0rxM{ozJ$Kls z{({DP(P$6NYiu<)AE-tQL1Ea%-P$gRPr(;4eBa}akSha&Fdst`B;$nilf5G{Nt&B) zc)7)KnPknyhos5Yj4DwSdFXdA%j~&%j1VVP==&|xMugPLBlWRHi$f$Ni z>!Bq9d!0)^ZgT1E#`r=0{H*^s=>Z81#NGNY-TmJI2>%Ljvvag^vM@Du{ LK7j!X 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 literal 0 HcmV?d00001 From 88e40e7069bab21b7c44a516447a509d408705cf Mon Sep 17 00:00:00 2001 From: lzh Date: Wed, 10 Nov 2021 22:06:03 +0800 Subject: [PATCH 183/253] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E9=A2=84=E8=AD=A6=E7=B1=BB=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/form/StatsResiWarnCountFormDTO.java | 46 ++++++++++++++ .../controller/StatsResiWarnController.java | 9 ++- .../com/epmet/dao/IcStatsResiWarnDao.java | 2 + .../epmet/service/StatsResiWarnService.java | 2 + .../impl/StatsResiWarnServiceImpl.java | 60 +++++++++++++++++++ .../resources/mapper/IcStatsResiWarnDao.xml | 22 +++++++ 6 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnCountFormDTO.java diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnCountFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnCountFormDTO.java new file mode 100644 index 0000000000..7fba162e27 --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnCountFormDTO.java @@ -0,0 +1,46 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + + +/** + * 预警统计表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class StatsResiWarnCountFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 组织id + */ + @NotBlank(message = "用户id不能为空") + private String userId; + + +} \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java index 6a872d078d..510c434264 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java @@ -23,6 +23,7 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.form.StatsResiListFormDTO; +import com.epmet.dto.form.StatsResiWarnCountFormDTO; import com.epmet.dto.form.StatsResiWarnFormDTO; import com.epmet.dto.result.IcStatsResiResultDTO; import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; @@ -83,7 +84,7 @@ public class StatsResiWarnController { } /** - * 统计 + * 统计所有 * @return */ @PostMapping("resiwarn") @@ -91,5 +92,11 @@ public class StatsResiWarnController { statsResiWarnService.resiWarn(tokenDto.getCustomerId()); return new Result(); } + @PostMapping("resiWarnByOne") + public Result resiWarnByOne(@LoginUser TokenDto tokenDto,@RequestBody StatsResiWarnCountFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO); + statsResiWarnService.resiWarnByOne(tokenDto.getCustomerId(),formDTO.getUserId()); + return new Result(); + } } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java index 0cd26050a0..5eea1c2c44 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java @@ -46,4 +46,6 @@ public interface IcStatsResiWarnDao extends BaseDao { @Param("level")String level); List resiWarn(@Param("tableName") String tableName,@Param("columnName") String columnName); + IcStatsResiWarnEntity resiWarnById(@Param("tableName") String tableName,@Param("columnName") String columnName,@Param("icStatsResiWarn") IcStatsResiWarnEntity icStatsResiWarn); + } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java index 5192e27981..4ef4b6722a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java @@ -38,4 +38,6 @@ public interface StatsResiWarnService{ List list(String id, String level); void resiWarn(String customerId); + + void resiWarnByOne(String customerId,String userId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java index 33d30a3212..8a8af94e2b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.dao.IcResiUserDao; import com.epmet.dao.IcStatsResiWarnDao; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.IcResiCategoryWarnConfigDTO; @@ -12,6 +13,7 @@ import com.epmet.dto.result.BuildingResultDTO; import com.epmet.dto.result.IcStatsResiResultDTO; import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; import com.epmet.dto.result.IcStatsResiWarnUserResultDTO; +import com.epmet.entity.IcResiUserEntity; import com.epmet.entity.IcStatsResiWarnEntity; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; @@ -46,6 +48,9 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; + @Resource + private IcResiUserDao icResiUserDao; + @Override public List buildingwWarnList(String agencyID) { List result = new ArrayList<>(); @@ -207,4 +212,59 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { icStatsResiWarnService.insertBatch(icStatsResiWarnEntities,500); } + + @Override + public void resiWarnByOne(String customerId, String userId) { + // 获取预警配置项 + Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + if (!warnResult.success() || null == warnResult.getData()) { + throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); + } + List icResiCategoryWarnConfigDTOList = warnResult.getData(); + + IcResiUserEntity icResiUserEntity = icResiUserDao.selectById(userId); + if(null == icResiUserEntity){ + return ; + } + + //保存数据 + for (IcResiCategoryWarnConfigDTO item : icResiCategoryWarnConfigDTOList) { + //查询这个用户信息 + + IcStatsResiWarnEntity icStatsResiWarn = icStatsResiWarnDao.selectOne(new QueryWrapper().lambda() + .eq(IcStatsResiWarnEntity::getConfigId,item.getId()) + .eq(IcStatsResiWarnEntity::getAgencyId, icResiUserEntity.getAgencyId()) + .eq(IcStatsResiWarnEntity::getGridId, icResiUserEntity.getGridId()) + .eq(IcStatsResiWarnEntity::getNeighborHoodId, icResiUserEntity.getVillageId()) + .eq(IcStatsResiWarnEntity::getBuildingId, icResiUserEntity.getBuildId())); + + if(null == icStatsResiWarn){ + //如果不存在,新增统计数量 + icStatsResiWarn = new IcStatsResiWarnEntity(); + icStatsResiWarn.setAgencyId(icResiUserEntity.getAgencyId()); + icStatsResiWarn.setAgencyPids(icResiUserEntity.getPids()); + icStatsResiWarn.setGridId(icResiUserEntity.getGridId()); + icStatsResiWarn.setNeighborHoodId(icResiUserEntity.getVillageId()); + icStatsResiWarn.setBuildingId(icResiUserEntity.getBuildId()); + icStatsResiWarn.setConfigId(item.getId()); + icStatsResiWarn.setCustomerId(customerId); + IcStatsResiWarnEntity resiWarnEntity = icStatsResiWarnDao.resiWarnById(item.getTableName(), item.getColumnName(),icStatsResiWarn); + if(null == resiWarnEntity){ + continue; + } + icStatsResiWarn.setCount(resiWarnEntity.getCount()); + icStatsResiWarnDao.insert(icStatsResiWarn); + }else{ + //如果存在,更新统计数量 + IcStatsResiWarnEntity resiWarnEntity = icStatsResiWarnDao.resiWarnById(item.getTableName(), item.getColumnName(),icStatsResiWarn); + icStatsResiWarn.setCount(resiWarnEntity.getCount()); + icStatsResiWarn.setCustomerId(customerId); + icStatsResiWarnDao.updateById(icStatsResiWarn); + } + + + } + } + + } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml index 4416ac2f2e..79a5f7499b 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml @@ -103,4 +103,26 @@ and DEL_FLAG = '0' group by AGENCY_ID,GRID_ID,VILLAGE_ID,BUILD_ID + \ No newline at end of file From 71ad799c19276f900d1638dd3db5874eee93ba6b Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 11 Nov 2021 09:15:13 +0800 Subject: [PATCH 184/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E3=80=81=E6=A5=BC?= =?UTF-8?q?=E5=AE=87=E3=80=81=E6=88=BF=E5=B1=8B=E5=AF=BC=E5=85=A5=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/controller/BuildingController.java | 22 +++++++++++++------ .../com/epmet/controller/HouseController.java | 16 ++++++++++++-- .../controller/NeighborHoodController.java | 22 +++++++++++++------ .../com/epmet/service/BuildingService.java | 3 +-- .../java/com/epmet/service/HouseService.java | 3 +-- .../epmet/service/NeighborHoodService.java | 2 +- .../service/impl/BuildingServiceImpl.java | 17 +++++++------- .../epmet/service/impl/HouseServiceImpl.java | 19 ++++++++-------- .../service/impl/NeighborHoodServiceImpl.java | 7 ++++-- 9 files changed, 71 insertions(+), 40 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 5b408d1367..f1aac1a9c0 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -23,6 +23,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -47,10 +48,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** @@ -180,15 +179,24 @@ public class BuildingController { List failList = importResult.getFailList(); + //存放错误数据行号 + List numList = new ArrayList<>(); if(!CollectionUtils.isEmpty(failList)){ for ( IcBuildingExcel entity : failList) { log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 + numList.add(entity.getRowNum()); } - return new Result().error(8001,failList.get(0).getErrorMsg()); + //return new Result().error(8001,failList.get(0).getErrorMsg()); } List result =importResult.getList(); - - return new Result().ok(buildingService.importExcel(customerId,result,tokenDTO.getUserId())); + List resultList = buildingService.importExcel(customerId,result,tokenDTO.getUserId(),numList); + String str = String.format("共%s条,成功导入%s条。",numList.size()+result.size(),numList.size()+result.size()-resultList.size()); + if(resultList.size()> NumConstant.ZERO){ + Collections.sort(resultList); + String subList = resultList.stream().map(String::valueOf).collect(Collectors.joining("、")); + return new Result().error(9999, str+"第"+subList+"行未成功!"); + } + return new Result().ok(str); } /** diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index 1807565cee..a2bb68f09f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -21,6 +21,7 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -42,6 +43,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; +import java.util.stream.Collectors; /** @@ -145,15 +147,25 @@ public class HouseController { List failList = importResult.getFailList(); + //存放错误数据行号 + List numList = new ArrayList<>(); if(!CollectionUtils.isEmpty(failList)){ for ( IcHouseExcel entity : failList) { log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 + numList.add(entity.getRowNum()); } - return new Result().error(8001,failList.get(0).getErrorMsg()); + //return new Result().error(8001,failList.get(0).getErrorMsg()); } List result =importResult.getList(); - return new Result().ok(houseService.importExcel(customerId,result,tokenDTO.getUserId())); + List resultList = houseService.importExcel(customerId,result,tokenDTO.getUserId(),numList); + String str = String.format("共%s条,成功导入%s条。",numList.size()+result.size(),numList.size()+result.size()-resultList.size()); + if(resultList.size()> NumConstant.ZERO){ + Collections.sort(resultList); + String subList = resultList.stream().map(String::valueOf).collect(Collectors.joining("、")); + return new Result().error(9999, str+"第"+subList+"行未成功!"); + } + return new Result().ok(str); } @PostMapping( "queryListHouseInfo") diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index 11e1f65d6b..cb22dd00f2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -22,6 +22,7 @@ import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -45,10 +46,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** @@ -207,16 +206,25 @@ public class NeighborHoodController { // List result = ExcelPoiUtils.importExcel(file, 0, 1, IcNeighborHoodExcel.class); List failList = importResult.getFailList(); + //存放错误数据行号 + List numList = new ArrayList<>(); if(!CollectionUtils.isEmpty(failList)){ for ( IcNeighborHoodExcel entity : failList) { log.error("第{}行,{}",entity.getRowNum(),entity.getErrorMsg());//打印失败的行 和失败的信息 + numList.add(entity.getRowNum()); } - return new Result().error(8001,failList.get(0).getErrorMsg()); + //return new Result().error(8001,failList.get(0).getErrorMsg()); } List result =importResult.getList(); // log.info(JSON.toJSONString(result)); - neighborHoodService.importExcel(customerId,result,tokenDTO.getUserId()); - return new Result(); + List resultList = neighborHoodService.importExcel(customerId,result,tokenDTO.getUserId(),numList); + String str = String.format("共%s条,成功导入%s条。",numList.size()+result.size(),numList.size()+result.size()-resultList.size()); + if(resultList.size()> NumConstant.ZERO){ + Collections.sort(resultList); + String subList = resultList.stream().map(String::valueOf).collect(Collectors.joining("、")); + return new Result().error(9999, str+"第"+subList+"行未成功!"); + } + return new Result().ok(str); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java index 1a8c8c04e9..405887d709 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java @@ -17,7 +17,6 @@ package com.epmet.service; -import com.epmet.commons.tools.utils.Result; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; @@ -53,7 +52,7 @@ public interface BuildingService { List treeList(String customerId); - Result importExcel(String customerId, List list, String staffId); + List importExcel(String customerId, List list, String staffId, List numList); IcNeighborHoodResultDTO listBuilding(ListIcNeighborHoodFormDTO formDTO); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java index 0fd98dc3df..48ab8c7d1b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/HouseService.java @@ -17,7 +17,6 @@ package com.epmet.service; -import com.epmet.commons.tools.utils.Result; import com.epmet.dto.form.IcHouseFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.HouseInfoDTO; @@ -48,7 +47,7 @@ public interface HouseService { void delHouse(String houseId); - Result importExcel(String customerId, List list, String staffId); + List importExcel(String customerId, List list, String staffId, List numList); IcNeighborHoodResultDTO listNeighborhood(ListIcNeighborHoodFormDTO formDTO); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java index 266c3b912d..ff1a35f45a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/NeighborHoodService.java @@ -52,5 +52,5 @@ public interface NeighborHoodService{ */ void exportNeighborhoodinfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception ; - void importExcel(String customerId,List list,String staffId); + List importExcel(String customerId, List list, String staffId, List numList); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 40659b958f..6925d238aa 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -9,7 +9,6 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.Result; import com.epmet.dao.*; import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.CustomerStaffAgencyDTO; @@ -210,7 +209,7 @@ public class BuildingServiceImpl implements BuildingService { @Override @Transactional(rollbackFor = Exception.class) - public Result importExcel(String customerId, List list, String staffId) { + public List importExcel(String customerId, List list, String staffId, List numList) { //2021.11.9 需求变更 当前工作人员只能导致自己所属组织下数据,网格名对应不上的数据舍弃【注:需求就这样】 sun CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); //组织名称不一样的数据舍弃 @@ -218,15 +217,16 @@ public class BuildingServiceImpl implements BuildingService { while (iterator.hasNext()) { IcBuildingExcel obj = iterator.next(); if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { + numList.add(obj.getRowNum()); iterator.remove(); } } //用于存储匹配不上的数据给前端的提示 如南宁社区不存在 - StringBuffer str = new StringBuffer(""); + //StringBuffer str = new StringBuffer(""); //end sun //导入 if(CollectionUtils.isEmpty(list)){ - return new Result(); + return numList; } //查询所有组织和网格根据名字 @@ -252,7 +252,8 @@ public class BuildingServiceImpl implements BuildingService { entity.setCustomerId(customerId); entity.setNeighborHoodId(Optional.ofNullable(neighborHoodMap.get(icBuildingExcel.getNeighborHoodName())).map(u->u.getId()).orElse(""));//neighborHoodMap.get(icBuildingExcel.getNeighborHoodName()).getId() if ("".equals(entity.getNeighborHoodId())) { - str.append("".equals(str) ? icBuildingExcel.getNeighborHoodName() : str.append("、").append(icBuildingExcel.getNeighborHoodName())); + //str.append("".equals(str) ? icBuildingExcel.getNeighborHoodName() : str.append("、").append(icBuildingExcel.getNeighborHoodName())); + numList.add(icBuildingExcel.getRowNum()); continue; } entity.setBuildingName(icBuildingExcel.getBuildingName()); @@ -286,10 +287,10 @@ public class BuildingServiceImpl implements BuildingService { icBuildingService.insertBatch(buildingEntityList); icBuildingUnitService.insertBatch(icBuildingUnitEntityList); - if(!"".equals(str)){ + /* if(!"".equals(str)){ return new Result().error(9999, str.append("不存在").toString()); - } - return new Result(); + }*/ + return numList; } @Override diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index 2a0ce1465d..ff5dd90ef8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -8,7 +8,6 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.Result; import com.epmet.dao.IcBuildingDao; import com.epmet.dao.IcBuildingUnitDao; import com.epmet.dao.IcHouseDao; @@ -24,7 +23,6 @@ import com.epmet.entity.IcHouseEntity; import com.epmet.enums.HousePurposeEnums; import com.epmet.enums.HouseRentFlagEnums; import com.epmet.enums.HouseTypeEnums; -import com.epmet.excel.IcBuildingExcel; import com.epmet.excel.IcHouseExcel; import com.epmet.service.HouseService; import com.epmet.service.IcBuildingService; @@ -123,7 +121,8 @@ public class HouseServiceImpl implements HouseService { } @Override - public Result importExcel(String customerId, List list, String staffId) { + @Transactional(rollbackFor = Exception.class) + public List importExcel(String customerId, List list, String staffId, List numList) { //2021.11.10 需求变更 当前工作人员只能导致自己所属组织下数据,对应不上的数据舍弃【注:需求就这样】 sun CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); //组织名称不一样的数据舍弃 @@ -131,15 +130,16 @@ public class HouseServiceImpl implements HouseService { while (iterator.hasNext()) { IcHouseExcel obj = iterator.next(); if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { + numList.add(obj.getRowNum()); iterator.remove(); } } //用于存储匹配不上的数据给前端的提示 如南宁社区不存在 - StringBuffer str = new StringBuffer(""); + //StringBuffer str = new StringBuffer(""); //end sun //导入 if(CollectionUtils.isEmpty(list)){ - return new Result(); + return numList; } //获取所有小区 list // List neighborNameList = list.stream().map(item -> item.getNeighborHoodName()).collect(Collectors.toList()); @@ -173,7 +173,8 @@ public class HouseServiceImpl implements HouseService { entity.setBuildingUnitId(String.valueOf(Optional.ofNullable(item).map(u->u.get("buildingUnitId")).orElse(""))); entity.setHouseName(icHouseExcel.getBuildingName()+"-"+icHouseExcel.getBuildingUnit()+"-"+icHouseExcel.getDoorName()); if ("".equals(entity.getNeighborHoodId()) || "".equals(entity.getBuildingId()) || "".equals(entity.getBuildingUnitId())) { - str.append("".equals(str) ? icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit() : str.append("、").append(icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit())); + //str.append("".equals(str) ? icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit() : str.append("、").append(icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit())); + numList.add(icHouseExcel.getRowNum()); continue; } entity.setDoorName(icHouseExcel.getDoorName()); @@ -193,10 +194,10 @@ public class HouseServiceImpl implements HouseService { //3.保存 icHouseService.insertBatch(houseEntityList); - if(!"".equals(str)){ + /*if(!"".equals(str)){ return new Result().error(9999, str.append("不存在").toString()); - } - return new Result(); + }*/ + return numList; } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index 4e36375890..2e72f0341c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -240,7 +240,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { @Override @Transactional(rollbackFor = Exception.class) - public void importExcel(String customerId,List list,String staffId) { + public List importExcel(String customerId,List list,String staffId, List numList) { //2021.11.9 需求变更 当前工作人员只能导致自己所属组织下数据,网格名对应不上的数据舍弃【注:需求就这样】 sun CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); //组织名称不一样的数据舍弃 @@ -248,6 +248,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { while (iterator.hasNext()) { IcNeighborHoodExcel obj = iterator.next(); if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { + numList.add(obj.getRowNum()); iterator.remove(); } } @@ -255,7 +256,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { //导入 if(CollectionUtils.isEmpty(list)){ - return ; + return numList; } //获取所有组织 list List agencyNameList = list.stream().map(item -> item.getAgencyName()).collect(Collectors.toList()); @@ -294,6 +295,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { entity.setGridId(Optional.ofNullable(gridMap.get(icNeighborHoodExcel.getGridName().trim())).map(u->u.getId()).orElse(""));//gridMap.get(icNeighborHoodExcel.getGridName()).getId() //网格名对应不上的数据舍弃 if ("".equals(entity.getGridId())) { + numList.add(icNeighborHoodExcel.getRowNum()); continue; } entity.setAddress(icNeighborHoodExcel.getAddress()); @@ -312,6 +314,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { icNeighborHoodService.insertBatch(neighborHoodEntityList); icNeighborHoodPropertyService.insertBatch(icNeighborHoodPropertyEntityList); + return numList; } From 11aa1405fc7cdcdb69064b82054af5d06ac81b87 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 11 Nov 2021 10:36:11 +0800 Subject: [PATCH 185/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=A8=E6=80=81sql=EF=BC=8C=E6=94=B9=E4=B8=BA=E4=B8=8E?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=88=97=E8=A1=A8=E4=B8=80=E4=B8=AAwhere?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 34 ++++++++++++++----- .../java/com/epmet/dao/IcResiUserDao.java | 4 ++- .../com/epmet/service/IcResiUserService.java | 7 ++-- .../service/impl/IcResiUserServiceImpl.java | 15 +++++--- ...tatsStaffPatrolRecordDailyServiceImpl.java | 3 ++ .../main/resources/mapper/IcResiUserDao.xml | 2 +- 6 files changed, 49 insertions(+), 16 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 52f4ea9adf..c92be44a44 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -29,10 +29,13 @@ import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; @@ -178,7 +181,14 @@ public class IcResiUserController { * @throws Exception */ @RequestMapping(value = "/exportExcel2") - public void exportExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + public void exportExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); + String staffOrgPath = StrConstant.EPMETY_STR; + if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { + staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); + }else{ + staffOrgPath=staffInfoCacheResult.getAgencyId(); + } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); @@ -229,7 +239,7 @@ public class IcResiUserController { } } - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; @@ -246,7 +256,7 @@ public class IcResiUserController { if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); @@ -263,7 +273,14 @@ public class IcResiUserController { } @RequestMapping(value = "/exportExcel") - public void exportExcelByEasyExcel(@RequestHeader String customerId, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); + String staffOrgPath = StrConstant.EPMETY_STR; + if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { + staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); + }else{ + staffOrgPath=staffInfoCacheResult.getAgencyId(); + } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); @@ -314,7 +331,7 @@ public class IcResiUserController { } } - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions()); + Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //========================================= String templatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; @@ -334,7 +351,7 @@ public class IcResiUserController { if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions()); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); int sheetNo = n.incrementAndGet(); @@ -397,13 +414,14 @@ public class IcResiUserController { } @PostMapping("test") - public Result>> test(@RequestBody DynamicQueryFormDTO formDTO) { + public Result>> test(@LoginUser TokenDto tokenDto,@RequestBody DynamicQueryFormDTO formDTO) { formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); //formDTO.setCustomerId(tokenDto.getCustomerId()); return new Result>>().ok(icResiUserService.dynamicQuery(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getResultTableName(), - formDTO.getConditions())); + formDTO.getConditions(), + tokenDto.getUserId(),null)); } /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index db7344b6ea..fbd753f8fb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -100,7 +100,9 @@ public interface IcResiUserDao extends BaseDao { List> dynamicQuery(@Param("customerId")String customerId, @Param("resultTableName")String resultTableName, @Param("conditions") List conditions, - @Param("subTables") List subTables); + @Param("subTables") List subTables, + @Param("currentStaffAgencyId")String currentStaffAgencyId, + @Param("staffOrgPath")String staffOrgPath); /** * @Description 查询个人信息 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 0f82258bf0..61f0a2c35b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -80,7 +80,9 @@ public interface IcResiUserService extends BaseService { List> dynamicQuery(String customerId, String formCode, String resultTableName, - List conditions); + List conditions, + String currentStaffAgencyId, + String staffOrgPath); /** * @Description 查询个人数据 @@ -111,7 +113,8 @@ public interface IcResiUserService extends BaseService { * @param conditions * @return */ - Map> getDataForExport(Map itemList, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions); + Map> getDataForExport(Map itemList, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions,String currentStaffAgencyId, + String staffOrgPath); /** * @Description 家庭关系 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 27289c392a..8ebec910a8 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -290,6 +290,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> dynamicQuery(String customerId, String formCode, String resultTableName, - List conditions){ + List conditions, + String currentStaffAgencyId, + String staffOrgPath){ CustomerFormQueryDTO queryDTO=new CustomerFormQueryDTO(); queryDTO.setCustomerId(customerId); queryDTO.setFormCode(formCode); + //所有的子表 Result> subTablesRes=operCustomizeOpenFeignClient.querySubTables(queryDTO); List subTables=new ArrayList<>(); if(subTablesRes.success()&&CollectionUtils.isNotEmpty(subTablesRes.getData())){ subTables =subTablesRes.getData(); } - return baseDao.dynamicQuery(customerId,resultTableName,conditions,subTables); + return baseDao.dynamicQuery(customerId,resultTableName,conditions,subTables,currentStaffAgencyId,staffOrgPath); } /** @@ -616,8 +621,10 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions) { - List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions); + public Map> getDataForExport(Map formItemMap, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions, + String currentStaffAgencyId, + String staffOrgPath) { + List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions,currentStaffAgencyId,staffOrgPath); Map> result = new LinkedHashMap<>(); mapList.stream().filter(Objects::nonNull).forEach(map -> { map.forEach((k,o) -> { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsStaffPatrolRecordDailyServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsStaffPatrolRecordDailyServiceImpl.java index 4d2913cd43..03467b2c30 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsStaffPatrolRecordDailyServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsStaffPatrolRecordDailyServiceImpl.java @@ -47,6 +47,9 @@ public class StatsStaffPatrolRecordDailyServiceImpl extends BaseServiceImpl - + group by IC_RESI_USER.id order by ic_resi_user.CREATED_TIME desc From e4f340d1d4250d5975761fb983d435f6fad0d334 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 11 Nov 2021 10:46:25 +0800 Subject: [PATCH 186/253] =?UTF-8?q?=E5=B0=8F=E5=8C=BA=E3=80=81=E6=A5=BC?= =?UTF-8?q?=E5=AE=87=E3=80=81=E6=88=BF=E5=B1=8B=E5=AF=BC=E5=85=A5=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E5=86=8D=E6=AC=A1=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dao/CustomerGridDao.java | 6 ++++++ .../main/java/com/epmet/dao/IcBuildingDao.java | 3 ++- .../java/com/epmet/dao/IcNeighborHoodDao.java | 3 ++- .../epmet/service/impl/BuildingServiceImpl.java | 2 +- .../com/epmet/service/impl/HouseServiceImpl.java | 2 +- .../service/impl/NeighborHoodServiceImpl.java | 16 ++++++++++++++-- .../main/resources/mapper/CustomerGridDao.xml | 8 ++++++++ .../src/main/resources/mapper/IcBuildingDao.xml | 4 +++- .../main/resources/mapper/IcNeighborHoodDao.xml | 4 +++- 9 files changed, 40 insertions(+), 8 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java index 34534391c3..bec972b9d7 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java @@ -336,4 +336,10 @@ public interface CustomerGridDao extends BaseDao { * @Date 2021/10/25 16:04 */ List selectUnitList(@Param("buildingId") String buildingId); + + /** + * @Author sun + * @Description 查询组织下直属网格列表 + **/ + List selectByPid(@Param("pid") String pid); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java index e0fce5c740..b0cb1d46b6 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -56,7 +56,8 @@ public interface IcBuildingDao extends BaseDao { List selectAgencyChildrenList(@Param("agencyId") String agencyId); - List> selectListByName(@Param("neighborNameList")ArrayList strings, + List> selectListByName(@Param("customerId") String customerId, + @Param("neighborNameList")ArrayList strings, @Param("buildingNameList") ArrayList strings1, @Param("buildingUnitList") ArrayList integers); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java index 19e30210ae..6e5d0487eb 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcNeighborHoodDao.java @@ -43,7 +43,8 @@ public interface IcNeighborHoodDao extends BaseDao { // List searchAllNeighborhood(@Param(Constants.WRAPPER) QueryWrapper neighborHoodEntityQueryWrapper); List searchAllNeighborhood(@Param("neighbor") IcNeighborHoodEntity neighbor, @Param("house")IcHouseEntity house); - List selectListByName(@Param("neighborNameList")List neighborNameList, + List selectListByName(@Param("customerId") String customerId, + @Param("neighborNameList")List neighborNameList, @Param("agencyNameList") List agencyNameList, @Param("gridNameList") List gridNameList); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index 6925d238aa..d00fade930 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -236,7 +236,7 @@ public class BuildingServiceImpl implements BuildingService { Set neighborNameList = list.stream().map(item -> item.getNeighborHoodName()).collect(Collectors.toSet()); Set agencyNameList = list.stream().map(item -> item.getAgencyName()).collect(Collectors.toSet()); Set gridNameList = list.stream().map(item -> item.getGridName()).collect(Collectors.toSet()); - List neighborHoodList = icNeighborHoodDao.selectListByName(new ArrayList(neighborNameList),new ArrayList(agencyNameList),new ArrayList(gridNameList)); + List neighborHoodList = icNeighborHoodDao.selectListByName(customerId, new ArrayList(neighborNameList),new ArrayList(agencyNameList),new ArrayList(gridNameList)); // List neighborHoodList = icNeighborHoodDao.selectList(new QueryWrapper().lambda().in(IcNeighborHoodEntity::getNeighborHoodName, neighborNameList)); Map neighborHoodMap = neighborHoodList.stream().collect(Collectors.toMap(IcNeighborHoodEntity::getNeighborHoodName, Function.identity(),(key1, key2)->key1)); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index ff5dd90ef8..d6bbe4dc86 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -153,7 +153,7 @@ public class HouseServiceImpl implements HouseService { Set neighborNameList = list.stream().map(item -> item.getNeighborHoodName()).collect(Collectors.toSet()); Set buildingNameList = list.stream().map(item -> item.getBuildingName()).collect(Collectors.toSet()); Set buildingUnitList = list.stream().map(item -> item.getBuildingUnit()).collect(Collectors.toSet()); - List> buildMapList = icBuildingDao.selectListByName(new ArrayList(neighborNameList),new ArrayList(buildingNameList),new ArrayList(buildingUnitList)); + List> buildMapList = icBuildingDao.selectListByName(customerId, new ArrayList(neighborNameList),new ArrayList(buildingNameList),new ArrayList(buildingUnitList)); //转Map Map> buildMap = new HashMap<>(); buildMapList.forEach(item->{ diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index 2e72f0341c..8067c15d0d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -243,6 +243,8 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { public List importExcel(String customerId,List list,String staffId, List numList) { //2021.11.9 需求变更 当前工作人员只能导致自己所属组织下数据,网格名对应不上的数据舍弃【注:需求就这样】 sun CustomerStaffInfoCacheResult staffInfoCache = CustomerStaffRedis.getStaffInfo(customerId, staffId); + //查询当前组织下网格列表 + List customerGridList = customerGridDao.selectByPid(staffInfoCache.getAgencyId()); //组织名称不一样的数据舍弃 Iterator iterator = list.iterator(); while (iterator.hasNext()) { @@ -251,6 +253,14 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { numList.add(obj.getRowNum()); iterator.remove(); } + //当前组织下网格名不存在的也不允许导入 + customerGridList.forEach(g->{ + if(!obj.getGridName().trim().equals(g.getGridName())){ + numList.add(obj.getRowNum()); + iterator.remove(); + } + }); + } //end sun @@ -260,13 +270,15 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { } //获取所有组织 list List agencyNameList = list.stream().map(item -> item.getAgencyName()).collect(Collectors.toList()); + agencyNameList = agencyNameList.stream().distinct().collect(Collectors.toList()); //获取所有网格 list - List gridNameList = list.stream().map(item->item.getGridName()).collect(Collectors.toList()); + //List gridNameList = list.stream().map(item->item.getGridName()).collect(Collectors.toList()); //获取所有物业 list List propertyNameList = list.stream().map(item->item.getPropertyName()).collect(Collectors.toList()); + propertyNameList = propertyNameList.stream().distinct().collect(Collectors.toList()); //查询对应的id List customerAgencyList = customerAgencyDao.selectList(new QueryWrapper().lambda().in(CustomerAgencyEntity::getOrganizationName, agencyNameList)); - List customerGridList = customerGridDao.selectList(new QueryWrapper().lambda().in(CustomerGridEntity::getGridName, gridNameList)); + //List customerGridList = customerGridDao.selectList(new QueryWrapper().lambda().in(CustomerGridEntity::getGridName, gridNameList)); List icPropertyManagementList = icPropertyManagementDao.selectList(new QueryWrapper().lambda().in(IcPropertyManagementEntity::getName, propertyNameList)); Map agencyMap = customerAgencyList.stream().collect(Collectors.toMap(CustomerAgencyEntity::getOrganizationName, Function.identity(),(key1, key2)->key1)); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml index a3aba7122e..e68adad92d 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml @@ -680,5 +680,13 @@ DEL_FLAG = '0' AND BUILDING_ID = #{buildingId} + diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index 3c4022ea6f..2091daeba8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -283,7 +283,9 @@ #{val} - WHERE a.DEL_FLAG = '0' and a.NEIGHBOR_HOOD_NAME in + WHERE a.DEL_FLAG = '0' + AND a.CUSTOMER_ID = #{customerId} + and a.NEIGHBOR_HOOD_NAME in #{val} diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml index dba659f38c..ea950eb90b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcNeighborHoodDao.xml @@ -193,7 +193,9 @@ #{val} - where a.DEL_FLAG= '0'and a.NEIGHBOR_HOOD_NAME in + where a.DEL_FLAG= '0' + AND a.CUSTOMER_ID = #{customerId} + and a.NEIGHBOR_HOOD_NAME in #{val} From ce4f370123c344e91ea162da8380490dde670097 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 11 Nov 2021 11:01:59 +0800 Subject: [PATCH 187/253] ........ --- .../src/main/resources/mapper/CustomerGridDao.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml index e68adad92d..8b90fc9e74 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml @@ -686,7 +686,7 @@ FROM customer_grid WHERE del_flag = '0' - AND pid = {pid} + AND pid = #{pid} From 9718f87cfb97152019235fe289df9010185b6630 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 11 Nov 2021 11:48:42 +0800 Subject: [PATCH 188/253] =?UTF-8?q?=E6=9C=8D=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/service/impl/NeighborHoodServiceImpl.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index 8067c15d0d..d7558cd110 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -36,6 +36,7 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; import java.util.stream.Collectors; @@ -254,12 +255,16 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { iterator.remove(); } //当前组织下网格名不存在的也不允许导入 + AtomicBoolean br = new AtomicBoolean(true); customerGridList.forEach(g->{ - if(!obj.getGridName().trim().equals(g.getGridName())){ - numList.add(obj.getRowNum()); - iterator.remove(); + if(obj.getGridName().trim().equals(g.getGridName())){ + br.set(false); } }); + if(br.get()){ + numList.add(obj.getRowNum()); + iterator.remove(); + } } //end sun From c0828a645c0c52fa620d64d821436c5a60c4de52 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 11 Nov 2021 13:11:03 +0800 Subject: [PATCH 189/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/result/CustomerFormResultDTO.java | 2 +- .../com/epmet/dto/result/FormGroupDTO.java | 2 +- .../{FormItem.java => FormItemResult.java} | 2 +- .../{FormItem2.java => FormItemResult2.java} | 2 +- .../feign/OperCustomizeOpenFeignClient.java | 2 +- .../OperCustomizeOpenFeignClientFallback.java | 2 +- .../epmet/controller/IcFormController.java | 6 +- .../main/java/com/epmet/dao/IcFormDao.java | 8 +- .../java/com/epmet/service/IcFormService.java | 6 +- .../epmet/service/impl/IcFormServiceImpl.java | 27 ++- .../src/main/resources/mapper/IcFormDao.xml | 8 +- .../controller/IcResiUserController.java | 177 ++++++++---------- .../com/epmet/service/IcResiUserService.java | 2 +- .../impl/IcResiUserImportServiceImpl.java | 23 ++- .../service/impl/IcResiUserServiceImpl.java | 6 +- .../test/IcResiUserControllerTest.java | 6 +- 16 files changed, 127 insertions(+), 154 deletions(-) rename epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/{FormItem.java => FormItemResult.java} (97%) rename epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/{FormItem2.java => FormItemResult2.java} (97%) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java index e5afdeddc2..45cd1dd0ea 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/CustomerFormResultDTO.java @@ -27,7 +27,7 @@ public class CustomerFormResultDTO implements Serializable { /** * 表单项 */ - private List itemList; + private List itemList; /** * 表单分组 diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java index dbb3f60e70..1b2a6c8964 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormGroupDTO.java @@ -42,6 +42,6 @@ public class FormGroupDTO implements Serializable { /** * 分组里面的组件 */ - private List itemList; + private List itemList; } diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItemResult.java similarity index 97% rename from epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java rename to epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItemResult.java index 7e3abbaa0e..dfe0b85ffa 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItemResult.java @@ -12,7 +12,7 @@ import java.util.List; * @Date 2021/10/26 2:15 下午 */ @Data -public class FormItem implements Serializable { +public class FormItemResult implements Serializable { private static final long serialVersionUID = 7443085469505238040L; /** diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItemResult2.java similarity index 97% rename from epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java rename to epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItemResult2.java index 99114fe830..3372b55a37 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItem2.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/result/FormItemResult2.java @@ -12,7 +12,7 @@ import java.util.List; * @Date 2021/10/26 4:29 下午 */ @Data -public class FormItem2 implements Serializable { +public class FormItemResult2 implements Serializable { private static final long serialVersionUID = -7571266621687396261L; /** * 父项ID diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index ecfe051d35..9205d5bedb 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -91,7 +91,7 @@ public interface OperCustomizeOpenFeignClient { * @date 2021.10.28 15:19:59 */ @PostMapping("/oper/customize/icform/items") - Result> listItems(@RequestBody CustomerFormQueryDTO formDto); + Result> listItems(@RequestBody CustomerFormQueryDTO formDto); /** * @Author sun diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index b1cc198c20..7835c21b5b 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -73,7 +73,7 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe } @Override - public Result> listItems(CustomerFormQueryDTO formDto) { + public Result> listItems(CustomerFormQueryDTO formDto) { return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "listItems", formDto); } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index 8c506cfe74..f6f52d00c2 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -187,9 +187,9 @@ public class IcFormController { * @date 2021.10.28 15:19:59 */ @PostMapping("items") - public Result> listItems(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto) { + public Result> listItems(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto) { ValidatorUtils.validateEntity(formDto, CustomerFormQueryDTO.GetFormInfoGroup.class); - List rst = icFormService.listItems(tokenDto.getCustomerId(), formDto.getFormCode()); - return new Result>().ok(rst); + List rst = icFormService.listItems(tokenDto.getCustomerId(), formDto.getFormCode()); + return new Result>().ok(rst); } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java index 6cd4fa7188..7cd489b2bb 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcFormDao.java @@ -20,7 +20,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; -import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.FormItemResult; import com.epmet.dto.result.OptionDTO; import com.epmet.entity.IcFormEntity; import org.apache.ibatis.annotations.Mapper; @@ -47,9 +47,9 @@ public interface IcFormDao extends BaseDao { */ CustomerFormResultDTO selectByCode(@Param("customerId") String customerId, @Param("formCode") String formCode); - List selectItemList(String formId, Boolean dynamic); + List selectItemList(String formId, Boolean dynamic); - List selectItemListByGroupId(String groupId); + List selectItemListByGroupId(String groupId); List selectListOption(String itemId); List selectListGroup(String formId); @@ -64,5 +64,5 @@ public interface IcFormDao extends BaseDao { * @author wxz * @date 2021.10.28 16:43:00 */ - List listItems(@Param("formId") String formId); + List listItems(@Param("formId") String formId); } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java index b1d0dddaf1..c90e6227dc 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/IcFormService.java @@ -22,7 +22,7 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.CustomerFormResultDTO; -import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.FormItemResult; import com.epmet.entity.IcFormEntity; import java.util.List; @@ -115,5 +115,5 @@ public interface IcFormService extends BaseService { * @author wxz * @date 2021.10.27 17:41:59 */ - List listItems(String customerId, String formCode); -} \ No newline at end of file + List listItems(String customerId, String formCode); +} diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java index 1170a08309..7d50e6091b 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcFormServiceImpl.java @@ -17,9 +17,7 @@ package com.epmet.service.impl; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; @@ -35,21 +33,18 @@ import com.epmet.dto.IcFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; -import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.FormItemResult; import com.epmet.entity.IcFormEntity; import com.epmet.redis.CustomerFootBarRedis; import com.epmet.service.IcFormService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.Optional; /** * 配置表单 @@ -61,7 +56,7 @@ import java.util.Optional; public class IcFormServiceImpl extends BaseServiceImpl implements IcFormService { @Autowired private CustomerFootBarRedis customerFootBarRedis; - + @Autowired private RedisUtils redisUtils; @@ -135,7 +130,7 @@ public class IcFormServiceImpl extends BaseServiceImpl if (null == resultDTO) { throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); } - List itemList=baseDao.selectItemList(resultDTO.getFormId(),formDto.getDynamic()); + List itemList=baseDao.selectItemList(resultDTO.getFormId(),formDto.getDynamic()); List groupList=baseDao.selectListGroup(resultDTO.getFormId()); resultDTO.setItemList(itemList); resultDTO.setGroupList(groupList); @@ -144,13 +139,13 @@ public class IcFormServiceImpl extends BaseServiceImpl } @Override - public List listItems(String customerId, String formCode) { + public List listItems(String customerId, String formCode) { // 从redis取 String icFormItemsKey = RedisKeys.getIcFormItemsKey(customerId, formCode); - + Object objValue = redisUtils.get(icFormItemsKey); if (objValue != null) { - return ((JSONArray) objValue).toJavaList(FormItem.class); + return ((JSONArray) objValue).toJavaList(FormItemResult.class); //return JSON.parseObject((String) objValue, type); } @@ -160,14 +155,14 @@ public class IcFormServiceImpl extends BaseServiceImpl throw new RenException(EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getCode(),EpmetErrorCode.CUSTOMER_FORM_NOT_EXITS.getMsg()); } - List formItems = baseDao.listItems(formResultDto.getFormId()); - formItems.forEach(i -> { + List formItemResults = baseDao.listItems(formResultDto.getFormId()); + formItemResults.forEach(i -> { i.setOptions(baseDao.selectListOption(i.getItemId())); }); - + // 缓存 - redisUtils.set(icFormItemsKey, formItems); + redisUtils.set(icFormItemsKey, formItemResults); - return formItems; + return formItemResults; } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml index 44d23cda3f..d93d611f7c 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcFormDao.xml @@ -17,7 +17,7 @@ - + @@ -123,13 +123,13 @@ - - + @@ -210,7 +210,7 @@ g.SORT ASC - SELECT fi.ID AS item_id, case when g.TABLE_NAME is null or g.TABLE_NAME = '' then 'ic_resi_user' diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index c92be44a44..0bc25d5ccd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -29,7 +29,6 @@ import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.constant.NumConstant; -import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -183,7 +182,7 @@ public class IcResiUserController { @RequestMapping(value = "/exportExcel2") public void exportExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); - String staffOrgPath = StrConstant.EPMETY_STR; + String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); }else{ @@ -191,53 +190,9 @@ public class IcResiUserController { } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); - CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); + CustomerFormResultDTO resiFormItems = getResiFormAddItems(pageFormDTO.getCustomerId()); - Map> otherSheetItems = new HashMap<>(); - - //主表的 - for (FormItem formItem : resiFormItems.getItemList()) { - if (StringUtils.isBlank(formItem.getColumnName())) { - continue; - } - - Map itemMap = otherSheetItems.getOrDefault(formItem.getTableName(), new HashMap<>()); - otherSheetItems.putIfAbsent(formItem.getTableName(), itemMap); - if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select") || formItem.getItemType().equals("radio")) { - itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); - } - if (formItem.getChildGroup() != null) { - itemMap = otherSheetItems.getOrDefault(formItem.getChildGroup().getTableName(), new HashMap<>()); - otherSheetItems.putIfAbsent(formItem.getChildGroup().getTableName(), itemMap); - for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { - if (StringUtils.isBlank(item2.getColumnName())) { - continue; - } - - if ("checkbox".equals(item2.getItemType()) || "select".equals(item2.getItemType()) || "radio".equals(item2.getItemType())) { - itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2, FormItem.class)); - } - } - - } - } - //其他sheet - - for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { - if (groupItem.getItemList() == null) { - continue; - } - Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(), new HashMap<>()); - otherSheetItems.putIfAbsent(groupItem.getTableName(), itemMap); - for (FormItem2 formItem2 : groupItem.getItemList()) { - if (StringUtils.isBlank(formItem2.getColumnName())) { - continue; - } - if ("checkbox".equals(formItem2.getItemType()) || "select".equals(formItem2.getItemType()) || "radio".equals(formItem2.getItemType())) { - itemMap.put(formItem2.getColumnName().concat(formItem2.getColumnNum() == 0 ? "" : formItem2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItem2, FormItem.class)); - } - } - } + Map> otherSheetItems = buildItemMap(resiFormItems); Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); @@ -251,11 +206,11 @@ public class IcResiUserController { System.out.println("===resiMainList==="+" "+JSON.toJSONString(resiMainList.values())); sheetMap.put(0, mapData); AtomicInteger n = new AtomicInteger(); - for (FormItem item : resiFormItems.getItemList()) { + for (FormItemResult item : resiFormItems.getItemList()) { if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { - Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); + Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); @@ -274,8 +229,9 @@ public class IcResiUserController { @RequestMapping(value = "/exportExcel") public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); - String staffOrgPath = StrConstant.EPMETY_STR; + String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); }else{ @@ -283,53 +239,12 @@ public class IcResiUserController { } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); - CustomerFormResultDTO resiFormItems = getResiFormItems(pageFormDTO.getCustomerId()); - - Map> otherSheetItems = new HashMap<>(); - - //主表的 - for (FormItem formItem : resiFormItems.getItemList()) { - if (StringUtils.isBlank(formItem.getColumnName())) { - continue; - } - - Map itemMap = otherSheetItems.getOrDefault(formItem.getTableName(), new HashMap<>()); - otherSheetItems.putIfAbsent(formItem.getTableName(), itemMap); - if (formItem.getItemType().equals("checkbox") || formItem.getItemType().equals("select") || formItem.getItemType().equals("radio")) { - itemMap.put(formItem.getColumnName().concat(formItem.getColumnNum() == 0 ? "" : formItem.getColumnNum().toString()), formItem); - } - if (formItem.getChildGroup() != null) { - itemMap = otherSheetItems.getOrDefault(formItem.getChildGroup().getTableName(), new HashMap<>()); - otherSheetItems.putIfAbsent(formItem.getChildGroup().getTableName(), itemMap); - for (FormItem2 item2 : formItem.getChildGroup().getItemList()) { - if (StringUtils.isBlank(item2.getColumnName())) { - continue; - } - - if ("checkbox".equals(item2.getItemType()) || "select".equals(item2.getItemType()) || "radio".equals(item2.getItemType())) { - itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2, FormItem.class)); - } - } + CustomerFormResultDTO resiFormItems = getResiFormAddItems(pageFormDTO.getCustomerId()); + Map> otherSheetItems = buildItemMap(resiFormItems); - } - } - //其他sheet + /*List resiFormAllItems = getResiFormAllItems(pageFormDTO.getCustomerId()); + resiFormAllItems.stream().collect(Collectors.groupingBy(e ->e.get));*/ - for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { - if (groupItem.getItemList() == null) { - continue; - } - Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(), new HashMap<>()); - otherSheetItems.putIfAbsent(groupItem.getTableName(), itemMap); - for (FormItem2 formItem2 : groupItem.getItemList()) { - if (StringUtils.isBlank(formItem2.getColumnName())) { - continue; - } - if ("checkbox".equals(formItem2.getItemType()) || "select".equals(formItem2.getItemType()) || "radio".equals(formItem2.getItemType())) { - itemMap.put(formItem2.getColumnName().concat(formItem2.getColumnNum() == 0 ? "" : formItem2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItem2, FormItem.class)); - } - } - } Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), BASE_TABLE_NAME, pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); @@ -346,11 +261,11 @@ public class IcResiUserController { //======================================= AtomicInteger n = new AtomicInteger(); - for (FormItem item : resiFormItems.getItemList()) { + for (FormItemResult item : resiFormItems.getItemList()) { if (item.getChildGroup() != null) { if (!item.getChildGroup().getTableName().equals(BASE_TABLE_NAME)) { - Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); + Map itemMap1 = otherSheetItems.get(item.getChildGroup().getTableName()); Map> resiChildMap = icResiUserService.getDataForExport(itemMap1,resiMainList, pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), item.getChildGroup().getTableName(), pageFormDTO.getConditions(),staffInfoCacheResult.getAgencyId(),staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); @@ -365,6 +280,57 @@ public class IcResiUserController { excelWriter.finish(); } + + @NotNull + private Map> buildItemMap(CustomerFormResultDTO resiFormItems) { + Map> otherSheetItems = new HashMap<>(); + + //主表的 + for (FormItemResult formItemResult : resiFormItems.getItemList()) { + if (StringUtils.isBlank(formItemResult.getColumnName())) { + continue; + } + + Map itemMap = otherSheetItems.getOrDefault(formItemResult.getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(formItemResult.getTableName(), itemMap); + if (formItemResult.getItemType().equals("checkbox") || formItemResult.getItemType().equals("select") || formItemResult.getItemType().equals("radio")) { + itemMap.put(formItemResult.getColumnName().concat(formItemResult.getColumnNum() == 0 ? "" : formItemResult.getColumnNum().toString()), formItemResult); + } + if (formItemResult.getChildGroup() != null) { + itemMap = otherSheetItems.getOrDefault(formItemResult.getChildGroup().getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(formItemResult.getChildGroup().getTableName(), itemMap); + for (FormItemResult2 item2 : formItemResult.getChildGroup().getItemList()) { + if (StringUtils.isBlank(item2.getColumnName())) { + continue; + } + + if ("checkbox".equals(item2.getItemType()) || "select".equals(item2.getItemType()) || "radio".equals(item2.getItemType())) { + itemMap.put(item2.getColumnName().concat(item2.getColumnNum() == 0 ? "" : item2.getColumnNum().toString()), ConvertUtils.sourceToTarget(item2, FormItemResult.class)); + } + } + + } + } + //其他sheet + + for (FormGroupDTO groupItem : resiFormItems.getGroupList()) { + if (groupItem.getItemList() == null) { + continue; + } + Map itemMap = otherSheetItems.getOrDefault(groupItem.getTableName(), new HashMap<>()); + otherSheetItems.putIfAbsent(groupItem.getTableName(), itemMap); + for (FormItemResult2 formItemResult2 : groupItem.getItemList()) { + if (StringUtils.isBlank(formItemResult2.getColumnName())) { + continue; + } + if ("checkbox".equals(formItemResult2.getItemType()) || "select".equals(formItemResult2.getItemType()) || "radio".equals(formItemResult2.getItemType())) { + itemMap.put(formItemResult2.getColumnName().concat(formItemResult2.getColumnNum() == 0 ? "" : formItemResult2.getColumnNum().toString()), ConvertUtils.sourceToTarget(formItemResult2, FormItemResult.class)); + } + } + } + return otherSheetItems; + } + private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception { fileName = URLEncoder.encode(fileName, "UTF-8"); response.setContentType("application/vnd.ms-excel"); @@ -449,7 +415,7 @@ public class IcResiUserController { } @NotNull - private CustomerFormResultDTO getResiFormItems(String customerId) { + private CustomerFormResultDTO getResiFormAddItems(String customerId) { CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); queryDTO.setFormCode("resi_base_info"); queryDTO.setCustomerId(customerId); @@ -461,6 +427,19 @@ public class IcResiUserController { return resultForm.getData(); } + @NotNull + private List getResiFormAllItems(String customerId) { + CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); + queryDTO.setFormCode("resi_base_info"); + queryDTO.setCustomerId(customerId); + Result> resultForm = operCustomizeOpenFeignClient.listItems(queryDTO); + if (resultForm == null || !resultForm.success() || resultForm.getData() == null) { + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } + System.out.println(JSON.toJSONString(resultForm.getData())); + return resultForm.getData(); + } + /** * @Description 个人信息-家庭关系 * @Param formDTO diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 61f0a2c35b..478ab8f65f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -113,7 +113,7 @@ public interface IcResiUserService extends BaseService { * @param conditions * @return */ - Map> getDataForExport(Map itemList, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions,String currentStaffAgencyId, + Map> getDataForExport(Map itemList, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions,String currentStaffAgencyId, String staffOrgPath); /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 076a880ff0..eeaa8c03e7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -5,7 +5,6 @@ import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcelFactory; -import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.result.OptionResultDTO; @@ -21,7 +20,7 @@ import com.epmet.dto.form.AgencyIdFormDTO; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.HouseFormDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; -import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.FormItemResult; import com.epmet.dto.result.LoginUserDetailsResultDTO; import com.epmet.dto.result.OptionDTO; import com.epmet.entity.IcResiUserEntity; @@ -262,7 +261,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Map> headers = mergeHead(headList); // 查询form相关信息 - List customerItems = listFormItems(IMPORT_IC_RESI_FORM_CODE); + List customerItems = listFormItems(IMPORT_IC_RESI_FORM_CODE); // 清洗表头数据 Map abandonedHeaders = washHeaders(headers, customerItems); @@ -271,7 +270,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res HashMap> combinedHeaders = combineHeaders(headers); // 得到客户配置item数据 - Map formItemMap = customerItems.stream().collect( + Map formItemMap = customerItems.stream().collect( Collectors.toMap(formItem -> { String groupLabel = formItem.getGroupLabel(); String label = formItem.getLabel(); @@ -311,7 +310,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Map> headers = mergeHead(headList); // 查询form相关信息 - List customerItems = listFormItems(IMPORT_IC_RESI_FORM_CODE); + List customerItems = listFormItems(IMPORT_IC_RESI_FORM_CODE); // 清洗表头数据 Map abandonedHeaders = washHeaders(headers, customerItems); @@ -320,7 +319,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res HashMap> combinedHeaders = combineHeaders(headers); // 得到客户配置item数据 - Map formItemMap = customerItems.stream().collect( + Map formItemMap = customerItems.stream().collect( Collectors.toMap(formItem -> { String groupLabel = formItem.getGroupLabel(); String label = formItem.getLabel(); @@ -461,7 +460,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res // skipedRow.setInfo("信息已存在,跳过导入"); // skipedRow.setTableName(targetTableName); // skipedRows.get().get(targetTableName).add(skipedRow); - // + // // continue; //} @@ -603,10 +602,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param formCode * @return */ - private List listFormItems(String formCode) { + private List listFormItems(String formCode) { CustomerFormQueryDTO form = new CustomerFormQueryDTO(); form.setFormCode(formCode); - Result> result = operCustomizeOpenFeignClient.listItems(form); + Result> result = operCustomizeOpenFeignClient.listItems(form); return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); } @@ -643,7 +642,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @author wxz * @date 2021.10.28 21:07:12 */ - private Map washHeaders(Map> headers, List items) { + private Map washHeaders(Map> headers, List items) { List itemLabels = items.stream().map(i -> i.getLabel()).collect(Collectors.toList()); Map abandonedHeaders = new HashMap<>(); for (Map.Entry> entry:headers.entrySet()) { @@ -675,7 +674,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param abandonedHeaders * @return */ - private Map convertExcelHeaders2DBColumnWrappers(Map formItemMap, Map> combinedHeaders, + private Map convertExcelHeaders2DBColumnWrappers(Map formItemMap, Map> combinedHeaders, List> datas, Map abandonedHeaders) { // HashMap> tables = new HashMap<>(); @@ -684,7 +683,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res for (Map.Entry> entry : combinedHeaders.entrySet()) { String combinedHeader = entry.getKey(); - FormItem item = formItemMap.get(combinedHeader); + FormItemResult item = formItemMap.get(combinedHeader); if (item == null) { // 如果数据库中没有该项,可能是用户自己定义的项,忽略 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 8ebec910a8..351c5058b3 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -621,7 +621,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions, + public Map> getDataForExport(Map formItemMap, Map> resiMainList, String customerId, String formCode, String baseTableName, List conditions, String currentStaffAgencyId, String staffOrgPath) { List> mapList = this.dynamicQuery(customerId, formCode, baseTableName, conditions,currentStaffAgencyId,staffOrgPath); @@ -647,9 +647,9 @@ public class IcResiUserServiceImpl extends BaseServiceImpl e : formItemMap.entrySet()) { + for (Map.Entry e : formItemMap.entrySet()) { String k = e.getKey(); - FormItem v = e.getValue(); + FormItemResult v = e.getValue(); Object temp = map.get(k); String vauleStr = temp == null ? "" : temp.toString(); diff --git a/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java b/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java index 4e08497a8e..4bf7b1c16c 100644 --- a/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java +++ b/epmet-user/epmet-user-server/src/test/java/com/epmet/epmetuser/test/IcResiUserControllerTest.java @@ -11,7 +11,7 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.result.CustomerFormResultDTO; import com.epmet.dto.result.FormGroupDTO; -import com.epmet.dto.result.FormItem; +import com.epmet.dto.result.FormItemResult; import com.epmet.feign.OperCustomizeOpenFeignClient; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -75,7 +75,7 @@ public class IcResiUserControllerTest { private Map> buildHeaderByItem(CustomerFormResultDTO resultForm) { //form中的itemlist 为一级表头 但是要排除每个item中含有childGroup的 - List itemList = resultForm.getItemList(); + List itemList = resultForm.getItemList(); List groupList = resultForm.getGroupList(); Map> everySheetHeaderMap = new LinkedHashMap<>(); @@ -155,7 +155,7 @@ public class IcResiUserControllerTest { return everySheetHeaderMap; } - private void buildHeader(Map> everySheetHeaderMap, FormItem item, ExcelExportEntity header) { + private void buildHeader(Map> everySheetHeaderMap, FormItemResult item, ExcelExportEntity header) { List firstSheetHeaderList = new ArrayList<>(); List secondHeaderList = new ArrayList<>(); item.getChildGroup().getItemList().forEach(item2->{ From 355f8694dc12c387ed843d3be19493b4e58f7e68 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 11 Nov 2021 13:23:21 +0800 Subject: [PATCH 190/253] =?UTF-8?q?=E5=88=86=E6=94=AF=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/NeighborHoodServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index d7558cd110..00ea72af58 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -253,6 +253,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { if (!obj.getAgencyName().trim().equals(staffInfoCache.getAgencyName())) { numList.add(obj.getRowNum()); iterator.remove(); + continue; } //当前组织下网格名不存在的也不允许导入 AtomicBoolean br = new AtomicBoolean(true); From e460c53eecf71513dcbc520553d1609d8147780a Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 11 Nov 2021 13:47:45 +0800 Subject: [PATCH 191/253] =?UTF-8?q?=E5=8A=A0=E7=82=B9=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/BuildingController.java | 1 + .../src/main/java/com/epmet/controller/HouseController.java | 1 + .../java/com/epmet/controller/NeighborHoodController.java | 5 +++-- .../java/com/epmet/service/impl/BuildingServiceImpl.java | 5 ++++- .../main/java/com/epmet/service/impl/HouseServiceImpl.java | 5 ++++- .../java/com/epmet/service/impl/NeighborHoodServiceImpl.java | 5 ++++- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index f1aac1a9c0..7e395174b4 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -194,6 +194,7 @@ public class BuildingController { if(resultList.size()> NumConstant.ZERO){ Collections.sort(resultList); String subList = resultList.stream().map(String::valueOf).collect(Collectors.joining("、")); + log.warn(str + "第" + subList + "行未成功!"); return new Result().error(9999, str+"第"+subList+"行未成功!"); } return new Result().ok(str); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java index a2bb68f09f..ab0b6c646f 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/HouseController.java @@ -163,6 +163,7 @@ public class HouseController { if(resultList.size()> NumConstant.ZERO){ Collections.sort(resultList); String subList = resultList.stream().map(String::valueOf).collect(Collectors.joining("、")); + log.warn(str + "第" + subList + "行未成功!"); return new Result().error(9999, str+"第"+subList+"行未成功!"); } return new Result().ok(str); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java index cb22dd00f2..1f54db3e1c 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/NeighborHoodController.java @@ -219,10 +219,11 @@ public class NeighborHoodController { // log.info(JSON.toJSONString(result)); List resultList = neighborHoodService.importExcel(customerId,result,tokenDTO.getUserId(),numList); String str = String.format("共%s条,成功导入%s条。",numList.size()+result.size(),numList.size()+result.size()-resultList.size()); - if(resultList.size()> NumConstant.ZERO){ + if (resultList.size() > NumConstant.ZERO) { Collections.sort(resultList); String subList = resultList.stream().map(String::valueOf).collect(Collectors.joining("、")); - return new Result().error(9999, str+"第"+subList+"行未成功!"); + log.warn(str + "第" + subList + "行未成功!"); + return new Result().error(9999, str + "第" + subList + "行未成功!"); } return new Result().ok(str); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index d00fade930..b7c75a08e1 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -278,7 +278,10 @@ public class BuildingServiceImpl implements BuildingService { //同一小区下不能存在楼栋名字一样的 Integer count = icBuildingDao.checkBuildName(entity.getNeighborHoodId(),entity.getBuildingName(),null); if (null != count && count > 0) { - throw new RenException(EpmetErrorCode.BUILDING_NAME_EXITED.getCode(),EpmetErrorCode.BUILDING_NAME_EXITED.getMsg()); + //throw new RenException(EpmetErrorCode.BUILDING_NAME_EXITED.getCode(),EpmetErrorCode.BUILDING_NAME_EXITED.getMsg()); + log.error(EpmetErrorCode.BUILDING_NAME_EXITED.getMsg()); + numList.add(icBuildingExcel.getRowNum()); + continue; } icBuildingUnitEntityList.addAll(unitList); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index d6bbe4dc86..cbdf569234 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -187,7 +187,10 @@ public class HouseServiceImpl implements HouseService { //同一楼栋,单元内,房屋名称唯一 Integer count = icHouseDao.checkDoorNameUq(entity.getNeighborHoodId(), entity.getBuildingId(), entity.getBuildingUnitId(), entity.getDoorName(),null); if (null != count && count > 0) { - throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + //throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + log.error(EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); + numList.add(icHouseExcel.getRowNum()); + continue; } houseEntityList.add(entity); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index 00ea72af58..e43b2e2045 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -298,7 +298,10 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { //同一客户下,小区名称唯一 Integer count = icNeighborHoodDao.checkNameUq(customerId,icNeighborHoodExcel.getNeighborHoodName(),null); if (null != count && count > 0) { - throw new RenException(EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getCode(), icNeighborHoodExcel.getNeighborHoodName()+EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); + //throw new RenException(EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getCode(), icNeighborHoodExcel.getNeighborHoodName()+EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); + log.error(icNeighborHoodExcel.getNeighborHoodName()+EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); + numList.add(icNeighborHoodExcel.getRowNum()); + continue; } IcNeighborHoodEntity entity = new IcNeighborHoodEntity(); From b8fc9bc7168380af89f2c248c4c3969a5f8773dc Mon Sep 17 00:00:00 2001 From: lzh Date: Thu, 11 Nov 2021 21:14:31 +0800 Subject: [PATCH 192/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B1=85=E6=B0=91?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=B1=BB=E5=88=AB=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IcResiCategoryStatsConfigFormDTO.java | 5 ++--- .../ResiCategoryStatsConfigController.java | 20 +++++++++++++++++-- .../ResiCategoryStatsConfigServiceImpl.java | 4 +--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java index cb9082c985..cc036df66f 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/IcResiCategoryStatsConfigFormDTO.java @@ -53,13 +53,13 @@ public class IcResiCategoryStatsConfigFormDTO implements Serializable { /** * 数据平台分类图标 */ - @NotBlank(message = "管理平台分类图标不能为空",groups = {UpdateGroup.class}) + @NotBlank(message = "数据平台分类图标不能为空",groups = {UpdateGroup.class}) private String dataIcon; /** * 房屋显示分类图标 */ - @NotBlank(message = "管理平台分类图标不能为空",groups = {UpdateGroup.class}) + @NotBlank(message = "房屋显示分类图标不能为空",groups = {UpdateGroup.class}) private String houseShowIcon; /** @@ -72,7 +72,6 @@ public class IcResiCategoryStatsConfigFormDTO implements Serializable { private String warn; private Integer level1; - private Integer level2; private Integer level3; diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index c2639023d4..fd4733c790 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -29,6 +29,7 @@ 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.constant.IcResiCategoryStatsConfigConstant; import com.epmet.dao.IcResiCategoryStatsConfigDao; import com.epmet.dao.IcResiCategoryWarnConfigDao; import com.epmet.dto.IcResiCategoryStatsConfigDTO; @@ -89,8 +90,23 @@ public class ResiCategoryStatsConfigController { ValidatorUtils.validateEntity(formDTO, UpdateGroup.class); String customerId = tokenDTO.getCustomerId(); // String customerId = "123123"; + Integer level1 = formDTO.getLevel1(); + Integer level2 = formDTO.getLevel2(); + Integer level3 = formDTO.getLevel3(); + if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ + //判断level1 和level2 的值 + if(null ==level1 || level1==0){ + return new Result().error(8001,"等级1阈值需大于0"); + } + if(null == level2 || level2==0){ + return new Result().error(8001,"等级2阈值需大于0"); + } + if(level1<=level2){ + return new Result().error(8001,"等级1阈值需大于等级2阈值"); + } + } resiCategoryStatsConfigService.update(customerId,formDTO); - return new Result(); + return new Result().ok("修改成功"); } @PostMapping("updatestatus") public Result updateStatus(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ @@ -98,7 +114,7 @@ public class ResiCategoryStatsConfigController { String customerId = tokenDTO.getCustomerId(); // String customerId = "123123"; resiCategoryStatsConfigService.updateStatus(customerId,formDTO); - return new Result(); + return new Result().ok("修改成功"); } @PostMapping("updatesort") public Result updateSort(@LoginUser TokenDto tokenDTO,@RequestBody List formDTOs){ diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index 25eb5eafd0..bdfba55c6a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -103,7 +103,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf entity.setDataIcon(""); entity.setHouseShowIcon(""); entity.setStatus("show"); - entity.setSort(0); + entity.setSort(icFormItemEntity.getSort()); newStatsEntityList.add(entity); }); if(!CollectionUtils.isEmpty(newStatsEntityList)){ @@ -205,8 +205,6 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf //更新配置预警 if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ - //TODO 判断阈值范围 - //更新 IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) From ce22f2e27f49f8f6e9d3b7d4832b093d500094a4 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 12 Nov 2021 09:39:55 +0800 Subject: [PATCH 193/253] =?UTF-8?q?=E6=88=91=E9=83=BD=E6=94=B9=E5=A4=9F?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/BuildingServiceImpl.java | 6 +++++- .../main/java/com/epmet/service/impl/HouseServiceImpl.java | 6 +++++- .../com/epmet/service/impl/NeighborHoodServiceImpl.java | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index b7c75a08e1..b0241965a8 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -245,7 +245,9 @@ public class BuildingServiceImpl implements BuildingService { //封装数据 List buildingEntityList = new ArrayList<>(); List icBuildingUnitEntityList = new ArrayList<>(); - for (IcBuildingExcel icBuildingExcel : list) { + Iterator iterator1 = list.iterator(); + while (iterator1.hasNext()) { + IcBuildingExcel icBuildingExcel = iterator1.next(); IcBuildingEntity entity = new IcBuildingEntity(); String uuid = UUID.randomUUID().toString().replace("-", ""); entity.setId(uuid); @@ -254,6 +256,7 @@ public class BuildingServiceImpl implements BuildingService { if ("".equals(entity.getNeighborHoodId())) { //str.append("".equals(str) ? icBuildingExcel.getNeighborHoodName() : str.append("、").append(icBuildingExcel.getNeighborHoodName())); numList.add(icBuildingExcel.getRowNum()); + iterator1.remove(); continue; } entity.setBuildingName(icBuildingExcel.getBuildingName()); @@ -281,6 +284,7 @@ public class BuildingServiceImpl implements BuildingService { //throw new RenException(EpmetErrorCode.BUILDING_NAME_EXITED.getCode(),EpmetErrorCode.BUILDING_NAME_EXITED.getMsg()); log.error(EpmetErrorCode.BUILDING_NAME_EXITED.getMsg()); numList.add(icBuildingExcel.getRowNum()); + iterator1.remove(); continue; } icBuildingUnitEntityList.addAll(unitList); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java index cbdf569234..4ff3bb2948 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/HouseServiceImpl.java @@ -161,7 +161,9 @@ public class HouseServiceImpl implements HouseService { }); //封装数据 List houseEntityList = new ArrayList<>(); - for (IcHouseExcel icHouseExcel : list) { + Iterator iterator1 = list.iterator(); + while (iterator1.hasNext()) { + IcHouseExcel icHouseExcel = iterator1.next(); IcHouseEntity entity = new IcHouseEntity(); String uuid = UUID.randomUUID().toString().replace("-", ""); entity.setId(uuid); @@ -175,6 +177,7 @@ public class HouseServiceImpl implements HouseService { if ("".equals(entity.getNeighborHoodId()) || "".equals(entity.getBuildingId()) || "".equals(entity.getBuildingUnitId())) { //str.append("".equals(str) ? icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit() : str.append("、").append(icHouseExcel.getBuildingName() + icHouseExcel.getBuildingUnit())); numList.add(icHouseExcel.getRowNum()); + iterator1.remove(); continue; } entity.setDoorName(icHouseExcel.getDoorName()); @@ -190,6 +193,7 @@ public class HouseServiceImpl implements HouseService { //throw new RenException(EpmetErrorCode.DOOR_NAME_EXITED.getCode(), EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); log.error(EpmetErrorCode.DOOR_NAME_EXITED.getMsg()); numList.add(icHouseExcel.getRowNum()); + iterator1.remove(); continue; } houseEntityList.add(entity); diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java index e43b2e2045..dd5e742342 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/NeighborHoodServiceImpl.java @@ -294,13 +294,16 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { //封装数据 List neighborHoodEntityList = new ArrayList<>(); List icNeighborHoodPropertyEntityList = new ArrayList<>(); - for (IcNeighborHoodExcel icNeighborHoodExcel : list) { + Iterator iterator1 = list.iterator(); + while (iterator1.hasNext()) { + IcNeighborHoodExcel icNeighborHoodExcel = iterator1.next(); //同一客户下,小区名称唯一 Integer count = icNeighborHoodDao.checkNameUq(customerId,icNeighborHoodExcel.getNeighborHoodName(),null); if (null != count && count > 0) { //throw new RenException(EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getCode(), icNeighborHoodExcel.getNeighborHoodName()+EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); log.error(icNeighborHoodExcel.getNeighborHoodName()+EpmetErrorCode.NEIGHBOOR_NAME_EXITED.getMsg()); numList.add(icNeighborHoodExcel.getRowNum()); + iterator1.remove(); continue; } @@ -317,6 +320,7 @@ public class NeighborHoodServiceImpl implements NeighborHoodService { //网格名对应不上的数据舍弃 if ("".equals(entity.getGridId())) { numList.add(icNeighborHoodExcel.getRowNum()); + iterator1.remove(); continue; } entity.setAddress(icNeighborHoodExcel.getAddress()); From 57376acd999409ed16b9d51ec4e175a92c8fe320 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 12 Nov 2021 10:52:27 +0800 Subject: [PATCH 194/253] =?UTF-8?q?/gov/org/customergrid/gridoption?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4=E5=A2=9E=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dto/form/AgencyIdFormDTO.java | 4 ++++ .../epmet/controller/CustomerGridController.java | 6 ++++-- .../main/java/com/epmet/dao/CustomerGridDao.java | 3 +++ .../com/epmet/service/CustomerGridService.java | 2 +- .../service/impl/CustomerGridServiceImpl.java | 16 +++++++++++++++- .../main/resources/mapper/CustomerGridDao.xml | 14 ++++++++++++++ 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java index cd0b55bbc8..a02cdad5f4 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java @@ -19,4 +19,8 @@ public class AgencyIdFormDTO implements Serializable { */ @NotBlank(message = "组织机构ID不能为空") private String agencyId; + + //等着杨林改完,我再限制必填吧 + //@NotBlank(message = "查询条件和查看居民详情:query;新增或修改居民信息:addorupdate") + private String purpose; } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java index eccbc2860f..9063a4a5c5 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java @@ -289,6 +289,9 @@ public class CustomerGridController { /** * @Description 获取组织下网格选项 + * 居民信息:1)查询条件 :所属网格下拉框;2)查看详情:所属网格下拉框 + * label: 社区-网格 + * value: 网格id * @Param formDTO * @Return {@link Result>} * @Author zhaoqifeng @@ -297,7 +300,6 @@ public class CustomerGridController { @PostMapping("gridoption") public Result> getGridOption(@RequestBody AgencyIdFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO); - return new Result>().ok(customerGridService.getGridOption(formDTO.getAgencyId())); + return new Result>().ok(customerGridService.getGridOption(formDTO.getAgencyId(),formDTO.getPurpose())); } - } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java index bec972b9d7..eca348b6f2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/CustomerGridDao.java @@ -18,6 +18,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.dto.CustomerGridDTO; import com.epmet.dto.UserIdAndPidDTO; import com.epmet.dto.UserIdDTO; @@ -342,4 +343,6 @@ public interface CustomerGridDao extends BaseDao { * @Description 查询组织下直属网格列表 **/ List selectByPid(@Param("pid") String pid); + + List getGridOptionForQuery(String gridPids); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java index 453c81f256..7538c7bb29 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/CustomerGridService.java @@ -337,5 +337,5 @@ public interface CustomerGridService extends BaseService { * @Author zhaoqifeng * @Date 2021/10/26 14:01 */ - List getGridOption(String agencyId); + List getGridOption(String agencyId,String purpose); } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java index 43a73d3b46..353cf3bea2 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java @@ -844,7 +844,20 @@ public class CustomerGridServiceImpl extends BaseServiceImpl getGridOption(String agencyId) { + public List getGridOption(String agencyId, String purpose) { + //查询条件和查看居民详情:query;新增或修改居民信息:addorupdate + if ("query".equals(purpose) || StringUtils.isEmpty(purpose)) { + CustomerAgencyDTO customerAgencyDTO = customerAgencyService.get(agencyId); + String gridPids = ""; + if (null != customerAgencyDTO) { + if (StringUtils.isEmpty(customerAgencyDTO.getPid()) || NumConstant.ZERO_STR.equals(customerAgencyDTO.getPid())) { + gridPids = agencyId; + } else { + gridPids = customerAgencyDTO.getPids().concat(StrConstant.COLON).concat(agencyId); + } + } + return baseDao.getGridOptionForQuery(gridPids); + } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CustomerGridEntity::getPid, agencyId); wrapper.last("ORDER BY CONVERT ( GRID_NAME USING gbk ) ASC"); @@ -859,4 +872,5 @@ public class CustomerGridServiceImpl extends BaseServiceImpl + From eb1591946b3f794d23d8b8ed26833f1372a008c4 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 12 Nov 2021 10:56:28 +0800 Subject: [PATCH 195/253] =?UTF-8?q?/gov/org/customergrid/gridoption?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4=E5=A2=9E=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/dto/form/AgencyIdFormDTO.java | 4 ---- .../com/epmet/dto/form/GridOptionFormDTO.java | 24 +++++++++++++++++++ .../controller/CustomerGridController.java | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java index a02cdad5f4..cd0b55bbc8 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/AgencyIdFormDTO.java @@ -19,8 +19,4 @@ public class AgencyIdFormDTO implements Serializable { */ @NotBlank(message = "组织机构ID不能为空") private String agencyId; - - //等着杨林改完,我再限制必填吧 - //@NotBlank(message = "查询条件和查看居民详情:query;新增或修改居民信息:addorupdate") - private String purpose; } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java new file mode 100644 index 0000000000..e6fae52bc9 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/GridOptionFormDTO.java @@ -0,0 +1,24 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description /gov/org/customergrid/gridoption + * @Author yinzuomei + * @Date 2021/11/12 10:54 上午 + */ +@Data +public class GridOptionFormDTO implements Serializable { + /** + * 部门Id + */ + @NotBlank(message = "组织机构ID不能为空") + private String agencyId; + //等着杨林改完,我再限制必填吧 + //@NotBlank(message = "查询条件和查看居民详情:query;新增或修改居民信息:addorupdate") + private String purpose; +} + diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java index 9063a4a5c5..b46bd1aeab 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/CustomerGridController.java @@ -298,7 +298,7 @@ public class CustomerGridController { * @Date 2021/10/26 14:02 */ @PostMapping("gridoption") - public Result> getGridOption(@RequestBody AgencyIdFormDTO formDTO){ + public Result> getGridOption(@RequestBody GridOptionFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO); return new Result>().ok(customerGridService.getGridOption(formDTO.getAgencyId(),formDTO.getPurpose())); } From af011f61db8d88cb6a79255529a2504245c874da Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 12 Nov 2021 11:03:56 +0800 Subject: [PATCH 196/253] =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gov-org-server/src/main/resources/mapper/CustomerGridDao.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml index d3c9e4660d..94ca7a4587 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/CustomerGridDao.xml @@ -702,5 +702,6 @@ on(cg.PID=ca.id and ca.DEL_FLAG='0') where cg.DEL_FLAG='0' and cg.PIDS like concat(#{gridPids},'%') + order by ca.CREATED_TIME asc,cg.CREATED_TIME asc From b45723cfcea6a14862ebf27492a490e13239b45c Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 12 Nov 2021 14:21:11 +0800 Subject: [PATCH 197/253] =?UTF-8?q?/icneighborhood/neighborhoodoption?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=89=8D=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E4=BA=BA=E5=91=98=E6=89=80=E5=B1=9E=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E4=B8=8B=E7=9A=84=E5=B0=8F=E5=8C=BA=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcNeighborHoodController.java | 6 ++++-- .../epmet/service/IcNeighborHoodService.java | 2 +- .../service/impl/IcNeighborHoodServiceImpl.java | 17 ++++++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java index 48137bf4cb..14dcda318a 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -17,8 +17,10 @@ package com.epmet.controller; +import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.dto.result.OptionResultDTO; 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; @@ -91,8 +93,8 @@ public class IcNeighborHoodController { * @Date 2021/10/26 14:38 */ @PostMapping("neighborhoodoption") - public Result> getNeighborHoodOptions(@RequestBody IcNeighborHoodDTO dto) { - return new Result>().ok(icNeighborHoodService.getNeighborHoodOptions(dto.getAgencyId(), dto.getGridId())); + public Result> getNeighborHoodOptions(@LoginUser TokenDto tokenDto, @RequestBody IcNeighborHoodDTO dto) { + return new Result>().ok(icNeighborHoodService.getNeighborHoodOptions(dto.getAgencyId(), dto.getGridId(),tokenDto.getUserId(),tokenDto.getCustomerId())); } /** diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java index cc8fd47ad1..3592d82175 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/IcNeighborHoodService.java @@ -102,7 +102,7 @@ public interface IcNeighborHoodService extends BaseService * @Author zhaoqifeng * @Date 2021/10/26 14:32 */ - List getNeighborHoodOptions(String agencyId, String gridId); + List getNeighborHoodOptions(String agencyId, String gridId,String staffId,String customerId); /** * @Description 通过ID查询小区信息 diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java index db000d1208..3d5b6fa96b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcNeighborHoodServiceImpl.java @@ -22,8 +22,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.IcNeighborHoodDao; import com.epmet.dto.IcNeighborHoodDTO; @@ -113,13 +115,18 @@ public class IcNeighborHoodServiceImpl extends BaseServiceImpl getNeighborHoodOptions(String agencyId, String gridId) { - if (StringUtils.isBlank(agencyId)) { - log.error("组织ID为空"); - return Collections.emptyList(); + public List getNeighborHoodOptions(String agencyId, String gridId,String staffId,String customerId) { + if (StringUtils.isBlank(agencyId)&&StringUtils.isEmpty(gridId)) { + log.info("agencyId与gridId都为空时,默认查询当前工作人员所属组织下的小区"); + CustomerStaffInfoCacheResult result= CustomerStaffRedis.getStaffInfo(customerId,staffId); + if (null == result || StringUtils.isBlank(result.getAgencyId())) { + log.error(String.format("staffId:%s,工作人员缓存信息查询异常")); + return Collections.emptyList(); + } + agencyId=result.getAgencyId(); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(IcNeighborHoodEntity::getAgencyId, agencyId); + wrapper.eq(StringUtils.isNotBlank(agencyId),IcNeighborHoodEntity::getAgencyId, agencyId); wrapper.eq(StringUtils.isNotBlank(gridId), IcNeighborHoodEntity::getGridId, gridId); wrapper.last("ORDER BY CONVERT ( NEIGHBOR_HOOD_NAME USING gbk ) ASC"); List list = baseDao.selectList(wrapper); From 91ed55d480c4d12e73876b04aa476990f3842ce9 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 12 Nov 2021 16:02:38 +0800 Subject: [PATCH 198/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E6=90=9C=E7=B4=A2=E4=BA=BA=E5=90=8D=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/controller/IcResiUserController.java | 4 ++-- .../src/main/java/com/epmet/service/IcResiUserService.java | 2 +- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 0bc25d5ccd..fced7a9aeb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -409,9 +409,9 @@ public class IcResiUserController { * @date 2021/11/3 1:42 下午 */ @PostMapping("searchbyname") - public Result> searchByName(@RequestBody SearchByNameFormDTO formDTO, @LoginUser TokenDto tokenDto) { + public Result> searchByName(@RequestBody SearchByNameFormDTO formDTO, @LoginUser TokenDto tokenDto) { ValidatorUtils.validateEntity(formDTO, SearchByNameFormDTO.SearchByNameForm.class); - return new Result>().ok(icResiUserService.searchByName(formDTO, tokenDto)); + return new Result>().ok(icResiUserService.searchByName(formDTO, tokenDto)); } @NotNull diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 478ab8f65f..e328c556d4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -99,7 +99,7 @@ public interface IcResiUserService extends BaseService { * @author zxc * @date 2021/11/3 1:42 下午 */ - List searchByName(SearchByNameFormDTO formDTO,TokenDto tokenDto); + PageData searchByName(SearchByNameFormDTO formDTO, TokenDto tokenDto); /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 351c5058b3..daa3526570 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -570,7 +570,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl searchByName(SearchByNameFormDTO formDTO, TokenDto tokenDto) { + public PageData searchByName(SearchByNameFormDTO formDTO, TokenDto tokenDto) { // 查询工作人员所属组织 CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(tokenDto.getCustomerId(), tokenDto.getUserId()); if (null == staffInfo){ @@ -580,7 +580,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl pageInfo = PageHelper.startPage(formDTO.getPageNo(), formDTO.getPageSize()).doSelectPageInfo(() -> baseDao.searchByName(formDTO.getName(), staffInfo.getAgencyId(), no)); List result = pageInfo.getList(); if (CollectionUtils.isEmpty(result)){ - return new ArrayList<>(); + return new PageData<>(new ArrayList<>(), pageInfo.getTotal()); } // 查询小区,楼号,网格 Result> gridResult = govOrgOpenFeignClient.getGridListByGridIds(result.stream().map(SearchByNameResultDTO::getGridId).collect(Collectors.toList())); @@ -605,7 +605,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl(result, pageInfo.getTotal()); } /** From 41606959e7d1e6bbdf3885a27c70bc42f9cdb31b Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 12 Nov 2021 16:18:15 +0800 Subject: [PATCH 199/253] =?UTF-8?q?=E3=80=90=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=91=E6=90=9C=E7=B4=A2=E4=BA=BA=E5=90=8D=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/IcResiUserDao.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index 4839f96d5a..c0a5d5ad33 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -187,7 +187,7 @@ GRID_ID FROM ic_resi_user WHERE DEL_FLAG = '0' - AND PIDS LIKE CONCAT('%',#{agencyId},'%') + AND (AGENCY_ID = #{agencyId} OR PIDS LIKE CONCAT('%',#{agencyId},'%')) AND `NAME` LIKE CONCAT('%',#{name},'%') ORDER BY `NAME` From 27d64c41cc8a23c589ec033d16ec8d4ea5636f9f Mon Sep 17 00:00:00 2001 From: lzh Date: Sat, 13 Nov 2021 17:23:25 +0800 Subject: [PATCH 200/253] =?UTF-8?q?=E5=A2=9E=E5=8A=A0customerId=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResiCategoryStatsConfigController.java | 6 ++- .../ResiCategoryStatsConfigServiceImpl.java | 22 ++++++---- .../controller/StatsResiWarnController.java | 15 ++++--- .../com/epmet/dao/IcStatsResiWarnDao.java | 18 +++++++-- .../epmet/service/StatsResiWarnService.java | 6 +-- .../impl/StatsResiWarnServiceImpl.java | 40 ++++++++++++------- .../resources/mapper/IcStatsResiWarnDao.xml | 16 +++++--- 7 files changed, 81 insertions(+), 42 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index fd4733c790..1e6de73f54 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -134,10 +134,11 @@ public class ResiCategoryStatsConfigController { } @PostMapping("resicategorystatslistshowd") - public Result> resiCategoryStatsListShowd(){ + public Result> resiCategoryStatsListShowd(@LoginUser TokenDto tokenDTO){ //获取预警配置列表 List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper() .lambda() + .eq(IcResiCategoryStatsConfigEntity::getCustomerId,tokenDTO.getCustomerId()) .eq(IcResiCategoryStatsConfigEntity::getStatus,"show") .orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); @@ -145,10 +146,11 @@ public class ResiCategoryStatsConfigController { } @PostMapping("resicategorywarnlist") - public Result> resiCategoryWarnList(){ + public Result> resiCategoryWarnList(@LoginUser TokenDto tokenDTO){ //获取预警配置列表 List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper() .lambda() + .eq(IcResiCategoryWarnConfigEntity::getCustomerId,tokenDTO.getCustomerId()) .orderByAsc(IcResiCategoryWarnConfigEntity::getSort)); return new Result>().ok(ConvertUtils.sourceToTarget(warnConfigEntityList, IcResiCategoryWarnConfigDTO.class)); diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index bdfba55c6a..bfeeaa0b9d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -49,14 +49,14 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf @Transactional(rollbackFor = Exception.class) public List list(String customerId) { //1.获取IC_FORM_ITEM 中 用于数据分析字段的 id 和label - List icFormItemEntityList = icFormItemDao.selectList(new QueryWrapper().lambda().eq(IcFormItemEntity::getDataAnalyse, 1)); + List icFormItemEntityList = icFormItemDao.selectList(new QueryWrapper().lambda().eq(IcFormItemEntity::getCustomerId,customerId).eq(IcFormItemEntity::getDataAnalyse, 1)); if(CollectionUtils.isEmpty(icFormItemEntityList)){ return new ArrayList<>(); } Set groupIds = icFormItemEntityList.stream().filter(item-> !"0".equals(item.getItemGroupId())).map(item->item.getItemGroupId()).collect(Collectors.toSet()); List icFormItemGroupEntityList = new ArrayList<>(); if(!CollectionUtils.isEmpty(groupIds)){ - icFormItemGroupEntityList.addAll(icFormItemGroupDao.selectList(new QueryWrapper().lambda().in(IcFormItemGroupEntity::getId, groupIds))); + icFormItemGroupEntityList.addAll(icFormItemGroupDao.selectList(new QueryWrapper().lambda().eq(IcFormItemGroupEntity::getCustomerId,customerId).in(IcFormItemGroupEntity::getId, groupIds))); } //获取tableName和COLUMN_NAME Map tableColumnMap = new HashMap<>(); @@ -75,8 +75,8 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf }); //2.获取ic_resi_category_stats_config 和 ic_resi_category_warn_config 表中的数据 - List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(null); - List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(null); + List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper().lambda().eq(IcResiCategoryStatsConfigEntity::getCustomerId,customerId)); + List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper().lambda().eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId)); //3.新增不存在的,删除不在tableColumnMap的 Map statsTableColumnMap = new HashMap<>(); @@ -129,8 +129,11 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf } //4.返回数据 - List statsConfigList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper().lambda().orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); - List warnConfigList = icResiCategoryWarnConfigDao.selectList(null); + List statsConfigList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper().lambda() + .eq(IcResiCategoryStatsConfigEntity::getCustomerId,customerId) + .orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); + List warnConfigList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId)); Map warnMap =new HashMap<>(); warnConfigList.forEach(item->{ warnMap.put(item.getTableName()+"-"+item.getColumnName(),item); @@ -169,6 +172,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf return result; } IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getCustomerId, icResiCategoryStatsConfigDTO.getCustomerId()) .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); @@ -207,6 +211,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ //更新 IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); if(null == icResiCategoryWarnConfigEntity){ @@ -234,6 +239,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf }else if(IcResiCategoryStatsConfigConstant.WARN_NO.equals(formDTO.getWarn())){ //删除 icResiCategoryWarnConfigDao.delete(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) .eq(IcResiCategoryWarnConfigEntity::getTableName,icResiCategoryStatsConfigDTO.getTableName()) .eq(IcResiCategoryWarnConfigEntity::getColumnName,icResiCategoryStatsConfigDTO.getColumnName())); } @@ -267,8 +273,8 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf } icResiCategoryStatsConfigService.updateBatchById(entityList); //排序更新预警的 - List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(null); - List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(null); + List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper().lambda().eq(IcResiCategoryStatsConfigEntity::getCustomerId,customerId)); + List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper().lambda().eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId)); if(CollectionUtils.isEmpty(warnConfigEntityList)){ return ; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java index 510c434264..0947eaaf82 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java @@ -57,29 +57,32 @@ public class StatsResiWarnController { private StatsResiWarnService statsResiWarnService; @PostMapping("list") - public Result list(@RequestBody StatsResiListFormDTO formDTO){ + public Result list(@LoginUser TokenDto tokenDto,@RequestBody StatsResiListFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO); - List icStatsResiResultDTOList = statsResiWarnService.list(formDTO.getId(),formDTO.getLevel()); + String customerId = tokenDto.getCustomerId(); + List icStatsResiResultDTOList = statsResiWarnService.list(customerId,formDTO.getId(),formDTO.getLevel()); return new Result().ok(icStatsResiResultDTOList); } @PostMapping("buildingwarnlist") - public Result buildingWarnList(@RequestBody StatsResiWarnFormDTO formDTO){ + public Result buildingWarnList(@LoginUser TokenDto tokenDto,@RequestBody StatsResiWarnFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, StatsResiWarnFormDTO.ListSelectedBuilding.class); + String customerId = tokenDto.getCustomerId(); String agencyID = formDTO.getAgencyId(); - List icStatsResiWarnBuildingResultDTOS = statsResiWarnService.buildingwWarnList(agencyID); + List icStatsResiWarnBuildingResultDTOS = statsResiWarnService.buildingwWarnList(customerId,agencyID); return new Result().ok(icStatsResiWarnBuildingResultDTOS); } @PostMapping("userwarnlist") - public Result userWarnList(@RequestBody StatsResiWarnFormDTO formDTO){ + public Result userWarnList(@LoginUser TokenDto tokenDto,@RequestBody StatsResiWarnFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, StatsResiWarnFormDTO.ListSelectedUser.class); + String customerId = tokenDto.getCustomerId(); List buildingIdList = formDTO.getBuildingIdList(); if(CollectionUtils.isEmpty(buildingIdList)){ return new Result(); } - List icStatsResiWarnUserResultDTOS = statsResiWarnService.userWarnList(formDTO.getConfigId(), formDTO.getBuildingIdList()); + List icStatsResiWarnUserResultDTOS = statsResiWarnService.userWarnList(customerId,formDTO.getConfigId(), formDTO.getBuildingIdList()); return new Result().ok(icStatsResiWarnUserResultDTOS); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java index 5eea1c2c44..ef9fac802c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcStatsResiWarnDao.java @@ -35,17 +35,27 @@ import java.util.Map; @Mapper public interface IcStatsResiWarnDao extends BaseDao { - List selectResiWarnByAgencyId(@Param("agencyId") String agencyId); + List selectResiWarnByAgencyId(@Param("customerId") String customerId,@Param("agencyId") String agencyId); - List> userWarnList(@Param("buildingIdList") List buildingIdList, @Param("tableName") String tableName, @Param("columnName") String columnName); + List> userWarnList(@Param("customerId") String customerId, + @Param("buildingIdList") List buildingIdList, + @Param("tableName") String tableName, + @Param("columnName") String columnName); Integer countListByLevelAndCol( + @Param("customerId") String customerId, @Param("tableName") String tableName, @Param("columnName") String columnName, @Param("id")String id, @Param("level")String level); - List resiWarn(@Param("tableName") String tableName,@Param("columnName") String columnName); - IcStatsResiWarnEntity resiWarnById(@Param("tableName") String tableName,@Param("columnName") String columnName,@Param("icStatsResiWarn") IcStatsResiWarnEntity icStatsResiWarn); + List resiWarn(@Param("customerId") String customerId, + @Param("tableName") String tableName, + @Param("columnName") String columnName); + + IcStatsResiWarnEntity resiWarnById(@Param("customerId") String customerId, + @Param("tableName") String tableName, + @Param("columnName") String columnName, + @Param("icStatsResiWarn") IcStatsResiWarnEntity icStatsResiWarn); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java index 4ef4b6722a..64ccaa2fb1 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java @@ -31,11 +31,11 @@ import java.util.List; */ public interface StatsResiWarnService{ - List buildingwWarnList(String agencyID); + List buildingwWarnList(String customerId,String agencyID); - List userWarnList(String configId, List buildingIdList); + List userWarnList(String customerId,String configId, List buildingIdList); - List list(String id, String level); + List list(String customerId,String id, String level); void resiWarn(String customerId); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java index 8a8af94e2b..4b2028501c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java @@ -52,7 +52,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { private IcResiUserDao icResiUserDao; @Override - public List buildingwWarnList(String agencyID) { + public List buildingwWarnList(String customerId,String agencyID) { List result = new ArrayList<>(); //feign获取当前需要预警的配置信息以及阈值 Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); @@ -81,7 +81,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { return resiWarnBuildingResultDTO; }).collect(Collectors.toList()); //统计数量 - List icStatsResiWarnEntityList = icStatsResiWarnDao.selectResiWarnByAgencyId(agencyID); + List icStatsResiWarnEntityList = icStatsResiWarnDao.selectResiWarnByAgencyId(customerId,agencyID); if(CollectionUtils.isEmpty(icStatsResiWarnEntityList )){ return result; } @@ -115,7 +115,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { } @Override - public List userWarnList(String configId, List buildingIdList) { + public List userWarnList(String customerId,String configId, List buildingIdList) { //feign根据buildingIdList 获取网格,小区,楼宇 信息 Result> buildingList = govOrgOpenFeignClient.buildingListByIds(buildingIdList); if (!buildingList.success() || null == buildingList.getData()) { @@ -137,7 +137,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { IcResiCategoryWarnConfigDTO icResiCategoryWarnConfigDTO = warnResult.getData(); //根据buildingID,tableName he columnName获取名字 - List> maps = icStatsResiWarnDao.userWarnList(buildingIdList, icResiCategoryWarnConfigDTO.getTableName(), icResiCategoryWarnConfigDTO.getColumnName()); + List> maps = icStatsResiWarnDao.userWarnList(customerId,buildingIdList, icResiCategoryWarnConfigDTO.getTableName(), icResiCategoryWarnConfigDTO.getColumnName()); result.forEach(item->{ item.setConfigId(configId); List> buildingIds = maps.stream().filter(map -> item.getBuildingId().equals(map.get("buildingId"))).collect(Collectors.toList()); @@ -147,7 +147,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { } @Override - public List list(String id, String level) { + public List list(String customerId,String id, String level) { //获取所有配置类项 getshow Result> statsResult = operCustomizeOpenFeignClient.resiCategoryStatsListShowd(); if (!statsResult.success() || null == statsResult.getData()) { @@ -164,7 +164,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { resultDTO.setHouseShowIcon(item.getHouseShowIcon()); resultDTO.setManagementIcon(item.getManagementIcon()); //根据id ,level 获取count - Integer count = icStatsResiWarnDao.countListByLevelAndCol(item.getTableName(),item.getColumnName(),id,level); + Integer count = icStatsResiWarnDao.countListByLevelAndCol(customerId,item.getTableName(),item.getColumnName(),id,level); resultDTO.setCount(count); result.add(resultDTO); }); @@ -187,10 +187,10 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { //保存数据 List icStatsResiWarnEntities = new ArrayList<>(); for (IcResiCategoryWarnConfigDTO item : icResiCategoryWarnConfigDTOList) { - icStatsResiWarnDao.delete(new QueryWrapper().lambda().eq(IcStatsResiWarnEntity::getConfigId,item.getId())); - List maps = icStatsResiWarnDao.resiWarn(item.getTableName(), item.getColumnName()); + icStatsResiWarnDao.delete(new QueryWrapper().lambda().eq(IcStatsResiWarnEntity::getConfigId,item.getId()).eq(IcStatsResiWarnEntity::getCustomerId,customerId)); + List maps = icStatsResiWarnDao.resiWarn(customerId,item.getTableName(), item.getColumnName()); if(CollectionUtils.isEmpty(maps)){ continue; } @@ -226,6 +226,11 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { if(null == icResiUserEntity){ return ; } + IcStatsResiWarnEntity query = new IcStatsResiWarnEntity(); + query.setAgencyId(icResiUserEntity.getAgencyId()); + query.setGridId(icResiUserEntity.getGridId()); + query.setNeighborHoodId(icResiUserEntity.getVillageId()); + query.setBuildingId(icResiUserEntity.getBuildId()); //保存数据 for (IcResiCategoryWarnConfigDTO item : icResiCategoryWarnConfigDTOList) { @@ -233,11 +238,13 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { IcStatsResiWarnEntity icStatsResiWarn = icStatsResiWarnDao.selectOne(new QueryWrapper().lambda() .eq(IcStatsResiWarnEntity::getConfigId,item.getId()) + .eq(IcStatsResiWarnEntity::getCustomerId,customerId) .eq(IcStatsResiWarnEntity::getAgencyId, icResiUserEntity.getAgencyId()) .eq(IcStatsResiWarnEntity::getGridId, icResiUserEntity.getGridId()) .eq(IcStatsResiWarnEntity::getNeighborHoodId, icResiUserEntity.getVillageId()) .eq(IcStatsResiWarnEntity::getBuildingId, icResiUserEntity.getBuildId())); - + //统计数量 + IcStatsResiWarnEntity resiWarnEntity = icStatsResiWarnDao.resiWarnById(customerId,item.getTableName(), item.getColumnName(),query); if(null == icStatsResiWarn){ //如果不存在,新增统计数量 icStatsResiWarn = new IcStatsResiWarnEntity(); @@ -248,18 +255,23 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { icStatsResiWarn.setBuildingId(icResiUserEntity.getBuildId()); icStatsResiWarn.setConfigId(item.getId()); icStatsResiWarn.setCustomerId(customerId); - IcStatsResiWarnEntity resiWarnEntity = icStatsResiWarnDao.resiWarnById(item.getTableName(), item.getColumnName(),icStatsResiWarn); + if(null == resiWarnEntity){ - continue; + icStatsResiWarn.setCount(0); + }else{ + icStatsResiWarn.setCount(resiWarnEntity.getCount()); } - icStatsResiWarn.setCount(resiWarnEntity.getCount()); icStatsResiWarnDao.insert(icStatsResiWarn); }else{ //如果存在,更新统计数量 - IcStatsResiWarnEntity resiWarnEntity = icStatsResiWarnDao.resiWarnById(item.getTableName(), item.getColumnName(),icStatsResiWarn); - icStatsResiWarn.setCount(resiWarnEntity.getCount()); + if(null == resiWarnEntity){ + icStatsResiWarn.setCount(0); + }else{ + icStatsResiWarn.setCount(resiWarnEntity.getCount()); + } icStatsResiWarn.setCustomerId(customerId); icStatsResiWarnDao.updateById(icStatsResiWarn); + } diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml index 79a5f7499b..4a4a2a6cc3 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcStatsResiWarnDao.xml @@ -29,6 +29,7 @@ AND (AGENCY_ID = #{agencyId} or CONCAT(':',AGENCY_PIDS, ':') like CONCAT('%:',#{agencyId},':%')) + and CUSTOMER_ID = #{customerId} @@ -63,7 +66,7 @@ and ID in ( - select IC_RESI_USER from ${tableName} where ${columnName} = '1' and DEL_FLAG = '0' + select IC_RESI_USER from ${tableName} where ${columnName} = '1' and CUSTOMER_ID = #{customerId} and DEL_FLAG = '0' ) @@ -78,6 +81,7 @@ AND BUILD_ID = #{id} + and CUSTOMER_ID = #{customerId} and DEL_FLAG = '0' @@ -97,10 +101,11 @@ and ID in ( - select IC_RESI_USER from ${tableName} where ${columnName} = '1' and DEL_FLAG = '0' + select IC_RESI_USER from ${tableName} where ${columnName} = '1' and CUSTOMER_ID = #{customerId} and DEL_FLAG = '0' ) - and DEL_FLAG = '0' + and CUSTOMER_ID = #{customerId} + and DEL_FLAG = '0' group by AGENCY_ID,GRID_ID,VILLAGE_ID,BUILD_ID SELECT b.id AS buildingId, - CONCAT(nh.NEIGHBOR_HOOD_NAME,'-',b.BUILDING_NAME) + IFNULL(CONCAT(nh.NEIGHBOR_HOOD_NAME,'-',b.BUILDING_NAME),'') AS buildingName FROM ic_building b LEFT JOIN ic_neighbor_hood nh ON (nh.ID = b.NEIGHBOR_HOOD_ID AND nh.DEL_FLAG = '0') WHERE b.DEL_FLAG = '0' From ef80bcb27df7f48654b57941537c617cc977f2f1 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 15 Nov 2021 15:50:37 +0800 Subject: [PATCH 207/253] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=88=9A=E6=89=8D=E9=82=A3=E4=B8=AA=E6=9C=89?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 4 + .../controller/IcResiUserController.java | 116 ++++++++++-------- .../com/epmet/service/IcResiUserService.java | 3 +- .../service/impl/IcResiUserServiceImpl.java | 15 ++- .../main/resources/mapper/IcResiUserDao.xml | 6 +- 5 files changed, 83 insertions(+), 61 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 423ac83966..1b6b1b15ef 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -603,4 +603,8 @@ public class RedisKeys { public static String getIcFormItemsKey(String customerId, String formCode) { return rootPrefix.concat("icform:").concat(formCode).concat(":items:").concat(customerId); } + + public static String getExportResiBaseInfoKey(String resiId) { + return rootPrefix.concat("resi:").concat("export").concat(":temp:").concat(resiId); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index f6d0adcd92..6d109d837e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -64,11 +64,7 @@ import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -108,9 +104,9 @@ public class IcResiUserController { } @PostMapping("delete") - public Result delete(@LoginUser TokenDto tokenDto,@RequestBody DelIcResiUserFormDTO formDTO){ + public Result delete(@LoginUser TokenDto tokenDto, @RequestBody DelIcResiUserFormDTO formDTO) { formDTO.setCustomerId(tokenDto.getCustomerId()); - ValidatorUtils.validateEntity(formDTO,DelIcResiUserFormDTO.IdGroup.class); + ValidatorUtils.validateEntity(formDTO, DelIcResiUserFormDTO.IdGroup.class); icResiUserService.delete(formDTO); return new Result(); } @@ -175,20 +171,21 @@ public class IcResiUserController { /** * desc :备用 easypoi + * * @param customerId * @param pageFormDTO * @param response * @throws Exception */ @RequestMapping(value = "/exportExcel2") - public void exportExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + public void exportExcel(@RequestHeader String customerId, @LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); - }else{ - staffOrgPath=staffInfoCacheResult.getAgencyId(); + } else { + staffOrgPath = staffInfoCacheResult.getAgencyId(); } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); @@ -196,7 +193,7 @@ public class IcResiUserController { Map> otherSheetItems = buildItemMap(resiFormItems); - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(),BASE_TABLE_NAME, pageFormDTO,staffInfoCacheResult.getAgencyId(),staffOrgPath); + Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), BASE_TABLE_NAME, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; @@ -205,7 +202,7 @@ public class IcResiUserController { Map> sheetMap = new HashMap<>(); Map mapData = new HashMap<>(); mapData.put("list", resiMainList.values()); - System.out.println("===resiMainList==="+" "+JSON.toJSONString(resiMainList.values())); + System.out.println("===resiMainList===" + " " + JSON.toJSONString(resiMainList.values())); sheetMap.put(0, mapData); AtomicInteger n = new AtomicInteger(); for (FormItemResult item : resiFormItems.getItemList()) { @@ -216,7 +213,7 @@ public class IcResiUserController { String tableName = item.getChildGroup().getTableName(); Map itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, resiMainList, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); @@ -229,18 +226,18 @@ public class IcResiUserController { Workbook workbook = ExcelExportUtil.exportExcel(sheetMap, params); workbook.setActiveSheet(0); - workbook.write(getOutputStream("居民基本信息.xls",response)); + workbook.write(getOutputStream("居民基本信息.xls", response)); } @RequestMapping(value = "/exportExcel") - public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { - //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); + public void exportExcelByEasyExcel(@RequestHeader String customerId,/*@LoginUser*/ TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); - }else{ - staffOrgPath=staffInfoCacheResult.getAgencyId(); + } else { + staffOrgPath = staffInfoCacheResult.getAgencyId(); } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); @@ -254,60 +251,71 @@ public class IcResiUserController { String templatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); String fileName = "居民基本信息.xlsx"; - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName,response)).withTemplate(inputStream).build(); + ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); WriteSheet fistSheet = EasyExcel.writerSheet(NumConstant.ZERO).build(); + pageFormDTO.setPageSize(4); pageFormDTO.setPageNo(NumConstant.ONE); - pageFormDTO.setPageSize(NumConstant.ONE_THOUSAND); - AtomicBoolean isGoon = new AtomicBoolean(true); - Map childTableIsGoonMap = new HashMap<>(); - Map childTableWriteSheetMap = new HashMap<>(); + //子表是否停止查询 + Set stopSearchSet = new HashSet<>(); + Map childTableWriteSheetMap = new HashMap<>(); + Map> resiMainTableMap = null; do { - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME),new HashMap<>(), BASE_TABLE_NAME, pageFormDTO,staffInfoCacheResult.getAgencyId(),staffOrgPath); + resiMainTableMap = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), BASE_TABLE_NAME, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 - if (resiMainList.keySet().size() itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, resiMainList, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 - if (resiChildMap.keySet().size()>> test(@LoginUser TokenDto tokenDto,@RequestBody DynamicQueryFormDTO formDTO) { + public Result>> test(@LoginUser TokenDto tokenDto, @RequestBody DynamicQueryFormDTO formDTO) { formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); //formDTO.setCustomerId(tokenDto.getCustomerId()); return new Result>>().ok(icResiUserService.dynamicQuery(formDTO.getCustomerId(), formDTO.getFormCode(), formDTO.getResultTableName(), formDTO.getConditions(), - tokenDto.getUserId(),null)); + tokenDto.getUserId(), null)); } /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 4d95ba4fea..45ff713e63 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -106,11 +106,10 @@ public interface IcResiUserService extends BaseService { * desc:条件导出 * * @param itemList - * @param resiMainList * @param baseTableName * @return Map> 用户Id:用户信息所有的字段名及值 */ - Map> getDataForExport(Map itemList, Map> resiMainList, String baseTableName, IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, + Map> getDataForExport(Map itemList, String baseTableName, IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, String staffOrgPath); /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 2afbf99b64..758c348ad6 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -31,6 +31,8 @@ import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.enums.RelationshipEnum; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.redis.common.CustomerOrgRedis; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.redis.common.bean.GridInfoCache; @@ -85,6 +87,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl getWrapper(Map params){ String id = (String)params.get(FieldConstant.ID_HUMP); @@ -614,12 +618,11 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, Map> resiMainList, String baseTableName,IcResiUserPageFormDTO pageFormDTO, + public Map> getDataForExport(Map formItemMap, String baseTableName,IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, String staffOrgPath) { Page> mapListPage = PageHelper.startPage(pageFormDTO.getPageNo(), pageFormDTO.getPageSize(), pageFormDTO.getPageFlag()).doSelectPage(() -> { @@ -668,7 +671,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl columnWrappers = new HashMap<>(); if (v.getItemId().equals("1078")) { - Map userMap = resiMainList.get(map.get(UserConstant.IC_RESI_USER)); IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); value.setColValue(gridId.toString()); columnWrappers.put("1001", value); @@ -711,7 +713,10 @@ public class IcResiUserServiceImpl extends BaseServiceImpl o = (Map) redisUtils.get(RedisKeys.getExportResiBaseInfoKey(resiId)); + if (o != null){ + map.putAll(o); + } return; } @@ -736,6 +741,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl ic_resi_user.DEL_FLAG = '0' + + + AND ${resultTableName}.ID IS NOT NULL + and ic_resi_user.customer_id=#{customerId} and (ic_resi_user.AGENCY_ID =#{currentStaffAgencyId} or ic_resi_user.pids like concat(#{staffOrgPath},'%')) @@ -261,4 +265,4 @@ where DEL_FLAG = '0' AND CUSTOMER_ID = #{customerId} - \ No newline at end of file + From 339dd5e211cc61efb06ec6b20933a87925d8f5be Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Mon, 15 Nov 2021 16:23:01 +0800 Subject: [PATCH 208/253] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/dao/IcResiUserDao.java | 2 +- .../epmet/service/impl/IcResiUserServiceImpl.java | 2 +- .../src/main/resources/mapper/IcResiUserDao.xml | 12 +++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index fbd753f8fb..abc46bfbf9 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -142,6 +142,6 @@ public interface IcResiUserDao extends BaseDao { * @date 2021/11/8 1:50 下午 */ Map selectPersonType(@Param("columns")List columns,@Param("customerId")String customerId, - @Param("tableName")String tableName); + @Param("tableName")String tableName,@Param("userId")String userId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 758c348ad6..febefe4b52 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -552,7 +552,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> groupByTableName = showList.stream().collect(Collectors.groupingBy(IcResiCategoryStatsConfigDTO::getTableName)); groupByTableName.forEach((tableName,list) -> { List columns = list.stream().map(IcResiCategoryStatsConfigDTO::getColumnName).collect(Collectors.toList()); - Map result = baseDao.selectPersonType(columns, personData.getCustomerId(), tableName); + Map result = baseDao.selectPersonType(columns, personData.getCustomerId(), tableName,formDTO.getUserId()); list.forEach(l -> { result.forEach((k,v) -> { if (l.getColumnName().equals(k) && v.equals(NumConstant.ONE_STR)){ diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml index f05bbb4176..712e78ed81 100644 --- a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml +++ b/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiUserDao.xml @@ -258,11 +258,17 @@ From a14962eec139c55ee52803de7eb37853e0a495ed Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Tue, 16 Nov 2021 16:51:02 +0800 Subject: [PATCH 209/253] test --- .../src/main/java/com/epmet/dao/IcResiUserDao.java | 3 ++- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index abc46bfbf9..9897d01be7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -58,7 +58,8 @@ public interface IcResiUserDao extends BaseDao { @Param("resultColumns") List resultColumns, @Param("subTables") List subTables, @Param("currentStaffAgencyId")String currentStaffAgencyId, - @Param("staffOrgPath") String staffOrgPath); + @Param("staffOrgPath") String staffOrgPath, + @Param("resultTableName")String resultTableName); /** * 查询主表 * diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index febefe4b52..82e9071d36 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -322,7 +322,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> list=baseDao.selectListResiMap(formDTO.getCustomerId(), @@ -330,7 +330,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Tue, 16 Nov 2021 17:47:34 +0800 Subject: [PATCH 210/253] =?UTF-8?q?=E6=8C=89=E7=85=A7=E6=9E=9A=E4=B8=BE=20?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E5=86=99=E5=85=A5=20=E9=98=B2=E6=AD=A2=20?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E8=B0=83=E6=95=B4=E5=90=8E=20=E5=86=99?= =?UTF-8?q?=E5=85=A5=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/controller/IcResiUserController.java | 17 +++++++++++------ .../service/impl/IcResiUserServiceImpl.java | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 6d109d837e..2c5336d0f7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -42,6 +42,7 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; +import com.epmet.enums.IcResiUserTableEnums; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; @@ -230,8 +231,8 @@ public class IcResiUserController { } @RequestMapping(value = "/exportExcel") - public void exportExcelByEasyExcel(@RequestHeader String customerId,/*@LoginUser*/ TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { - tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); + public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { @@ -253,7 +254,8 @@ public class IcResiUserController { String fileName = "居民基本信息.xlsx"; ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); - WriteSheet fistSheet = EasyExcel.writerSheet(NumConstant.ZERO).build(); + IcResiUserTableEnums tableEnums = IcResiUserTableEnums.getObjectByTableName(BASE_TABLE_NAME); + WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); pageFormDTO.setPageSize(4); pageFormDTO.setPageNo(NumConstant.ONE); @@ -300,15 +302,18 @@ public class IcResiUserController { stopSearchSet.add(tableName); } System.out.println("===resiChildMap===" + tableName + " " + JSON.toJSONString(resiChildMap.values())); - + tableEnums = IcResiUserTableEnums.getObjectByTableName(tableName); + if (tableEnums == null){ + continue; + } //构建新的sheet WriteSheet childWriteSheet = childTableWriteSheetMap.get(tableName); if (childWriteSheet == null) { - childWriteSheet = EasyExcel.writerSheet(n.incrementAndGet()).build(); + childWriteSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); } childTableWriteSheetMap.put(tableName, childWriteSheet); //写入数据 - excelWriter.fill(new FillWrapper("t" + (n.get() + NumConstant.ONE), resiChildMap.values()), childWriteSheet); + excelWriter.fill(new FillWrapper("t" + (tableEnums.getSheetNo() + NumConstant.ONE), resiChildMap.values()), childWriteSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + NumConstant.ONE); //重置数据 resiChildMap.clear(); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index febefe4b52..3e7ad6bc17 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -713,7 +713,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl o = (Map) redisUtils.get(RedisKeys.getExportResiBaseInfoKey(resiId)); + Map o = redisUtils.hGetAll(RedisKeys.getExportResiBaseInfoKey(resiId)); if (o != null){ map.putAll(o); } @@ -742,7 +742,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Tue, 16 Nov 2021 23:30:45 +0800 Subject: [PATCH 211/253] =?UTF-8?q?=E6=A5=BC=E5=AE=87=E9=A2=84=E8=AD=A6?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E5=88=97=E8=A1=A8=E5=92=8C=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/result/BuildingResultPagedDTO.java | 26 +++++++++ .../epmet/feign/GovOrgOpenFeignClient.java | 3 + .../GovOrgOpenFeignClientFallback.java | 4 ++ .../epmet/controller/BuildingController.java | 12 ++++ .../java/com/epmet/dao/IcBuildingDao.java | 2 + .../com/epmet/service/BuildingService.java | 3 + .../service/impl/BuildingServiceImpl.java | 12 ++++ .../main/resources/mapper/IcBuildingDao.xml | 1 + .../feign/OperCustomizeOpenFeignClient.java | 7 +-- .../OperCustomizeOpenFeignClientFallback.java | 9 +-- .../ResiCategoryStatsConfigController.java | 15 +++-- .../epmet/dto/form/StatsResiWarnFormDTO.java | 10 ++++ .../IcStatsResiWarnBuildingResultDTO.java | 5 ++ .../controller/StatsResiWarnController.java | 11 +++- .../epmet/service/StatsResiWarnService.java | 3 +- .../impl/StatsResiWarnServiceImpl.java | 57 +++++++++++++------ 16 files changed, 143 insertions(+), 37 deletions(-) create mode 100644 epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultPagedDTO.java diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultPagedDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultPagedDTO.java new file mode 100644 index 0000000000..eb0bc8e904 --- /dev/null +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/result/BuildingResultPagedDTO.java @@ -0,0 +1,26 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/25 15:03 + */ +@Data +public class BuildingResultPagedDTO implements Serializable { + private static final long serialVersionUID = -2129418426919785999L; + /** + * + */ + private Integer total; + + /** + * 议题列表 + */ + private List list; + +} diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index 4525030489..b1cbf680a9 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -523,6 +523,9 @@ public interface GovOrgOpenFeignClient { @PostMapping("/gov/org/building/buildinglistbyids") Result> buildingListByIds(@RequestBody List buildingIdList); + @PostMapping("/gov/org/building/buildinglistbyidsPage/{pageNo}/{pageSize}") + Result buildinglistbyidsPage(@RequestBody List buildingIdList,@PathVariable("pageNo") Integer pageNo,@PathVariable("pageSize")Integer pageSize); + @PostMapping("/gov/org/icneighborhood/getlistbyids") Result> getListByIds(@RequestBody List ids); } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index 5a5bc80ed5..f98fdc2093 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -319,6 +319,10 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { public Result> buildingListByIds(List buildingIdList) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "buildingListByIds", buildingIdList); } + @Override + public Result buildinglistbyidsPage(List buildingIdList,Integer pageNo,Integer pageSize) { + return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "buildinglistbyidsPage", buildingIdList,pageNo,pageSize); + } @Override public Result> getListByIds(List ids) { diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java index 7e395174b4..98b5d1233e 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/BuildingController.java @@ -33,6 +33,7 @@ import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.IcBulidingUnitFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.BuildingResultDTO; +import com.epmet.dto.result.BuildingResultPagedDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.IcBuildingUnitEntity; import com.epmet.excel.IcBuildingExcel; @@ -232,4 +233,15 @@ public class BuildingController { } + @PostMapping("buildinglistbyidsPage/{pageNo}/{pageSize}") + public Result buildinglistbyidsPage(@RequestBody List buildingIdList, @PathVariable("pageNo") Integer pageNo, @PathVariable("pageSize") Integer pageSize){ + if(CollectionUtils.isEmpty(buildingIdList)){ + return new Result(); + } + return new Result().ok(buildingService.buildinglistbyidsPage(buildingIdList,pageNo,pageSize)); + + } + + + } diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java index b0cb1d46b6..6d029cb291 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/dao/IcBuildingDao.java @@ -71,4 +71,6 @@ public interface IcBuildingDao extends BaseDao { Integer checkBuildName(@Param("neighborHoodId") String neighborHoodId,@Param("buildingName")String buildingName, @Param("buildingId")String buildingId); List buildingListByIds(@Param("buildingIdList") List buildingIdList); + IPage buildingListByIds(IPage page,@Param("buildingIdList") List buildingIdList); + } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java index 405887d709..3a78628602 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/BuildingService.java @@ -21,6 +21,7 @@ import com.epmet.dto.BuildingTreeLevelDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.BuildingResultDTO; +import com.epmet.dto.result.BuildingResultPagedDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.excel.IcBuildingExcel; @@ -59,4 +60,6 @@ public interface BuildingService { void exportBuildinginfo(ListIcNeighborHoodFormDTO formDTO, HttpServletResponse response) throws Exception ; List buildingListByIds(List buildingIdList); + + BuildingResultPagedDTO buildinglistbyidsPage(List buildingIdList, Integer pageNo, Integer pageSize); } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java index b0241965a8..f1c5d28379 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/BuildingServiceImpl.java @@ -16,6 +16,7 @@ import com.epmet.dto.IcBuildingDTO; import com.epmet.dto.form.IcBulidingFormDTO; import com.epmet.dto.form.ListIcNeighborHoodFormDTO; import com.epmet.dto.result.BuildingResultDTO; +import com.epmet.dto.result.BuildingResultPagedDTO; import com.epmet.dto.result.IcNeighborHoodResultDTO; import com.epmet.entity.*; import com.epmet.enums.BuildingTypeEnums; @@ -325,6 +326,17 @@ public class BuildingServiceImpl implements BuildingService { public List buildingListByIds(List buildingIdList) { return icBuildingDao.buildingListByIds(buildingIdList); } + @Override + public BuildingResultPagedDTO buildinglistbyidsPage(List buildingIdList,Integer pageNo, Integer pageSize) { + IPage page = new Page(pageNo,pageSize); + IPage buildingResultDTOIPage = icBuildingDao.buildingListByIds(page, buildingIdList); + BuildingResultPagedDTO result = new BuildingResultPagedDTO(); + result.setTotal(Long.valueOf(buildingResultDTOIPage.getTotal()).intValue()); + result.setList(buildingResultDTOIPage.getRecords()); + + return result; + } + private List searchAllBuilding(ListIcNeighborHoodFormDTO formDTO) { // QueryWrapper neighborHoodEntityQueryWrapper = new QueryWrapper<>(); diff --git a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml index df3ef06fa0..a137f46b8b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml +++ b/epmet-module/gov-org/gov-org-server/src/main/resources/mapper/IcBuildingDao.xml @@ -329,6 +329,7 @@ #{val} + order by gridName,neighborHoodName,buildingName diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index 9205d5bedb..cb7f414587 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -5,10 +5,7 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.IcResiCategoryWarnConfigDTO; -import com.epmet.dto.form.CheckFloatFootBarFormDTO; -import com.epmet.dto.form.CustomerFootBarFormDTO; -import com.epmet.dto.form.CustomerFormQueryDTO; -import com.epmet.dto.form.CustomerFunctionListFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.feign.fallback.OperCustomizeOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; @@ -106,7 +103,7 @@ public interface OperCustomizeOpenFeignClient { @PostMapping("/oper/customize/resicategorystatsconfig/resicategorystatslistshowd") - Result> resiCategoryStatsListShowd(); + Result> resiCategoryStatsListShowd(@RequestBody IcResiCategoryStatsConfigFormDTO formDTO); @PostMapping("/oper/customize/resicategorystatsconfig/resicategorywarnlist") Result> resiCategoryWarnList(); diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index 7835c21b5b..a793685644 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -6,10 +6,7 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.CustomerFootBarDTO; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.IcResiCategoryWarnConfigDTO; -import com.epmet.dto.form.CheckFloatFootBarFormDTO; -import com.epmet.dto.form.CustomerFootBarFormDTO; -import com.epmet.dto.form.CustomerFormQueryDTO; -import com.epmet.dto.form.CustomerFunctionListFormDTO; +import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.feign.OperCustomizeOpenFeignClient; @@ -88,8 +85,8 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe } @Override - public Result> resiCategoryStatsListShowd() { - return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryStatsListShowd"); + public Result> resiCategoryStatsListShowd(IcResiCategoryStatsConfigFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryStatsListShowd",formDTO); } @Override diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index 1e6de73f54..a3d72acc37 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -134,13 +134,18 @@ public class ResiCategoryStatsConfigController { } @PostMapping("resicategorystatslistshowd") - public Result> resiCategoryStatsListShowd(@LoginUser TokenDto tokenDTO){ + public Result> resiCategoryStatsListShowd(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ //获取预警配置列表 - List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper() - .lambda() + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.lambda() .eq(IcResiCategoryStatsConfigEntity::getCustomerId,tokenDTO.getCustomerId()) - .eq(IcResiCategoryStatsConfigEntity::getStatus,"show") - .orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); + + .orderByAsc(IcResiCategoryStatsConfigEntity::getSort); + if(!StringUtils.isEmpty(formDTO.getStatus())){ + queryWrapper.lambda().eq(IcResiCategoryStatsConfigEntity::getStatus,formDTO.getStatus()); + } + + List statsConfigEntityList = icResiCategoryStatsConfigDao.selectList(queryWrapper); return new Result>().ok(ConvertUtils.sourceToTarget(statsConfigEntityList, IcResiCategoryStatsConfigDTO.class)); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java index f14b15d409..1d41671fff 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/form/StatsResiWarnFormDTO.java @@ -40,6 +40,16 @@ public class StatsResiWarnFormDTO implements Serializable { public interface ListSelectedBuilding {}; public interface ListSelectedUser {}; + + /** + * 当前页 + */ + private Integer pageNo = 1; + + /** + * 当前页数量 + */ + private Integer pageSize = 10; /** * 组织id */ diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java index 5a4369d6ba..3d4253f721 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/IcStatsResiWarnBuildingResultDTO.java @@ -51,6 +51,11 @@ public class IcStatsResiWarnBuildingResultDTO implements Serializable { private Integer level3; private Integer levelCount3; + private String managementIcon; + private String dataIcon; + private String houseShowIcon; + private Integer count; + private List buildingIdList1; private List buildingIdList2; private List buildingIdList3; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java index 0947eaaf82..8e36190cf0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsResiWarnController.java @@ -37,7 +37,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -80,10 +83,12 @@ public class StatsResiWarnController { String customerId = tokenDto.getCustomerId(); List buildingIdList = formDTO.getBuildingIdList(); if(CollectionUtils.isEmpty(buildingIdList)){ - return new Result(); + Map map = new HashMap<>(); + map.put("total",0); + map.put("list",new ArrayList<>()); + return new Result().ok(map); } - List icStatsResiWarnUserResultDTOS = statsResiWarnService.userWarnList(customerId,formDTO.getConfigId(), formDTO.getBuildingIdList()); - return new Result().ok(icStatsResiWarnUserResultDTOS); + return new Result().ok(statsResiWarnService.userWarnList(customerId,formDTO.getConfigId(), formDTO.getBuildingIdList(),formDTO.getPageNo(),formDTO.getPageSize())); } /** diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java index 64ccaa2fb1..37a85105bb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsResiWarnService.java @@ -22,6 +22,7 @@ import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; import com.epmet.dto.result.IcStatsResiWarnUserResultDTO; import java.util.List; +import java.util.Map; /** * 预警统计表 @@ -33,7 +34,7 @@ public interface StatsResiWarnService{ List buildingwWarnList(String customerId,String agencyID); - List userWarnList(String customerId,String configId, List buildingIdList); + Map userWarnList(String customerId, String configId, List buildingIdList, Integer pageNo, Integer pageSize); List list(String customerId,String id, String level); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java index 4b2028501c..a9a378cdd0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java @@ -9,10 +9,8 @@ import com.epmet.dao.IcResiUserDao; import com.epmet.dao.IcStatsResiWarnDao; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.IcResiCategoryWarnConfigDTO; -import com.epmet.dto.result.BuildingResultDTO; -import com.epmet.dto.result.IcStatsResiResultDTO; -import com.epmet.dto.result.IcStatsResiWarnBuildingResultDTO; -import com.epmet.dto.result.IcStatsResiWarnUserResultDTO; +import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; +import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; import com.epmet.entity.IcStatsResiWarnEntity; import com.epmet.feign.GovOrgOpenFeignClient; @@ -26,10 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -54,8 +49,15 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { @Override public List buildingwWarnList(String customerId,String agencyID) { List result = new ArrayList<>(); + //feign 获取当前配置类别列表 + Result> statsResult = operCustomizeOpenFeignClient.resiCategoryStatsListShowd(new IcResiCategoryStatsConfigFormDTO()); + if (!statsResult.success() || null == statsResult.getData()) { + throw new RenException("配置类别查询失败:"+ statsResult.getMsg()); + } + List icResiCategoryStatsConfigDTOList = statsResult.getData(); //feign获取当前需要预警的配置信息以及阈值 Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + if (!warnResult.success() || null == warnResult.getData()) { throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); } @@ -75,9 +77,20 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { resiWarnBuildingResultDTO.setLevelCount1(0); resiWarnBuildingResultDTO.setLevelCount2(0); resiWarnBuildingResultDTO.setLevelCount3(0); + resiWarnBuildingResultDTO.setCount(0); resiWarnBuildingResultDTO.setBuildingIdList1(new ArrayList<>()); resiWarnBuildingResultDTO.setBuildingIdList2(new ArrayList<>()); resiWarnBuildingResultDTO.setBuildingIdList3(new ArrayList<>()); + + + //获取各类别数量 + List collect = icResiCategoryStatsConfigDTOList.stream().filter(i -> i.getTableName().equals(item.getTableName()) && i.getColumnName().equals(item.getColumnName())).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(collect)){ + resiWarnBuildingResultDTO.setManagementIcon(collect.get(0).getManagementIcon()); + resiWarnBuildingResultDTO.setDataIcon(collect.get(0).getDataIcon()); + resiWarnBuildingResultDTO.setHouseShowIcon(collect.get(0).getHouseShowIcon()); + } + return resiWarnBuildingResultDTO; }).collect(Collectors.toList()); //统计数量 @@ -87,13 +100,17 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { } Map warnResultMap = result.stream().collect(Collectors.toMap(IcStatsResiWarnBuildingResultDTO::getConfigId, Function.identity(),(k1, k2)->k1)); for (IcStatsResiWarnEntity item : icStatsResiWarnEntityList) { + IcStatsResiWarnBuildingResultDTO resiWarnBuildingResultDTO = warnResultMap.get(item.getConfigId()); + + //每栋楼的数量 Integer count = Optional.ofNullable(item.getCount()).orElse(0); - IcStatsResiWarnBuildingResultDTO resiWarnBuildingResultDTO = warnResultMap.get(item.getConfigId()); + //判断数量 Integer levle1= resiWarnBuildingResultDTO.getLevel1(); Integer levle2= resiWarnBuildingResultDTO.getLevel2(); Integer levle3= resiWarnBuildingResultDTO.getLevel3(); + resiWarnBuildingResultDTO.setCount(resiWarnBuildingResultDTO.getCount()+count); if(0 == count){ continue; } @@ -115,17 +132,20 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { } @Override - public List userWarnList(String customerId,String configId, List buildingIdList) { + public Map userWarnList(String customerId,String configId, List buildingIdList,Integer pageNo,Integer pageSize) { //feign根据buildingIdList 获取网格,小区,楼宇 信息 - Result> buildingList = govOrgOpenFeignClient.buildingListByIds(buildingIdList); - if (!buildingList.success() || null == buildingList.getData()) { + Result buildingPageList = govOrgOpenFeignClient.buildinglistbyidsPage(buildingIdList,pageNo,pageSize); + if (!buildingPageList.success() || null == buildingPageList.getData()) { throw new RenException("楼宇信息查询失败,buildingList="+ JSON.toJSONString(buildingIdList)); } - List buildingResultDTOList = buildingList.getData(); - + BuildingResultPagedDTO pageData = buildingPageList.getData(); + List buildingResultDTOList = pageData.getList(); List result = ConvertUtils.sourceToTarget(buildingResultDTOList,IcStatsResiWarnUserResultDTO.class); + Map mapResult = new HashMap<>(); + mapResult.put("total",pageData.getTotal()); + mapResult.put("list",result); if(CollectionUtils.isEmpty(result)){ - return new ArrayList<>(); + return mapResult; } //获取configId预警配置信息 IcResiCategoryWarnConfigDTO formDto = new IcResiCategoryWarnConfigDTO(); @@ -143,13 +163,16 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { List> buildingIds = maps.stream().filter(map -> item.getBuildingId().equals(map.get("buildingId"))).collect(Collectors.toList()); item.setResidentNames(CollectionUtils.isEmpty(buildingIds)?"":buildingIds.get(0).get("residentNames")); }); - return result; + + return mapResult; } @Override public List list(String customerId,String id, String level) { //获取所有配置类项 getshow - Result> statsResult = operCustomizeOpenFeignClient.resiCategoryStatsListShowd(); + IcResiCategoryStatsConfigFormDTO dto = new IcResiCategoryStatsConfigFormDTO(); + dto.setStatus("show"); + Result> statsResult = operCustomizeOpenFeignClient.resiCategoryStatsListShowd(dto); if (!statsResult.success() || null == statsResult.getData()) { throw new RenException("获取配置类项失败"); } From c1f78bc3947864912114c2ad45888f0f796d8dd5 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 15:45:49 +0800 Subject: [PATCH 212/253] =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 14 +++ .../java/com/epmet/feign/OssFeignClient.java | 11 +- .../fallback/OssFeignClientFallback.java | 6 +- .../cloud/AbstractCloudStorageService.java | 16 ++- .../cloud/AliyunCloudStorageService.java | 9 ++ .../cloud/FastDFSCloudStorageService.java | 24 ++++ .../epmet/cloud/LocalCloudStorageService.java | 24 ++++ .../cloud/QcloudCloudStorageService.java | 24 ++++ .../epmet/cloud/QiniuCloudStorageService.java | 24 ++++ .../com/epmet/controller/OssController.java | 5 + .../java/com/epmet/service/OssService.java | 7 ++ .../epmet/service/impl/OssServiceImpl.java | 18 +++ epmet-user/epmet-user-server/pom.xml | 6 + .../controller/IcResiUserController.java | 108 +++++++++++++++--- 14 files changed, 275 insertions(+), 21 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 1b6b1b15ef..a24aa8ee82 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -604,7 +604,21 @@ public class RedisKeys { return rootPrefix.concat("icform:").concat(formCode).concat(":items:").concat(customerId); } + /** + * desc:导出居民信息时 临时存储居民信息 便于其他sheet复用信息 + * @param resiId + * @return + */ public static String getExportResiBaseInfoKey(String resiId) { return rootPrefix.concat("resi:").concat("export").concat(":temp:").concat(resiId); } + + /** + * desc:获取客户的居民下载模版是否变更的key 1表示变更 0没有变更 + * @param customerId + * @return + */ + public static String getResiTempChangedKey(String customerId) { + return rootPrefix.concat("resi:").concat("export").concat(":template:changed").concat(customerId); + } } diff --git a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java index b5c31ef82f..db8cda16cf 100644 --- a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java +++ b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java @@ -11,13 +11,13 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.result.UploadImgResultDTO; -import com.epmet.feign.fallback.OssFeignClientFallback; import com.epmet.feign.fallback.OssFeignClientFallbackFactory; import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; @@ -55,6 +55,15 @@ public interface OssFeignClient { @PostMapping(value ="oss/file/uploadqrcodeV2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) Result uploadQrCodeV2(@RequestPart(value = "file") MultipartFile file, @RequestParam("customerId") String customerId); + /** + * desc:通过文件路径获取文件地址 + * @param filePath 文件路径 eg:epmet + * @param privacy 内部 外部 + * @return + */ + @GetMapping(value = "oss/file/getOssFileUrl") + Result getOssFileUrl(@RequestParam String filePath, @RequestParam String privacy); + //@Configuration class MultipartSupportConfig { diff --git a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java index b60e59cc19..e55182a73f 100644 --- a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java +++ b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java @@ -13,7 +13,6 @@ import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.feign.OssFeignClient; -import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; /** @@ -40,4 +39,9 @@ public class OssFeignClientFallback implements OssFeignClient { return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "uploadQrCodeV2", file, customerId); } + @Override + public Result getOssFileUrl(String filePath, String privacy) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "download", filePath,privacy); + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java index 74a38551d0..99b79d233a 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java @@ -25,17 +25,23 @@ import java.util.UUID; public abstract class AbstractCloudStorageService { /** 云存储配置信息 */ CloudStorageConfig config; + /** * desc: 获取oss域名 * * @param privacy * @return java.lang.String - * @author LiuJanJun - * @date 2021/3/30 10:05 上午 + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + public abstract String getOssDomain(String privacy); + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 */ - public String getOssDomain(String privacy){ - return null; - }; + public abstract String getOssPrefix(String privacy); /** * 文件路径 * @param prefix 前缀 diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java index c1865d8234..7c8cd5d668 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java @@ -90,6 +90,15 @@ public class AliyunCloudStorageService extends AbstractCloudStorageService { } } + @Override + public String getOssPrefix(String privacy) { + if (PrivacyType.INTERNAL.equalsIgnoreCase(privacy)) { + return config.getAliyun().getInternal().getAliyunPrefix(); + } else { + return config.getAliyun().getExternal().getAliyunPrefix(); + } + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java index 08a591e86d..a2290ec7f1 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java @@ -34,6 +34,30 @@ public class FastDFSCloudStorageService extends AbstractCloudStorageService { this.config = config; } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getFastdfsDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return null; + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java index 7317bbd780..1659386ab9 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java @@ -28,6 +28,30 @@ public class LocalCloudStorageService extends AbstractCloudStorageService { this.config = config; } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getLocalDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return config.getLocalPrefix(); + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java index 5d657ba318..7c289e63ac 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java @@ -47,6 +47,30 @@ public class QcloudCloudStorageService extends AbstractCloudStorageService { clientConfig = new ClientConfig(new Region(config.getQcloudRegion())); } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getQcloudDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return config.getQcloudPrefix(); + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java index 2fe73cddeb..a4aa05ecda 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java @@ -44,6 +44,30 @@ public class QiniuCloudStorageService extends AbstractCloudStorageService { } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getQiniuDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return config.getQiniuPrefix(); + } + @Override public String upload(byte[] data, String path, String privacyType) { try { diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java index 47be7d427a..2c65bcea65 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java @@ -423,4 +423,9 @@ public class OssController { return ossService.uploadImgV2(file, PrivacyType.EXTERNAL, customerId); } + @GetMapping("getOssFileUrl") + public Result download(@RequestParam(required = false) String filePath,@RequestParam(required = false) String privacy){ + return new Result().ok(ossService.getOssFileUrl(filePath,privacy)); + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java index 04c15973fe..ae9625ee66 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java @@ -53,4 +53,11 @@ public interface OssService extends BaseService { * @author sun */ Result uploadImgV2(MultipartFile file, String privacy, String customerId); + + /** + * desc:通过文件路径获取下载 全路径 不传文件路径则为服务域名 + * @param filePath + * @return + */ + String getOssFileUrl(String filePath,String privacy); } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java index 0805fd43c9..fc209d3535 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java @@ -36,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.File; import java.io.IOException; import java.util.Map; @@ -242,5 +243,22 @@ public class OssServiceImpl extends BaseServiceImpl implement return new Result().ok(dto); } + @Override + public String getOssFileUrl(String filePath,String privacy) { + if (StringUtils.isBlank(filePath)){ + filePath = StrConstant.EPMETY_STR; + } + AbstractCloudStorageService storageService = OssFactory.build(); + String ossDomain = storageService.getOssDomain(privacy); + String ossPrefix = storageService.getOssPrefix(privacy); + if (StringUtils.isBlank(ossDomain)){ + throw new RenException("oss配置错误"); + } + if (StringUtils.isBlank(ossPrefix)){ + ossPrefix = StrConstant.EPMETY_STR; + } + return ossDomain.concat(File.separator).concat(ossPrefix).concat(File.separator).concat(filePath); + } + } diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index dcd727ce13..08b20aeaa5 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -148,6 +148,12 @@ 2.0.0 compile + + com.epmet + epmet-oss-client + 2.0.0 + compile + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 2c5336d0f7..7c6b673934 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -34,9 +34,12 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.IcResiUserDTO; @@ -44,9 +47,11 @@ import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.enums.IcResiUserTableEnums; import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.feign.OssFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -57,10 +62,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; @@ -81,7 +83,21 @@ import java.util.concurrent.atomic.AtomicInteger; public class IcResiUserController { private static final String BASE_TABLE_NAME = "ic_resi_user"; + /** + * 居民上传临时目录 + */ private Path IC_RESI_UPLOAD_DIR; + /** + * 居民下载模版临时目录 + */ + private String OSS_TEMP_RESI_TEMP_DIR = "file-temp/resi-temp/"; + /** + * 本地模版缓存目录 + */ + private Path IC_RESI_DOWNLOAD_DIR; + + @Autowired + private OssFeignClient ossFeignClient; @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @@ -89,6 +105,8 @@ public class IcResiUserController { private IcResiUserService icResiUserService; @Autowired private IcResiUserImportService icResiUserImportService; + @Autowired + private RedisUtils redisUtils; { // 初始化上传目录 @@ -101,7 +119,15 @@ public class IcResiUserController { log.error("创建数字赋能平台上传目录失败"); } } - IC_RESI_UPLOAD_DIR = importDir; + Path exportDir = Paths.get(home, "epmet_files", "ic_user_export"); + if (Files.notExists(exportDir)) { + try { + Files.createDirectories(exportDir); + } catch (IOException e) { + log.error("创建数字赋能平台下载目录失败"); + } + } + IC_RESI_DOWNLOAD_DIR = exportDir; } @PostMapping("delete") @@ -248,11 +274,10 @@ public class IcResiUserController { /*List resiFormAllItems = getResiFormAllItems(pageFormDTO.getCustomerId()); resiFormAllItems.stream().collect(Collectors.groupingBy(e ->e.get));*/ - //读取模版 - String templatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; - InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); - String fileName = "居民基本信息.xlsx"; - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); + //获取模版文件 + File file = getExportTemplateFile(customerId); + ExcelWriter excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); IcResiUserTableEnums tableEnums = IcResiUserTableEnums.getObjectByTableName(BASE_TABLE_NAME); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); @@ -269,8 +294,6 @@ public class IcResiUserController { if (resiMainTableMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(BASE_TABLE_NAME); } - - System.out.println("===resiMainTableMap===" + " " + JSON.toJSONString(resiMainTableMap.values())); //写入数据 excelWriter.fill(new FillWrapper("t1", resiMainTableMap.values()), fillConfig, fistSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + 1); @@ -301,9 +324,8 @@ public class IcResiUserController { if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); } - System.out.println("===resiChildMap===" + tableName + " " + JSON.toJSONString(resiChildMap.values())); tableEnums = IcResiUserTableEnums.getObjectByTableName(tableName); - if (tableEnums == null){ + if (tableEnums == null) { continue; } //构建新的sheet @@ -323,6 +345,64 @@ public class IcResiUserController { excelWriter.finish(); } + /** + * desc:根据客户id 下载模版文件 如果不存在则返回null + * + * @param customerId + * @return + */ + private File getExportTemplateFile(String customerId) throws Exception{ + String fileType = ".xlsx"; + String fileName = customerId + fileType; + File file = new File(IC_RESI_DOWNLOAD_DIR.resolve(fileName).toString()); + String isChanged = redisUtils.getString(RedisKeys.getResiTempChangedKey(customerId)); + //如果 本地文件不存在 或者已经变动 则重新下载 + if (!file.exists() || NumConstant.ONE_STR.equals(isChanged)) { + if (file.exists()) { + file.delete(); + } + String ossFilePath = OSS_TEMP_RESI_TEMP_DIR + fileName; + Result fileUrlResult = ossFeignClient.getOssFileUrl(ossFilePath, null); + Result result = HttpClientManager.getInstance().getDownloadFilebytes(fileUrlResult.getData(), null); + //获取模版失败 则把默认文件写入 + if (result == null || !result.success()) { + log.warn("获取居民导出模版失败,path:{},走默认模版", ossFilePath); + String defaultTemplatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(defaultTemplatePath); + FileUtils.copyInputStreamToFile(resourceAsStream,file); + log.warn("getExportTemplateFile copy default file to template,customerId:{}",customerId); + } else { + log.warn("getExportTemplateFile reload file form oss default file to template,customerId:{}",customerId); + FileUtils.writeByteArrayToFile(file,result.getData()); + } + redisUtils.setString(RedisKeys.getResiTempChangedKey(customerId), NumConstant.ZERO_STR); + return file; + } + return file; + } + + public static void main(String[] args) { + String home = System.getProperty("user.home"); + Path exportDir = Paths.get(home, "epmet_files", "ic_user_export"); + if (Files.notExists(exportDir)) { + try { + Files.createDirectories(exportDir); + } catch (IOException e) { + log.error("创建数字赋能平台下载目录失败"); + } + } + Path IC_RESI_DOWNLOAD_DIR = exportDir; + + + String fileType = ".xlsx"; + String fileName = "customerId" + fileType; + File file = new File(IC_RESI_DOWNLOAD_DIR.resolve(fileName).toString()); + System.out.println("file路径:" + file); + System.out.println(file.exists()); + + + } + @NotNull private Map> buildItemMap(CustomerFormResultDTO resiFormItems) { Map> otherSheetItems = new HashMap<>(); From 6db502640221e8ef64a36dc10ebdfd8491348e50 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 15:58:17 +0800 Subject: [PATCH 213/253] =?UTF-8?q?=E4=B8=80=E6=AC=A1=E6=9F=A5=E8=AF=A2200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcResiUserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 7c6b673934..1e01c08cfa 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -282,7 +282,7 @@ public class IcResiUserController { IcResiUserTableEnums tableEnums = IcResiUserTableEnums.getObjectByTableName(BASE_TABLE_NAME); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); - pageFormDTO.setPageSize(4); + pageFormDTO.setPageSize(NumConstant.TWO_HUNDRED); pageFormDTO.setPageNo(NumConstant.ONE); //子表是否停止查询 Set stopSearchSet = new HashSet<>(); From 8ed5524ae9b2f3cfbfdfe30905e5d7f3c58d5336 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 15:58:32 +0800 Subject: [PATCH 214/253] =?UTF-8?q?=E4=B8=80=E6=AC=A1=E6=9F=A5=E8=AF=A2500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcResiUserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 1e01c08cfa..00b7cbc4cd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -282,7 +282,7 @@ public class IcResiUserController { IcResiUserTableEnums tableEnums = IcResiUserTableEnums.getObjectByTableName(BASE_TABLE_NAME); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); - pageFormDTO.setPageSize(NumConstant.TWO_HUNDRED); + pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); pageFormDTO.setPageNo(NumConstant.ONE); //子表是否停止查询 Set stopSearchSet = new HashSet<>(); From b2af5948e4528f6e26da77e8df17a2ff38670eb2 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 16:33:08 +0800 Subject: [PATCH 215/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 00b7cbc4cd..caa400a336 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -90,7 +90,7 @@ public class IcResiUserController { /** * 居民下载模版临时目录 */ - private String OSS_TEMP_RESI_TEMP_DIR = "file-temp/resi-temp/"; + private String OSS_TEMP_RESI_TEMP_DIR = "file-template/resi-template/"; /** * 本地模版缓存目录 */ @@ -381,28 +381,6 @@ public class IcResiUserController { return file; } - public static void main(String[] args) { - String home = System.getProperty("user.home"); - Path exportDir = Paths.get(home, "epmet_files", "ic_user_export"); - if (Files.notExists(exportDir)) { - try { - Files.createDirectories(exportDir); - } catch (IOException e) { - log.error("创建数字赋能平台下载目录失败"); - } - } - Path IC_RESI_DOWNLOAD_DIR = exportDir; - - - String fileType = ".xlsx"; - String fileName = "customerId" + fileType; - File file = new File(IC_RESI_DOWNLOAD_DIR.resolve(fileName).toString()); - System.out.println("file路径:" + file); - System.out.println(file.exists()); - - - } - @NotNull private Map> buildItemMap(CustomerFormResultDTO resiFormItems) { Map> otherSheetItems = new HashMap<>(); From f244d64d78e757d9848dfe9079a346f7bf942fc5 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 17:00:56 +0800 Subject: [PATCH 216/253] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=A4=9A=E5=AE=9E?= =?UTF-8?q?=E4=BE=8Bbug=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/IcResiUserController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index caa400a336..a6263f508f 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -40,6 +40,7 @@ import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.HttpClientManager; +import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.IcResiUserDTO; @@ -355,9 +356,10 @@ public class IcResiUserController { String fileType = ".xlsx"; String fileName = customerId + fileType; File file = new File(IC_RESI_DOWNLOAD_DIR.resolve(fileName).toString()); - String isChanged = redisUtils.getString(RedisKeys.getResiTempChangedKey(customerId)); - //如果 本地文件不存在 或者已经变动 则重新下载 - if (!file.exists() || NumConstant.ONE_STR.equals(isChanged)) { + String serverIp = IpUtils.getServerIp(); + Object isChanged = redisUtils.hGet(RedisKeys.getResiTempChangedKey(customerId), serverIp); + //如果 redis 不存在这个机器的key 或者值为1 则重新下载 + if (isChanged == null || NumConstant.ONE_STR.equals(isChanged.toString())) { if (file.exists()) { file.delete(); } @@ -375,7 +377,7 @@ public class IcResiUserController { log.warn("getExportTemplateFile reload file form oss default file to template,customerId:{}",customerId); FileUtils.writeByteArrayToFile(file,result.getData()); } - redisUtils.setString(RedisKeys.getResiTempChangedKey(customerId), NumConstant.ZERO_STR); + redisUtils.hSet(RedisKeys.getResiTempChangedKey(customerId), serverIp, NumConstant.ZERO_STR); return file; } return file; From 80f02934507e44051e6e928ff35849e32b66c0b4 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 17 Nov 2021 17:08:52 +0800 Subject: [PATCH 217/253] =?UTF-8?q?=E4=B9=9D=E5=B0=8F=E5=9C=BA=E6=89=80?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=8F=82=EF=BC=9B?= =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF=E5=8F=98=E5=8A=A8=E8=A7=A6?= =?UTF-8?q?=E5=8F=91mq=E6=8E=A5=E5=85=A5=E9=A2=84=E8=AD=A6=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E9=87=8D=E6=96=B0=E8=AE=A1=E7=AE=97=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/SysDictDataServiceImpl.java | 1 + .../com/epmet/commons/tools/dto/result/OptionResultDTO.java | 1 + .../java/com/epmet/mq/listener/ICWarnStatsEventListener.java | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java index e1c5e266f3..aa62b9b624 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java @@ -107,6 +107,7 @@ public class SysDictDataServiceImpl extends BaseServiceImpl children; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java index 905f804351..c7462dbc07 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java @@ -9,6 +9,7 @@ import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.service.StatsResiWarnService; import org.apache.commons.lang.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; @@ -65,9 +66,8 @@ public class ICWarnStatsEventListener implements MessageListenerConcurrently { distributedLock = SpringContextUtils.getBean(DistributedLock.class); lock = distributedLock.getLock(String.format("lock:ic_warn_stats:%s", obj.getCustomerId()), 30L, 30L, TimeUnit.SECONDS); - System.out.println("嘻嘻哈哈哈乐乐呵呵-----------"); //待执行方法 - //SpringContextUtils.getBean(BaseGridInfoService.class).getAgencyBaseInfo(obj); + SpringContextUtils.getBean(StatsResiWarnService.class).resiWarnByOne(obj.getCustomerId(), obj.getIcResiUser()); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-客户居民信息变动MQ失败:".concat(ExceptionUtils.getErrorStackTrace(e))); From 5b3d586afb62ff00137e79546ba981cccc193d99 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 18:14:35 +0800 Subject: [PATCH 218/253] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E9=A1=B9=E7=9B=B4=E6=8E=A5=E4=BB=8E=E5=8F=82=E6=95=B0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=AE=A2=E6=88=B7id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/controller/IcFormController.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java index f6f52d00c2..dee3afb8ec 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/IcFormController.java @@ -180,16 +180,15 @@ public class IcFormController { /** * @description item列表 * - * @param tokenDto * @param formDto * @return * @author wxz * @date 2021.10.28 15:19:59 */ @PostMapping("items") - public Result> listItems(@LoginUser TokenDto tokenDto, @RequestBody CustomerFormQueryDTO formDto) { + public Result> listItems(@RequestBody CustomerFormQueryDTO formDto) { ValidatorUtils.validateEntity(formDto, CustomerFormQueryDTO.GetFormInfoGroup.class); - List rst = icFormService.listItems(tokenDto.getCustomerId(), formDto.getFormCode()); + List rst = icFormService.listItems(formDto.getCustomerId(), formDto.getFormCode()); return new Result>().ok(rst); } } From 4a52bf11c8eb0f1c26015486edf7fa16eb82e37c Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 17 Nov 2021 18:46:12 +0800 Subject: [PATCH 219/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B41?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/security/user/LoginUserUtil.java | 13 --- .../service/impl/ResiGroupServiceImpl.java | 2 +- .../controller/IcResiUserController.java | 94 ++++++++++++++----- ...bleEnums.java => IcResiUserTableEnum.java} | 15 ++- .../service/IcResiUserImportService.java | 6 +- .../com/epmet/service/IcResiUserService.java | 9 ++ .../impl/IcResiUserImportServiceImpl.java | 73 +++++--------- .../service/impl/IcResiUserServiceImpl.java | 26 ++++- 8 files changed, 143 insertions(+), 95 deletions(-) rename epmet-user/epmet-user-server/src/main/java/com/epmet/enums/{IcResiUserTableEnums.java => IcResiUserTableEnum.java} (90%) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java index bb5e6f7b5d..70307f6551 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java @@ -6,7 +6,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; -import java.util.Enumeration; import java.util.List; /** @@ -35,18 +34,6 @@ public class LoginUserUtil { return userId; } - /** - * 查询登录用户的客户Id - * @return - */ - public String getCurrentCustomerId() { - HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); - if (request == null) { - return null; - } - return request.getHeader(AppClientConstant.CUSTOMER_ID); - } - /** * 登录用户的App头信息 * @return diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java index ee2f844d04..0b6ecd84b0 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java @@ -380,7 +380,7 @@ public class ResiGroupServiceImpl extends BaseServiceImpl getGroupLeaderUserInfo(String groupId) { - String customerId = loginUserUtil.getCurrentCustomerId(); + String customerId = loginUserUtil.getLoginUserCustomerId(); //群主名称需要调用feign查询 // ResiGroupEntity resiGroupEntity = baseDao.selectById(groupId); // if (null == resiGroupEntity) { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index a6263f508f..073df83da5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -46,7 +46,7 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; -import com.epmet.enums.IcResiUserTableEnums; +import com.epmet.enums.IcResiUserTableEnum; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.feign.OssFeignClient; import com.epmet.service.IcResiUserImportService; @@ -70,6 +70,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** @@ -83,6 +84,8 @@ import java.util.concurrent.atomic.AtomicInteger; @RequestMapping("icresiuser") public class IcResiUserController { private static final String BASE_TABLE_NAME = "ic_resi_user"; + //todo 枚举吧 + private static final String IC_RESI_FORM_CODE = "resi_base_info"; /** * 居民上传临时目录 @@ -257,8 +260,8 @@ public class IcResiUserController { workbook.write(getOutputStream("居民基本信息.xls", response)); } - @RequestMapping(value = "/exportExcel") - public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + @RequestMapping(value = "/exportExcel3") + public void exportExcelByEasyExcel3(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); String staffOrgPath = null; @@ -280,7 +283,7 @@ public class IcResiUserController { ExcelWriter excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); - IcResiUserTableEnums tableEnums = IcResiUserTableEnums.getObjectByTableName(BASE_TABLE_NAME); + IcResiUserTableEnum tableEnums = IcResiUserTableEnum.getObjectByTableName(BASE_TABLE_NAME); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); @@ -325,7 +328,7 @@ public class IcResiUserController { if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); } - tableEnums = IcResiUserTableEnums.getObjectByTableName(tableName); + tableEnums = IcResiUserTableEnum.getObjectByTableName(tableName); if (tableEnums == null) { continue; } @@ -346,6 +349,68 @@ public class IcResiUserController { excelWriter.finish(); } + @RequestMapping(value = "/exportExcel") + public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { + //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); + CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); + String staffOrgPath = null; + if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { + staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); + } else { + staffOrgPath = staffInfoCacheResult.getAgencyId(); + } + pageFormDTO.setCustomerId(customerId); + pageFormDTO.setPageFlag(false); + + List resiFormAllItems = icResiUserService.listFormItems(customerId, IC_RESI_FORM_CODE); + Map> otherSheetItems = resiFormAllItems.stream() + .collect(Collectors.groupingBy(FormItemResult::getTableName, Collectors.toMap(FormItemResult::getColumnName, o -> o))); + + //获取模版文件 + File file = getExportTemplateFile(customerId); + ExcelWriter excelWriter = null; + try { + excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); + + pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); + pageFormDTO.setPageNo(NumConstant.ONE); + //子表是否停止查询 + Set stopSearchSet = new HashSet<>(); + Map childTableWriteSheetMap = new HashMap<>(); + + //表数据写入 + //通过枚举获取相关表并按照sheetNo排序 + List resiTableList = Arrays.stream(IcResiUserTableEnum.values()).sorted(Comparator.comparing(IcResiUserTableEnum::getSheetNo)).collect(Collectors.toList()); + for (IcResiUserTableEnum tableEnum : resiTableList) { + String tableName = tableEnum.getTableName(); + pageFormDTO.setPageNo(NumConstant.ONE); + //循环一次 写入每个sheet + do { + Map itemMap1 = otherSheetItems.get(tableName); + Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + //如果 返回的条数小于每页显示的数 则退出查询 + if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { + stopSearchSet.add(tableName); + } + //构建新的sheet + WriteSheet childWriteSheet = childTableWriteSheetMap.getOrDefault(tableName,EasyExcel.writerSheet(tableEnum.getSheetNo()).build()); + childTableWriteSheetMap.put(tableName, childWriteSheet); + //写入数据 + excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiChildMap.values()), childWriteSheet); + pageFormDTO.setPageNo(pageFormDTO.getPageNo() + NumConstant.ONE); + //重置数据 + resiChildMap.clear(); + //如果包含则说明子表的数据 已经查询完毕 无需再继续查询了 + } while (!stopSearchSet.contains(tableName)); + } + + } finally { + if (excelWriter != null){ + excelWriter.finish(); + } + } + } + /** * desc:根据客户id 下载模版文件 如果不存在则返回null * @@ -450,7 +515,7 @@ public class IcResiUserController { */ @NoRepeatSubmit @PostMapping("importExcel") - public void importExcelByEasyExcel(@RequestPart("file") MultipartFile file, HttpServletResponse response) { + public void importExcelByEasyExcel(@RequestHeader("customerId") String customerId,@RequestPart("file") MultipartFile file, HttpServletResponse response) { if (file.isEmpty()) { throw new RenException("请上传文件"); } @@ -467,7 +532,8 @@ public class IcResiUserController { savePath = IC_RESI_UPLOAD_DIR.resolve(fileName); IOUtils.copy(file.getInputStream(), new FileOutputStream(savePath.toString())); - icResiUserImportService.importIcResiInfoFromExcel(savePath.toString(), response); + List formItemList = icResiUserService.listFormItems(customerId,IC_RESI_FORM_CODE); + icResiUserImportService.importIcResiInfoFromExcel(formItemList, savePath.toString(), response); } catch (IOException e) { String errorMsg = ExceptionUtils.getErrorStackTrace(e); log.error("【导入居民信息失败】导入失败:{}", errorMsg); @@ -525,20 +591,6 @@ public class IcResiUserController { if (resultForm == null || !resultForm.success() || resultForm.getData() == null) { throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); } - System.out.println(JSON.toJSONString(resultForm.getData())); - return resultForm.getData(); - } - - @NotNull - private List getResiFormAllItems(String customerId) { - CustomerFormQueryDTO queryDTO = new CustomerFormQueryDTO(); - queryDTO.setFormCode("resi_base_info"); - queryDTO.setCustomerId(customerId); - Result> resultForm = operCustomizeOpenFeignClient.listItems(queryDTO); - if (resultForm == null || !resultForm.success() || resultForm.getData() == null) { - throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); - } - System.out.println(JSON.toJSONString(resultForm.getData())); return resultForm.getData(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java similarity index 90% rename from epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java rename to epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java index c03d5649c3..eb4ecd977e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnums.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java @@ -1,7 +1,6 @@ package com.epmet.enums; import lombok.AllArgsConstructor; -import lombok.Data; /** * @Description 描述 @@ -10,7 +9,7 @@ import lombok.Data; * @Version 1.0 */ @AllArgsConstructor -public enum IcResiUserTableEnums { +public enum IcResiUserTableEnum { IC_RESI_USER("ic_resi_user","社区居民基本信息录入表", 0, 3, null), IC_PARTY_MEMBER("ic_party_member","党员信息录入表", 1, 2, "IS_PARTY"), @@ -21,24 +20,24 @@ public enum IcResiUserTableEnums { IC_VOLUNTEER("ic_volunteer","志愿者信息录入表", 6, 3, "IS_VOLUNTEER"), IC_OLD_PEOPLE("ic_old_people","老年人信息录入表", 7, 2, "IS_OLD_PEOPLE"), IC_SPECIAL("ic_special","特殊人群信息录入表", 8, 3, "IS_SPECIAL"); - + private String tableName; private String tableComment; private int sheetNo; private int headRowNo; private String mainTableFlagColumnName; - public static IcResiUserTableEnums getObjectByTableName(String tableName) { - for (IcResiUserTableEnums i : IcResiUserTableEnums.values()) { + public static IcResiUserTableEnum getObjectByTableName(String tableName) { + for (IcResiUserTableEnum i : IcResiUserTableEnum.values()) { if (i.tableName.equals(tableName)) { return i; } } return null; } - - - + + + public String getTableName() { return tableName; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java index ba4d0c9458..7f3d0bdca0 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java @@ -1,7 +1,9 @@ package com.epmet.service; +import com.epmet.dto.result.FormItemResult; + import javax.servlet.http.HttpServletResponse; -import java.io.IOException; +import java.util.List; /** *@Description 居民信息导入service @@ -10,5 +12,5 @@ import java.io.IOException; */ public interface IcResiUserImportService { - void importIcResiInfoFromExcel(String excelPathName, HttpServletResponse response); + void importIcResiInfoFromExcel(List formItemList, String excelPathName, HttpServletResponse response); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 45ff713e63..d18d47d1b3 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -129,4 +129,13 @@ public interface IcResiUserService extends BaseService { * @Date 2021/11/5 14:40 */ Map> getHomeUserCategoryCount(String buildId); + + /** + * desc:根据formCode 获取标单项 + * + * @param customerId + * @param formCode + * @return + */ + List listFormItems(String customerId, String formCode); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index eeaa8c03e7..12931809a9 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -13,23 +13,20 @@ import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.security.user.LoginUserUtil; -import com.epmet.commons.tools.utils.Result; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.*; import com.epmet.dto.form.AgencyIdFormDTO; -import com.epmet.dto.form.CustomerFormQueryDTO; import com.epmet.dto.form.HouseFormDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; import com.epmet.dto.result.FormItemResult; import com.epmet.dto.result.LoginUserDetailsResultDTO; import com.epmet.dto.result.OptionDTO; import com.epmet.entity.IcResiUserEntity; -import com.epmet.enums.IcResiUserTableEnums; +import com.epmet.enums.IcResiUserTableEnum; import com.epmet.excel.handler.DynamicEasyExcelListener; import com.epmet.feign.EpmetAdminOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; -import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.service.IcResiUserImportService; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -61,9 +58,6 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res public static final ThreadLocal>> errorRows = new ThreadLocal<>(); public static final ThreadLocal>> skipedRows = new ThreadLocal<>(); - // 导入数字赋能平台居民信息form_code - public static final String IMPORT_IC_RESI_FORM_CODE = "resi_base_info"; - @Autowired private LoginUserUtil loginUserUtil; @@ -76,9 +70,6 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res @Autowired private GovOrgOpenFeignClient govOrgOpenFeignClient; - @Autowired - private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; - @Autowired private IcResiUserDao icResiUserDao; @@ -164,7 +155,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @return */ @Override - public void importIcResiInfoFromExcel(String excelPathName, HttpServletResponse response) { + public void importIcResiInfoFromExcel(List formItemList, String excelPathName, HttpServletResponse response) { String loginUserId = loginUserUtil.getLoginUserId(); String loginUserApp = loginUserUtil.getLoginUserApp(); String loginUserClient = loginUserUtil.getLoginUserClient(); @@ -185,17 +176,17 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res initThreadLocalRowsStorage(); // 上传主表信息 - importIcResiBaseInfoFromExcel(excelPathName, IcResiUserTableEnums.IC_RESI_USER.getSheetNo(), IcResiUserTableEnums.IC_RESI_USER.getHeadRowNo(), - currUserAgencyId, agencyInfo.getPids(), loginUserId, IcResiUserTableEnums.IC_RESI_USER.getTableName()); + importIcResiBaseInfoFromExcel(formItemList,excelPathName, IcResiUserTableEnum.IC_RESI_USER.getSheetNo(), IcResiUserTableEnum.IC_RESI_USER.getHeadRowNo(), + currUserAgencyId, agencyInfo.getPids(), loginUserId, IcResiUserTableEnum.IC_RESI_USER.getTableName()); // 上传附表信息 - for (IcResiUserTableEnums sheet : IcResiUserTableEnums.values()) { - if (sheet == IcResiUserTableEnums.IC_RESI_USER) { + for (IcResiUserTableEnum sheet : IcResiUserTableEnum.values()) { + if (sheet == IcResiUserTableEnum.IC_RESI_USER) { continue; } try { - importIcResiExtraInfoFromExcel(excelPathName, sheet.getSheetNo(), sheet.getHeadRowNo(), currUserAgencyId, loginUserId, sheet.getTableName(), customerId); + importIcResiExtraInfoFromExcel(formItemList, excelPathName, sheet.getSheetNo(), sheet.getHeadRowNo(), currUserAgencyId, loginUserId, sheet.getTableName(), customerId); } catch (Exception e) { String errorMsg = ExceptionUtils.getErrorStackTrace(e); log.error("导入IC居民附加信息【{}】错误:{}", sheet.getTableComment(), errorMsg); @@ -228,13 +219,13 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res */ private void initThreadLocalRowsStorage() { Map> skipedRowsMap = new LinkedHashMap<>(); - for (IcResiUserTableEnums e : IcResiUserTableEnums.values()) { + for (IcResiUserTableEnum e : IcResiUserTableEnum.values()) { skipedRowsMap.put(e.getTableName(), new LinkedList<>()); } skipedRows.set(skipedRowsMap); Map> errorRowsMap = new LinkedHashMap<>(); - for (IcResiUserTableEnums e : IcResiUserTableEnums.values()) { + for (IcResiUserTableEnum e : IcResiUserTableEnum.values()) { errorRowsMap.put(e.getTableName(), new LinkedList<>()); } errorRows.set(errorRowsMap); @@ -242,6 +233,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res /** * excel导入居民基本信息 + * + * @param formItemList * @param sheetNo * @param headRowNumber * @param currUserAgencyId @@ -249,7 +242,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param currentUserId * @return */ - private Object importIcResiBaseInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId, + private Object importIcResiBaseInfoFromExcel(List formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId, String tableName) { DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); //EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); @@ -260,17 +253,14 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Map> headers = mergeHead(headList); - // 查询form相关信息 - List customerItems = listFormItems(IMPORT_IC_RESI_FORM_CODE); - // 清洗表头数据 - Map abandonedHeaders = washHeaders(headers, customerItems); + Map abandonedHeaders = washHeaders(headers, formItemList); //合并多级表头 HashMap> combinedHeaders = combineHeaders(headers); // 得到客户配置item数据 - Map formItemMap = customerItems.stream().collect( + Map formItemMap = formItemList.stream().collect( Collectors.toMap(formItem -> { String groupLabel = formItem.getGroupLabel(); String label = formItem.getLabel(); @@ -291,6 +281,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res /** * excel导入居民附加信息 + * + * @param formItemList * @param excelPathName * @param sheetNo * @param headRowNumber @@ -299,7 +291,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param targetTableName 要插入哪一个表 * @return */ - private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId, + private Object importIcResiExtraInfoFromExcel(List formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currentUserId, String targetTableName, String customerId) { DynamicEasyExcelListener readListener = new DynamicEasyExcelListener(); EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead(); @@ -309,17 +301,14 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Map> headers = mergeHead(headList); - // 查询form相关信息 - List customerItems = listFormItems(IMPORT_IC_RESI_FORM_CODE); - // 清洗表头数据 - Map abandonedHeaders = washHeaders(headers, customerItems); + Map abandonedHeaders = washHeaders(headers, formItemList); //合并多级表头 HashMap> combinedHeaders = combineHeaders(headers); // 得到客户配置item数据 - Map formItemMap = customerItems.stream().collect( + Map formItemMap = formItemList.stream().collect( Collectors.toMap(formItem -> { String groupLabel = formItem.getGroupLabel(); String label = formItem.getLabel(); @@ -364,7 +353,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res columnAndValues.put("AGENCY_ID", currUserAgencyId); columnAndValues.put("PIDS", currUserAgencyPids); - columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getLoginUserCustomerId()); columnAndValues.put("UPDATED_BY", currentUserId); @@ -407,7 +396,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res errorRow.setName(columnAndValues.get("NAME")); errorRow.setErrorInfo(errorMsg); errorRow.setTableName(tableName); - errorRows.get().get(IcResiUserTableEnums.IC_RESI_USER.getTableName()).add(errorRow); + errorRows.get().get(IcResiUserTableEnum.IC_RESI_USER.getTableName()).add(errorRow); } finally { columnAndValues.clear(); } @@ -465,14 +454,14 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res //} columnAndValues.put("IC_RESI_USER", icResiId); - columnAndValues.put("CUSTOMER_ID", loginUserUtil.getCurrentCustomerId()); + columnAndValues.put("CUSTOMER_ID", loginUserUtil.getLoginUserCustomerId()); columnAndValues.put("UPDATED_BY", currentUserId); // 移除excel中存在,但是数据库表中不存在的无效列,方式sql语法错误 columnAndValues = removeNeedlessColumns(columnAndValues); // 更新主表的人员类型及更新时间 - updateMainTableResiTypeFlag(Objects.requireNonNull(IcResiUserTableEnums.getObjectByTableName(targetTableName)), icResiId); + updateMainTableResiTypeFlag(Objects.requireNonNull(IcResiUserTableEnum.getObjectByTableName(targetTableName)), icResiId); // 验证附加信息是否存在 List> subInfos = icResiUserDao.selectSubTableRecords(customerId, icResiId, targetTableName); @@ -597,18 +586,6 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } } - /** - * 根据formCode查询该form的item列表 - * @param formCode - * @return - */ - private List listFormItems(String formCode) { - CustomerFormQueryDTO form = new CustomerFormQueryDTO(); - form.setFormCode(formCode); - Result> result = operCustomizeOpenFeignClient.listItems(form); - return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败"); - } - /** * @description 合并头 * @@ -904,7 +881,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param icResiUserTableEnum * @param resiUserId */ - private void updateMainTableResiTypeFlag(IcResiUserTableEnums icResiUserTableEnum, String resiUserId) { + private void updateMainTableResiTypeFlag(IcResiUserTableEnum icResiUserTableEnum, String resiUserId) { HashMap map = new HashMap<>(); map.put(icResiUserTableEnum.getMainTableFlagColumnName(), true); icResiUserDao.upTable("ic_resi_user", resiUserId, map); @@ -928,7 +905,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res list.addAll(entry.getValue()); } - list.forEach(row -> {row.setSheetName(IcResiUserTableEnums.getObjectByTableName(row.tableName).getTableComment());}); + list.forEach(row -> {row.setSheetName(IcResiUserTableEnum.getObjectByTableName(row.tableName).getTableComment());}); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的列表","导入失败列表(没有数据说明全部成功)"), ErrorRow.class, list); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 9019364f4d..c953563c81 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -24,12 +24,15 @@ import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.rocketmq.messages.IcResiUserAddMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.enums.RelationshipEnum; +import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; @@ -44,7 +47,10 @@ import com.epmet.constant.IcPlatformConstant; import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; -import com.epmet.dto.*; +import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.IcHouseDTO; +import com.epmet.dto.IcNeighborHoodDTO; +import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; @@ -76,7 +82,7 @@ import java.util.stream.Collectors; */ @Slf4j @Service -public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService { +public class IcResiUserServiceImpl extends BaseServiceImpl implements IcResiUserService, ResultDataResolver { @Autowired private GovOrgOpenFeignClient govOrgOpenFeignClient; @Autowired @@ -799,4 +805,20 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getHomeUserCategoryCount(String buildId) { return baseDao.getHomeUserCategoryCount(buildId); } + + /** + * 根据formCode查询该form的item列表 + * + * @param customerId + * @param formCode + * @return + */ + @Override + public List listFormItems(String customerId, String formCode) { + CustomerFormQueryDTO form = new CustomerFormQueryDTO(); + form.setFormCode(formCode); + form.setCustomerId(customerId); + Result> result = operCustomizeOpenFeignClient.listItems(form); + return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "查询表单相关信息失败"); + } } From e6316a214da240299a1059c4bfdac5a79cf4a799 Mon Sep 17 00:00:00 2001 From: lzh Date: Wed, 17 Nov 2021 19:32:04 +0800 Subject: [PATCH 220/253] =?UTF-8?q?=E6=9B=B4=E6=94=B9level?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResiCategoryStatsConfigController.java | 4 ++-- .../service/impl/StatsResiWarnServiceImpl.java | 17 ++++++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index a3d72acc37..fdec343adf 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -101,8 +101,8 @@ public class ResiCategoryStatsConfigController { if(null == level2 || level2==0){ return new Result().error(8001,"等级2阈值需大于0"); } - if(level1<=level2){ - return new Result().error(8001,"等级1阈值需大于等级2阈值"); + if(level2<=level1){ + return new Result().error(8001,"等级2阈值需大于等级1阈值"); } } resiCategoryStatsConfigService.update(customerId,formDTO); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java index a9a378cdd0..60d355cbf4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java @@ -102,7 +102,9 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { for (IcStatsResiWarnEntity item : icStatsResiWarnEntityList) { IcStatsResiWarnBuildingResultDTO resiWarnBuildingResultDTO = warnResultMap.get(item.getConfigId()); - + if(null == resiWarnBuildingResultDTO){ + continue; + } //每栋楼的数量 Integer count = Optional.ofNullable(item.getCount()).orElse(0); @@ -114,18 +116,15 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { if(0 == count){ continue; } - if(null!=levle1 && count>levle1){ - resiWarnBuildingResultDTO.setLevelCount1(resiWarnBuildingResultDTO.getLevelCount1()+1); - resiWarnBuildingResultDTO.getBuildingIdList1().add(item.getBuildingId()); - } - if(null!=levle1 && null!=levle2 && count<=levle1 && count>=levle2){ + if(null!=levle2 && count>levle2){ resiWarnBuildingResultDTO.setLevelCount2(resiWarnBuildingResultDTO.getLevelCount2()+1); resiWarnBuildingResultDTO.getBuildingIdList2().add(item.getBuildingId()); } - if(null!=levle2 && null!=levle3 && count<=levle2 && count>=levle3){ - resiWarnBuildingResultDTO.setLevelCount3(resiWarnBuildingResultDTO.getLevelCount3()+1); - resiWarnBuildingResultDTO.getBuildingIdList3().add(item.getBuildingId()); + if(null!=levle1 && null!=levle2 && count<=levle2 && count>=levle1){ + resiWarnBuildingResultDTO.setLevelCount1(resiWarnBuildingResultDTO.getLevelCount1()+1); + resiWarnBuildingResultDTO.getBuildingIdList1().add(item.getBuildingId()); } + } return result; From 23cb79f88ad46f983a48e4fa807646ecff080297 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 18 Nov 2021 09:17:33 +0800 Subject: [PATCH 221/253] =?UTF-8?q?mq=E8=A7=A6=E5=8F=91=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=8F=98=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/mq/listener/ICWarnStatsEventListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java index c7462dbc07..d0ff2a10e9 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java @@ -67,7 +67,7 @@ public class ICWarnStatsEventListener implements MessageListenerConcurrently { lock = distributedLock.getLock(String.format("lock:ic_warn_stats:%s", obj.getCustomerId()), 30L, 30L, TimeUnit.SECONDS); //待执行方法 - SpringContextUtils.getBean(StatsResiWarnService.class).resiWarnByOne(obj.getCustomerId(), obj.getIcResiUser()); + SpringContextUtils.getBean(StatsResiWarnService.class).resiWarn(obj.getCustomerId()); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-客户居民信息变动MQ失败:".concat(ExceptionUtils.getErrorStackTrace(e))); From 25c15b68d7c855b08317c05a2d4ceeaf97eca3b5 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 18 Nov 2021 12:35:06 +0800 Subject: [PATCH 222/253] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=201.ic=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=AF=BC=E5=85=A5=20=E4=B8=8A=E4=BC=A0=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcResiUserController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 073df83da5..0c10ca50ed 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -123,6 +123,8 @@ public class IcResiUserController { log.error("创建数字赋能平台上传目录失败"); } } + IC_RESI_UPLOAD_DIR = importDir; + Path exportDir = Paths.get(home, "epmet_files", "ic_user_export"); if (Files.notExists(exportDir)) { try { From b016bbe6d6ab530d7f2d1e198ee335851a011fb2 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 18 Nov 2021 13:11:26 +0800 Subject: [PATCH 223/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/constant/StrConstant.java | 2 ++ .../controller/IcResiUserController.java | 31 ++++++++++++------- .../service/impl/IcResiUserServiceImpl.java | 2 ++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java index fd4a97d11e..2e1d7d5bea 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java @@ -74,6 +74,8 @@ public interface StrConstant { */ String STAR="*"; + String QUESTION_MARK="?"; + /** * 空字符串 */ diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 0c10ca50ed..08187f54b4 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -29,6 +29,7 @@ import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -357,16 +358,14 @@ public class IcResiUserController { CustomerStaffInfoCacheResult staffInfoCacheResult = CustomerStaffRedis.getStaffInfo(customerId, tokenDto.getUserId()); String staffOrgPath = null; if (StringUtils.isNotBlank(staffInfoCacheResult.getAgencyPIds()) && !NumConstant.ZERO_STR.equals(staffInfoCacheResult.getAgencyPIds())) { - staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(":").concat(staffInfoCacheResult.getAgencyId()); + staffOrgPath = staffInfoCacheResult.getAgencyPIds().concat(StrConstant.COLON).concat(staffInfoCacheResult.getAgencyId()); } else { staffOrgPath = staffInfoCacheResult.getAgencyId(); } pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); - List resiFormAllItems = icResiUserService.listFormItems(customerId, IC_RESI_FORM_CODE); - Map> otherSheetItems = resiFormAllItems.stream() - .collect(Collectors.groupingBy(FormItemResult::getTableName, Collectors.toMap(FormItemResult::getColumnName, o -> o))); + //获取模版文件 File file = getExportTemplateFile(customerId); @@ -378,27 +377,35 @@ public class IcResiUserController { pageFormDTO.setPageNo(NumConstant.ONE); //子表是否停止查询 Set stopSearchSet = new HashSet<>(); - Map childTableWriteSheetMap = new HashMap<>(); + + //获取表单项 + List resiFormAllItems = icResiUserService.listFormItems(customerId, IC_RESI_FORM_CODE); + //每个表对应的 item ;key:表名,value:<字段名:item对象> + Map> tableItemMap = resiFormAllItems.stream() + .collect(Collectors.groupingBy(FormItemResult::getTableName, + Collectors.toMap(o->o.getColumnName().concat(NumConstant.ZERO == o.getColumnNum()? StrConstant.EPMETY_STR:o.getColumnNum().toString()), o -> o))); + Map childTableWriteSheetMap = new HashMap<>(); //表数据写入 //通过枚举获取相关表并按照sheetNo排序 - List resiTableList = Arrays.stream(IcResiUserTableEnum.values()).sorted(Comparator.comparing(IcResiUserTableEnum::getSheetNo)).collect(Collectors.toList()); + List resiTableList = Arrays.stream(IcResiUserTableEnum.values()) + .sorted(Comparator.comparing(IcResiUserTableEnum::getSheetNo)) + .collect(Collectors.toList()); for (IcResiUserTableEnum tableEnum : resiTableList) { String tableName = tableEnum.getTableName(); pageFormDTO.setPageNo(NumConstant.ONE); //循环一次 写入每个sheet do { - Map itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = icResiUserService.getDataForExport(tableItemMap.get(tableName), tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); } - //构建新的sheet - WriteSheet childWriteSheet = childTableWriteSheetMap.getOrDefault(tableName,EasyExcel.writerSheet(tableEnum.getSheetNo()).build()); - childTableWriteSheetMap.put(tableName, childWriteSheet); + //如果没有 构建新的writeSheet + WriteSheet writeSheet = childTableWriteSheetMap.getOrDefault(tableName,EasyExcel.writerSheet(tableEnum.getSheetNo()).build()); + childTableWriteSheetMap.putIfAbsent(tableName, writeSheet); //写入数据 - excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiChildMap.values()), childWriteSheet); + excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiChildMap.values()), writeSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + NumConstant.ONE); //重置数据 resiChildMap.clear(); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index c953563c81..c97cdbabdd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -680,6 +680,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), currentStaffAgencyId); From d8ed0636ad9d053aa6e92ad6e26f96df58294286 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 18 Nov 2021 13:20:17 +0800 Subject: [PATCH 224/253] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=201.ic=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=AF=BC=E5=85=A5=20=E4=BF=AE=E5=A4=8Dgridoption?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E9=80=82=E9=85=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java | 2 +- .../epmet/feign/fallback/GovOrgOpenFeignClientFallback.java | 2 +- .../com/epmet/service/impl/IcResiUserImportServiceImpl.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java index b1cbf680a9..aa044e74fe 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/GovOrgOpenFeignClient.java @@ -463,7 +463,7 @@ public interface GovOrgOpenFeignClient { * @Date 2021/10/26 14:02 */ @PostMapping("/gov/org/customergrid/gridoption") - Result> getGridOption(@RequestBody AgencyIdFormDTO formDTO); + Result> getGridOption(@RequestBody GridOptionFormDTO formDTO); /** * 获取网格下支部小组 diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java index f98fdc2093..8649513937 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/feign/fallback/GovOrgOpenFeignClientFallback.java @@ -276,7 +276,7 @@ public class GovOrgOpenFeignClientFallback implements GovOrgOpenFeignClient { } @Override - public Result> getGridOption(AgencyIdFormDTO formDTO) { + public Result> getGridOption(GridOptionFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.GOV_ORG_SERVER, "getGridOption", formDTO); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 12931809a9..48c0cf7a5b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -16,6 +16,7 @@ import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.*; import com.epmet.dto.form.AgencyIdFormDTO; +import com.epmet.dto.form.GridOptionFormDTO; import com.epmet.dto.form.HouseFormDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; import com.epmet.dto.result.FormItemResult; @@ -790,8 +791,9 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res EpmetErrorCode.SERVER_ERROR.getCode(), null); break; case "/gov/org/customergrid/gridoption": - AgencyIdFormDTO form = new AgencyIdFormDTO(); + GridOptionFormDTO form = new GridOptionFormDTO(); form.setAgencyId(currUserAgencyId); + form.setPurpose("saveorupdate"); options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); break; case "/gov/org/customerpartybranch/branchoption": From 9aa0a913a545ae8e63fd6a252ba6a9ab9deeeac9 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 18 Nov 2021 13:20:19 +0800 Subject: [PATCH 225/253] bug --- .../main/java/com/epmet/controller/IcResiUserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 08187f54b4..8b571dce85 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -433,7 +433,7 @@ public class IcResiUserController { String serverIp = IpUtils.getServerIp(); Object isChanged = redisUtils.hGet(RedisKeys.getResiTempChangedKey(customerId), serverIp); //如果 redis 不存在这个机器的key 或者值为1 则重新下载 - if (isChanged == null || NumConstant.ONE_STR.equals(isChanged.toString())) { + if (!file.exists() || isChanged == null || NumConstant.ONE_STR.equals(isChanged.toString())) { if (file.exists()) { file.delete(); } From 57c279de57b7ea05f2dffa6df0ef300f033ce915 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 18 Nov 2021 13:43:00 +0800 Subject: [PATCH 226/253] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=201.ic=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=AF=BC=E5=85=A5=20=E4=BF=AE=E5=A4=8Dgridoption?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E9=80=82=E9=85=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/IcResiUserImportServiceImpl.java | 6 +++--- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 48c0cf7a5b..909f16b8ad 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -564,7 +564,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } else { // remote类型 - Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId); + Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId, "saveorupdate"); String colValue = options.get(cellContent); columnWrapper.setColValue(colValue); } @@ -765,7 +765,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res * @param fullUri * @return */ - public Map listRemoteOptions(Map columnWrappers, String fullUri, String currUserAgencyId) { + public Map listRemoteOptions(Map columnWrappers, String fullUri, String currUserAgencyId, String purpose) { String pureUri = null; String cascadeItemId = null; ColumnWrapper cascadeItemColumnWrapper = null; @@ -793,7 +793,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res case "/gov/org/customergrid/gridoption": GridOptionFormDTO form = new GridOptionFormDTO(); form.setAgencyId(currUserAgencyId); - form.setPurpose("saveorupdate"); + form.setPurpose(purpose); options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); break; case "/gov/org/customerpartybranch/branchoption": diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index c97cdbabdd..eb62c090af 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -684,7 +684,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), currentStaffAgencyId); + Map stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), currentStaffAgencyId, "query"); if ("checkbox".equals(v.getItemType())) { stringMap.forEach((label, value) -> map.put(value, vauleStr.contains(value) ? "是" : "否")); } else if ("select".equals(v.getItemType())) { From 4c594eb4c203e64040d278053c2f11c665b063d7 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 18 Nov 2021 14:22:10 +0800 Subject: [PATCH 227/253] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E8=A1=A8=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SysDictDataController.java | 10 ++++++++++ .../java/com/epmet/dao/SysDictDataDao.java | 3 +++ .../com/epmet/service/SysDictDataService.java | 8 ++++++++ .../service/impl/SysDictDataServiceImpl.java | 12 +++++++++++ .../main/resources/mapper/SysDictDataDao.xml | 13 ++++++++++++ .../tools/dto/form/DictListFormDTO.java | 20 +++++++++++++++++++ .../tools/dto/result/DictListResultDTO.java | 17 ++++++++++++++++ 7 files changed, 83 insertions(+) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/DictListResultDTO.java diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java index af65d4fd90..18e0437551 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/SysDictDataController.java @@ -8,6 +8,8 @@ package com.epmet.controller; +import com.epmet.commons.tools.dto.form.DictListFormDTO; +import com.epmet.commons.tools.dto.result.DictListResultDTO; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.Result; @@ -139,5 +141,13 @@ public class SysDictDataController { return new Result>().ok(sysDictDataService.getHouseOption()); } + /** + * @Description 字典数据查询通用接口 + * @Author sun + */ + @PostMapping("dictlist") + public Result> dictList(@RequestBody DictListFormDTO formDTO) { + return new Result>().ok(sysDictDataService.dictList(formDTO.getDictType())); + } } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/SysDictDataDao.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/SysDictDataDao.java index 50528f1326..59ee893a89 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/SysDictDataDao.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/SysDictDataDao.java @@ -9,6 +9,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.commons.tools.dto.result.DictListResultDTO; import com.epmet.entity.DictData; import com.epmet.entity.SysDictDataEntity; import org.apache.ibatis.annotations.Mapper; @@ -27,4 +28,6 @@ public interface SysDictDataDao extends BaseDao { * 字典数据列表 */ List getDictDataList(); + + List selectDictList(String dictType); } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java index bcc3bd3953..0d64ee0d8c 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/SysDictDataService.java @@ -9,6 +9,8 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.dto.form.DictListFormDTO; +import com.epmet.commons.tools.dto.result.DictListResultDTO; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.SysDictDataDTO; @@ -77,4 +79,10 @@ public interface SysDictDataService extends BaseService { * @Date 2021/10/26 17:12 */ List getHouseOption(); + + /** + * @Description 字典数据查询通用接口 + * @Author sun + */ + List dictList(String dictType); } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java index aa62b9b624..468fb764c7 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/SysDictDataServiceImpl.java @@ -12,6 +12,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.dto.form.DictListFormDTO; +import com.epmet.commons.tools.dto.result.DictListResultDTO; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; @@ -200,4 +202,14 @@ public class SysDictDataServiceImpl extends BaseServiceImpl dictList(String dictType) { + List resultDTOList = baseDao.selectDictList(dictType); + return resultDTOList; + } + } diff --git a/epmet-admin/epmet-admin-server/src/main/resources/mapper/SysDictDataDao.xml b/epmet-admin/epmet-admin-server/src/main/resources/mapper/SysDictDataDao.xml index b6c79a46bf..3760e0895a 100644 --- a/epmet-admin/epmet-admin-server/src/main/resources/mapper/SysDictDataDao.xml +++ b/epmet-admin/epmet-admin-server/src/main/resources/mapper/SysDictDataDao.xml @@ -7,4 +7,17 @@ select dict_type_id, dict_label, dict_value from sys_dict_data order by dict_type_id, sort + + diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java new file mode 100644 index 0000000000..1880debe42 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java @@ -0,0 +1,20 @@ +package com.epmet.commons.tools.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Description 字典数据查询-接口入参 + * @Author sun + */ +@Data +public class DictListFormDTO { + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + private String dictType; + +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/DictListResultDTO.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/DictListResultDTO.java new file mode 100644 index 0000000000..fe89cf0d24 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/DictListResultDTO.java @@ -0,0 +1,17 @@ +package com.epmet.commons.tools.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description 字典数据查询-接口返参 + * @Author sun + */ +@Data +public class DictListResultDTO implements Serializable { + private static final long serialVersionUID = 8618231166600518980L; + private String label; + private String value; +} From 170e3fc2b63e99cda9f16cb7735cb2f7195b109a Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 18 Nov 2021 15:01:21 +0800 Subject: [PATCH 228/253] =?UTF-8?q?ic=5Fresi=5Fdemand=5Fdict=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=B0heart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/controller/IcResiDemandDictController.java | 0 .../src/main/java/com/epmet/dao/IcResiDemandDictDao.java | 0 .../src/main/java/com/epmet/entity/IcResiDemandDictEntity.java | 0 .../src/main/java/com/epmet/service/IcResiDemandDictService.java | 0 .../java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java | 0 .../src/main/resources/mapper/IcResiDemandDictDao.xml | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {epmet-user/epmet-user-server => epmet-module/epmet-heart/epmet-heart-server}/src/main/java/com/epmet/controller/IcResiDemandDictController.java (100%) rename {epmet-user/epmet-user-server => epmet-module/epmet-heart/epmet-heart-server}/src/main/java/com/epmet/dao/IcResiDemandDictDao.java (100%) rename {epmet-user/epmet-user-server => epmet-module/epmet-heart/epmet-heart-server}/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java (100%) rename {epmet-user/epmet-user-server => epmet-module/epmet-heart/epmet-heart-server}/src/main/java/com/epmet/service/IcResiDemandDictService.java (100%) rename {epmet-user/epmet-user-server => epmet-module/epmet-heart/epmet-heart-server}/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java (100%) rename {epmet-user/epmet-user-server => epmet-module/epmet-heart/epmet-heart-server}/src/main/resources/mapper/IcResiDemandDictDao.xml (100%) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java similarity index 100% rename from epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java rename to epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java similarity index 100% rename from epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java rename to epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java similarity index 100% rename from epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java rename to epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/entity/IcResiDemandDictEntity.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/IcResiDemandDictService.java similarity index 100% rename from epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiDemandDictService.java rename to epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/IcResiDemandDictService.java diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java similarity index 100% rename from epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java rename to epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java diff --git a/epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml b/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/mapper/IcResiDemandDictDao.xml similarity index 100% rename from epmet-user/epmet-user-server/src/main/resources/mapper/IcResiDemandDictDao.xml rename to epmet-module/epmet-heart/epmet-heart-server/src/main/resources/mapper/IcResiDemandDictDao.xml From 0ed47e7c68aa2de0c4ee8f330a9c3579e7c7bfee Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 18 Nov 2021 15:42:36 +0800 Subject: [PATCH 229/253] =?UTF-8?q?ic=5Fresi=5Fdemand=5Fdict=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=B0heart,=E6=9F=A5=E8=AF=A2=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demand/UserDemandNameQueryFormDTO.java | 21 +++++++++++++++++++ .../feign/EpmetHeartOpenFeignClient.java | 5 ++++- .../EpmetHeartOpenFeignClientFallback.java | 7 ++++++- .../IcResiDemandDictController.java | 12 +++++++++++ .../com/epmet/dao/IcResiDemandDictDao.java | 3 +++ .../service/IcResiDemandDictService.java | 8 +++++++ .../impl/IcResiDemandDictServiceImpl.java | 7 +++++++ .../resources/mapper/IcResiDemandDictDao.xml | 16 ++++++++++++++ .../service/impl/IcResiUserServiceImpl.java | 15 +++++++++++-- 9 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/dto/form/demand/UserDemandNameQueryFormDTO.java diff --git a/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/dto/form/demand/UserDemandNameQueryFormDTO.java b/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/dto/form/demand/UserDemandNameQueryFormDTO.java new file mode 100644 index 0000000000..3247482054 --- /dev/null +++ b/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/dto/form/demand/UserDemandNameQueryFormDTO.java @@ -0,0 +1,21 @@ +package com.epmet.dto.form.demand; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; +import java.util.Set; + +@Data +public class UserDemandNameQueryFormDTO implements Serializable { + private static final long serialVersionUID = 1562457999313501989L; + + public interface AddUserInternalGroup {} + + @NotBlank(message = "客户idbu不能为空",groups =AddUserInternalGroup.class) + private String customerId; + + @NotEmpty(message = "分类编码不能为空",groups =AddUserInternalGroup.class) + private Set codeSet; +} diff --git a/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/EpmetHeartOpenFeignClient.java b/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/EpmetHeartOpenFeignClient.java index b9f4424ab3..7a4a6c8ad5 100644 --- a/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/EpmetHeartOpenFeignClient.java +++ b/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/EpmetHeartOpenFeignClient.java @@ -5,7 +5,7 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.ActInfoDTO; import com.epmet.dto.VolunteerInfoDTO; import com.epmet.dto.form.CommonCustomerFormDTO; -import com.epmet.feign.fallback.EpmetHeartOpenFeignClientFallback; +import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.feign.fallback.EpmetHeartOpenFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; @@ -53,4 +53,7 @@ public interface EpmetHeartOpenFeignClient { **/ @PostMapping("/heart/resi/volunteer/queryuservolunteerinfo/{userId}") Result queryUserVolunteerInfo(@PathVariable("userId") String userId); + + @PostMapping("/heart/icresidemanddict/demangnames") + Result queryDemandNames(@RequestBody UserDemandNameQueryFormDTO formDTO); } diff --git a/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/fallback/EpmetHeartOpenFeignClientFallback.java b/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/fallback/EpmetHeartOpenFeignClientFallback.java index 23759f82c0..e0e140b02e 100644 --- a/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/fallback/EpmetHeartOpenFeignClientFallback.java +++ b/epmet-module/epmet-heart/epmet-heart-client/src/main/java/com/epmet/feign/fallback/EpmetHeartOpenFeignClientFallback.java @@ -6,8 +6,8 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.dto.ActInfoDTO; import com.epmet.dto.VolunteerInfoDTO; import com.epmet.dto.form.CommonCustomerFormDTO; +import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.feign.EpmetHeartOpenFeignClient; -import org.springframework.stereotype.Component; import java.util.List; @@ -48,4 +48,9 @@ public class EpmetHeartOpenFeignClientFallback implements EpmetHeartOpenFeignCli public Result queryUserVolunteerInfo(String userId) { return ModuleUtils.feignConError(ServiceConstant.EPMET_HEART_SERVER, "queryUserVolunteerInfo", userId); } + + @Override + public Result queryDemandNames(UserDemandNameQueryFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_HEART_SERVER, "queryDemandNames", formDTO); + } } diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java index c83b41aa4f..13779cfe13 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/controller/IcResiDemandDictController.java @@ -28,6 +28,7 @@ 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.IcResiDemandDictDTO; +import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.service.IcResiDemandDictService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -90,4 +91,15 @@ public class IcResiDemandDictController { return new Result>().ok(icResiDemandDictService.getDemandOptions(tokenDto.getCustomerId())); } + + /** + * 居民信息列表需要展示分类名称,单独开出来这个接口,供user查询 + * @param formDTO + * @return + */ + @PostMapping("demangnames") + public Result queryDemandNames(@RequestBody UserDemandNameQueryFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO,UserDemandNameQueryFormDTO.AddUserInternalGroup.class); + return icResiDemandDictService.queryDemandNames(formDTO); + } } \ No newline at end of file diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java index 390e190f3c..94fd335929 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/dao/IcResiDemandDictDao.java @@ -24,6 +24,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Set; /** * 居民需求字典表 @@ -35,4 +36,6 @@ import java.util.List; public interface IcResiDemandDictDao extends BaseDao { List selectDemandOptions(@Param("customerId") String customerId); List selectChildDemands(@Param("customerId")String customerId, @Param("parentCode") String parentCode); + + String selectCategoryNames(@Param("customerId") String customerId,@Param("codeSet") Set codeSet); } \ No newline at end of file diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/IcResiDemandDictService.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/IcResiDemandDictService.java index 034d4fc166..d41c4303ba 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/IcResiDemandDictService.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/IcResiDemandDictService.java @@ -20,7 +20,9 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.utils.Result; import com.epmet.dto.IcResiDemandDictDTO; +import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.entity.IcResiDemandDictEntity; import java.util.List; @@ -103,4 +105,10 @@ public interface IcResiDemandDictService extends BaseService getDemandOptions(String customerId); + /** + * 居民信息列表需要展示分类名称,单独开出来这个接口,供user查询 + * @param formDTO + * @return + */ + Result queryDemandNames(UserDemandNameQueryFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java index 1910a360af..fb23a85fe8 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/IcResiDemandDictServiceImpl.java @@ -24,8 +24,10 @@ import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; import com.epmet.dao.IcResiDemandDictDao; import com.epmet.dto.IcResiDemandDictDTO; +import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.entity.IcResiDemandDictEntity; import com.epmet.service.IcResiDemandDictService; import org.apache.commons.lang3.StringUtils; @@ -110,4 +112,9 @@ public class IcResiDemandDictServiceImpl extends BaseServiceImpl queryDemandNames(UserDemandNameQueryFormDTO formDTO) { + return new Result().ok(baseDao.selectCategoryNames(formDTO.getCustomerId(),formDTO.getCodeSet())); + } + } \ No newline at end of file diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/mapper/IcResiDemandDictDao.xml b/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/mapper/IcResiDemandDictDao.xml index d33235f4bf..ae0c5a1e7f 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/mapper/IcResiDemandDictDao.xml +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/resources/mapper/IcResiDemandDictDao.xml @@ -58,4 +58,20 @@ + + \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index eb62c090af..3c021235fd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -52,8 +52,10 @@ import com.epmet.dto.IcHouseDTO; import com.epmet.dto.IcNeighborHoodDTO; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.form.*; +import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; +import com.epmet.feign.EpmetHeartOpenFeignClient; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; @@ -87,7 +89,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl demandNameRes=heartOpenFeignClient.queryDemandNames(userDemandNameQueryFormDTO); + if(demandNameRes.success()){ + demandName=demandNameRes.getData(); + } return demandName; } From 9446a53b3ad03be2deec4b31ee8c5a6f01918bab Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Fri, 19 Nov 2021 13:09:52 +0800 Subject: [PATCH 230/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20ResultDat?= =?UTF-8?q?aResolver.java=EF=BC=8C=E6=96=B9=E6=B3=95=E5=A2=9E=E5=8A=A0show?= =?UTF-8?q?Message=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/bean/log/LogOperationHelper.java | 2 +- .../service/impl/LogOperationServiceImpl.java | 6 ++-- .../epmet/controller/IcLoinController.java | 4 +-- .../service/impl/IcLoginServiceImpl.java | 2 +- .../tools/feign/ResultDataResolver.java | 7 +++-- .../java/com/epmet/config/CorsConfig.java | 2 +- .../impl/QuestionnaireServiceImpl.java | 2 +- .../impl/BizPointTotalDetailServiceImpl.java | 8 +++--- .../impl/PingyinPrivateEpmetApiService.java | 4 +-- .../service/impl/ResiEventServiceImpl.java | 10 +++---- .../impl/IcResiUserImportServiceImpl.java | 28 +++++++++---------- .../service/impl/IcResiUserServiceImpl.java | 2 +- 12 files changed, 39 insertions(+), 38 deletions(-) diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java index b8c82f6640..ce6502583e 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java @@ -57,7 +57,7 @@ public class LogOperationHelper implements ResultDataResolver { form.setUserId(userId); Result result = userOpenFeignClient.getCustomerStaffInfoByUserId(form); CustomerStaffDTO staffInfo = getResultDataOrThrowsException(result, ServiceConstant.EPMET_ADMIN_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), - "调用epmet-user服务获取staff信息发生异常"); + "调用epmet-user服务获取staff信息发生异常", null); return new OperatorInfo(staffInfo.getCustomerId(), staffInfo.getMobile(), staffInfo.getRealName()); } } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/LogOperationServiceImpl.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/LogOperationServiceImpl.java index 09b9269063..4ccc4e868f 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/LogOperationServiceImpl.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/LogOperationServiceImpl.java @@ -82,7 +82,7 @@ public class LogOperationServiceImpl implements LogOperationService, ResultDataR CustomerStaffFormDTO form = new CustomerStaffFormDTO(); form.setUserIds(new ArrayList<>(userIds)); Result> result = userOpenFeignClient.list(form); - List staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务发生异常"); + List staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务发生异常", null); HashMap staffMap = new HashMap<>(); staffs.forEach(s -> { @@ -103,7 +103,7 @@ public class LogOperationServiceImpl implements LogOperationService, ResultDataR form.setCustomerId(customerId); form.setMobile(operatorMobile); Result> result = userOpenFeignClient.list(form); - List staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务发生异常"); + List staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务发生异常", null); if (staffs.size() == 0) { return null; @@ -134,7 +134,7 @@ public class LogOperationServiceImpl implements LogOperationService, ResultDataR CustomerStaffFormDTO form = new CustomerStaffFormDTO(); form.setRealName(operatorName); Result> result = userOpenFeignClient.list(form); - List staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务查询工作人员信息发生异常"); + List staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务查询工作人员信息发生异常", null); List userIds = new ArrayList<>(); HashMap staffMap = new HashMap(); diff --git a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java index cd3c5543e6..659945bddb 100644 --- a/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java +++ b/epmet-auth/src/main/java/com/epmet/controller/IcLoinController.java @@ -76,7 +76,7 @@ public class IcLoinController implements ResultDataResolver { // 获取用户信息 Result> staffResult = epmetUserFeignClient.checkCustomerStaff(mobile); - List staffList = getResultDataOrThrowsException(staffResult, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【基层治理平台登录】获取用户信息失败"); + List staffList = getResultDataOrThrowsException(staffResult, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【基层治理平台登录】获取用户信息失败", null); if (CollectionUtils.isEmpty(staffList)) { throw new RenException(EpmetErrorCode.ERR10003.getCode()); } @@ -93,7 +93,7 @@ public class IcLoinController implements ResultDataResolver { RootOrgListByStaffIdFormDTO orgListForm = new RootOrgListByStaffIdFormDTO(); orgListForm.setStaffId(staffId); Result> orgListResult = govOrgOpenFeignClient.getStaffOrgListByStaffId(orgListForm); - List orgs = getResultDataOrThrowsException(orgListResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【基层治理平台登录】根据staffId查询所属客户跟组织列表失败"); + List orgs = getResultDataOrThrowsException(orgListResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【基层治理平台登录】根据staffId查询所属客户跟组织列表失败", null); // 生成登录票据 String ticket = UUID.randomUUID().toString().replace("-", ""); diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java index d14db75885..1e1767070e 100644 --- a/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java +++ b/epmet-auth/src/main/java/com/epmet/service/impl/IcLoginServiceImpl.java @@ -65,7 +65,7 @@ public class IcLoginServiceImpl implements IcLoginService, ResultDataResolver { String token = this.generateIcToken(staffId, app, client); Result agencyResult = govOrgOpenFeignClient.getAgencyById(orgId); - CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(agencyResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【IC平台登录】获取组织信息失败"); + CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(agencyResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【IC平台登录】获取组织信息失败", null); // 2.缓存token cacheToken(app, client, staffId, token, orgId, agencyInfo.getCustomerId()); diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/ResultDataResolver.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/ResultDataResolver.java index 5b56e64b1a..1bfa31e96b 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/ResultDataResolver.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/ResultDataResolver.java @@ -34,18 +34,19 @@ public interface ResultDataResolver { * @return * @param targetServiceName 目标service名称 * @param errorCode 错误码,可以为空,为空则使用上游服务抛出的错误码 - * @param errorInternalMsg 错误信息,可以为空,为空则使用上游服务抛出的异常信息 + * @param errorInternalMsg 内部错误信息,可以为空,为空则使用上游服务抛出的异常信息 + * @param showMsg 展示给前端程序的错误信息,可以为空。为空则根据errorCode给定错误msg信息 * @author wxz * @date 2021.06.07 22:45 */ - default R getResultDataOrThrowsException(Result result, String targetServiceName, Integer errorCode, String errorInternalMsg) { + default R getResultDataOrThrowsException(Result result, String targetServiceName, Integer errorCode, String errorInternalMsg, String showMsg) { if (result == null) { throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(), "调用{}服务发生错误,返回Result为null", targetServiceName); } if (!result.success()) { Integer finalErrorCode = errorCode == null ? result.getCode() : errorCode; String finalErrorInternalMsg = StringUtils.isBlank(errorInternalMsg) ? result.getInternalMsg() : errorInternalMsg; - throw new RenException(finalErrorCode, finalErrorInternalMsg); + throw new RenException(finalErrorCode, finalErrorInternalMsg, showMsg, RenException.MessageMode.CODE_INTERNAL_EXTERNAL); } return result.getData(); } diff --git a/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java b/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java index bb95213c1f..72a2e0a31f 100644 --- a/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java +++ b/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java @@ -117,7 +117,7 @@ class EpmetWebFilter implements WebFilter, ResultDataResolver { adminOpenFeignClient.list(), ServiceConstant.EPMET_ADMIN_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), - "调用Admin服务查询Cors配置失败"); + "调用Admin服务查询Cors配置失败", null); } catch (Exception e) { logger.error("调用Admin服务查询Cors配置失败"); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/QuestionnaireServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/QuestionnaireServiceImpl.java index 1c6aab452d..2d69ac0fb3 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/QuestionnaireServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/QuestionnaireServiceImpl.java @@ -73,7 +73,7 @@ public class QuestionnaireServiceImpl implements QuestionnaireService, ResultDat CustomerGridFormDTO form = new CustomerGridFormDTO(); form.setGridId(gridId); Result gridInfoResult = govOrgOpenFeignClient.getGridBaseInfoByGridId(form); - CustomerGridDTO gridInfo = getResultDataOrThrowsException(gridInfoResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【调查问卷】校验访问权限,查询网格信息失败"); + CustomerGridDTO gridInfo = getResultDataOrThrowsException(gridInfoResult, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【调查问卷】校验访问权限,查询网格信息失败", null); // 网格父级ID列表:网格ID(拼接起来,冒号分割) String gridIdPath = gridInfo.getPids().concat(":").concat(gridInfo.getId()); List publishRangeEntity = prPublishRangeService.getPublishRangeEntity(projectKey); diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointTotalDetailServiceImpl.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointTotalDetailServiceImpl.java index 87b7b20a32..2fd521d1d9 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointTotalDetailServiceImpl.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/BizPointTotalDetailServiceImpl.java @@ -380,7 +380,7 @@ public class BizPointTotalDetailServiceImpl extends BaseServiceImpl> result = resiGroupOpenFeignClient.listGroupDetailsExcludeGroupIds(form); - List groups = getResultDataOrThrowsException(result, ServiceConstant.RESI_GROUP_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【小组排名】查询积分为0的小组列表失败"); + List groups = getResultDataOrThrowsException(result, ServiceConstant.RESI_GROUP_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【小组排名】查询积分为0的小组列表失败", null); if (CollectionUtils.isEmpty(groups)) { return new ArrayList<>(); } @@ -412,7 +412,7 @@ public class BizPointTotalDetailServiceImpl extends BaseServiceImpl> listResult = resiGroupOpenFeignClient.listGroupDetailsByGroupIds(groupIds); - List groupInfos = getResultDataOrThrowsException(listResult, ServiceConstant.RESI_GROUP_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【小组排行】批量查询小组信息出错"); + List groupInfos = getResultDataOrThrowsException(listResult, ServiceConstant.RESI_GROUP_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【小组排行】批量查询小组信息出错", null); // 将小组基本信息转化为map HashMap groupMap = new HashMap<>(); @@ -454,7 +454,7 @@ public class BizPointTotalDetailServiceImpl extends BaseServiceImpl result = govOrgOpenFeignClient.getGridBaseInfoByGridId(form); - return getResultDataOrThrowsException(result, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【小组排名】查询网格信息失败"); + return getResultDataOrThrowsException(result, ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【小组排名】查询网格信息失败", null); } @Override @@ -464,7 +464,7 @@ public class BizPointTotalDetailServiceImpl extends BaseServiceImpl groupList = getResultDataOrThrowsException(resiGroupOpenFeignClient.listGroupsByMember(form), - ServiceConstant.RESI_GROUP_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【我所在的小组排名】查询组列表失败"); + ServiceConstant.RESI_GROUP_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【我所在的小组排名】查询组列表失败", null); if (CollectionUtils.isEmpty(groupList)) { return new ArrayList(); diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java index da62386442..9878fe2a3c 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java @@ -55,7 +55,7 @@ public class PingyinPrivateEpmetApiService extends ApiService implements String urlParams = super.convertQueryParams2String(constructCommonUrlParamsMap(platformKey, authType, uuid, currentTimeMillis, sign)); String requestUrl = baseUrl.concat(apiUrl).concat(urlParams); Result stringResult = HttpClientManager.getInstance().sendPostByHttps(requestUrl, "{}"); - String remoteResultString = getResultDataOrThrowsException(stringResult, "【调用平阴私有化平台获取AccessToken】", EpmetErrorCode.SERVER_ERROR.getCode(), null); + String remoteResultString = getResultDataOrThrowsException(stringResult, "【调用平阴私有化平台获取AccessToken】", EpmetErrorCode.SERVER_ERROR.getCode(), null, null); Result remoteResult = parsePlatformResponseResult(remoteResultString, GetAccessTokenResultDTO.class); log.info("【调用平阴私有化平台获取AccessToken】结果:{}", remoteResultString); accessTokenFromCache = remoteResult.getData().getAccessToken(); @@ -159,7 +159,7 @@ public class PingyinPrivateEpmetApiService extends ApiService implements String jsonString = JSON.toJSONString(form); Result result = super.sendPostRequest(platformId, ThirdPlatformActions.PUSH_COMPONENT_ACCESS_TOKEN, jsonString, null, urlParams); - getResultDataOrThrowsException(result, "【平阴私有化平台】推送ComponentAccessToken", EpmetErrorCode.SERVER_ERROR.getCode(), null); + getResultDataOrThrowsException(result, "【平阴私有化平台】推送ComponentAccessToken", EpmetErrorCode.SERVER_ERROR.getCode(), null, null); } @Override diff --git a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java index 36a2a43684..fa19f94f14 100644 --- a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java +++ b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java @@ -50,7 +50,7 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve //查询人大代表列表 ListUserByBadgeFormDTO npcForm = new ListUserByBadgeFormDTO(customerId, BadgeConstant.BADGE_KEY_NPC); Result> npcResult = epmetUserOpenFeignClient.listUsersByBadge(npcForm); - List npcData = getResultDataOrThrowsException(npcResult, ServiceConstant.EPMET_USER_SERVER, null, null); + List npcData = getResultDataOrThrowsException(npcResult, ServiceConstant.EPMET_USER_SERVER, null, null, null); if(CollectionUtils.isEmpty(npcData)) { // 没有人大代表,直接返回空列表即可 @@ -61,7 +61,7 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve List npcGridIds = npcData.stream().map(d -> d.getGridId()).collect(Collectors.toList()); OrgInfoFormDTO form = new OrgInfoFormDTO(OrgInfoConstant.GRID, npcGridIds); Result> npcGridInfoResult = govOrgOpenFeignClient.selectOrgInfo(form); - List npcGridInfos = getResultDataOrThrowsException(npcGridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null); + List npcGridInfos = getResultDataOrThrowsException(npcGridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null, null); Map npcGridInfoMap = convertNpcGridInfos2Map(npcGridInfos); @@ -109,7 +109,7 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve TreeSet targetLevels = new TreeSet<>(); Result gridInfoResult = govOrgOpenFeignClient.queryGridInfo(gridId); - GridInfoResultDTO gridInfoData = getResultDataOrThrowsException(gridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null); + GridInfoResultDTO gridInfoData = getResultDataOrThrowsException(gridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null, null); String pidsPath = gridInfoData.getPids(); List parentOrgIds = Arrays.asList(pidsPath.split(":")); // 翻转列表 @@ -118,7 +118,7 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve // 一.网格信息(只有一条,但是为了适应接口,组装成了列表) List currentGridId = Arrays.asList(gridId); Result> currentGridInfoResult = govOrgOpenFeignClient.selectOrgInfo(new OrgInfoFormDTO(OrgInfoConstant.GRID, currentGridId)); - List currentGridInfos = getResultDataOrThrowsException(currentGridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null); + List currentGridInfos = getResultDataOrThrowsException(currentGridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null, null); OrgInfoResultDTO currentGridInfo = currentGridInfos.get(0); // 因为上游接口的值对应问题,这里只好做一个适配,拼接起来,希望上游代码不要再改了... @@ -128,7 +128,7 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve // 二.父级组织信息 Result> parentOrgInfoResult = govOrgOpenFeignClient.selectOrgInfo(new OrgInfoFormDTO(OrgInfoConstant.AGENCY, parentOrgIds)); - List parentOrgInfos = getResultDataOrThrowsException(parentOrgInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null); + List parentOrgInfos = getResultDataOrThrowsException(parentOrgInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null, null); parentOrgInfos.forEach(porg -> { String levelName = OrgLevelEnums.getLevelName(porg.getLevel()); if (StringUtils.isBlank(levelName)) { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 909f16b8ad..e0e1bac217 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -166,11 +166,11 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res userForm.setClient(loginUserClient); userForm.setUserId(loginUserId); - LoginUserDetailsResultDTO loginUserDetails = getResultDataOrThrowsException(epmetUserOpenFeignClient.getLoginUserDetails(userForm), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + LoginUserDetailsResultDTO loginUserDetails = getResultDataOrThrowsException(epmetUserOpenFeignClient.getLoginUserDetails(userForm), ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); String currUserAgencyId = loginUserDetails.getAgencyId(); //String excelPathName = "/opt/test/基础信息表/resi_info.xls"; - CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); String customerId = agencyInfo.getCustomerId(); try { @@ -788,55 +788,55 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res switch (pureUri) { case "/epmetuser/icresidemanddict/demandoption": options = getResultDataOrThrowsException(epmetUserOpenFeignClient.getDemandOptions(), ServiceConstant.EPMET_USER_SERVER, - EpmetErrorCode.SERVER_ERROR.getCode(), null); + EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/gov/org/customergrid/gridoption": GridOptionFormDTO form = new GridOptionFormDTO(); form.setAgencyId(currUserAgencyId); form.setPurpose(purpose); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getGridOption(form), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/gov/org/customerpartybranch/branchoption": CustomerPartyBranchDTO bform = new CustomerPartyBranchDTO(); bform.setGridId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBranchOption(bform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/gov/org/icbuilding/buildingoption": IcBuildingDTO buildingform = new IcBuildingDTO(); buildingform.setNeighborHoodId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getBuildingOptions(buildingform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/gov/org/icbuildingunit/unitoption": IcBuildingUnitDTO buForm = new IcBuildingUnitDTO(); buForm.setBuildingId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getUnitOptions(buForm), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/gov/org/ichouse/houseoption": HouseFormDTO hform = new HouseFormDTO(); hform.setUnitId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getHouseOption(hform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/gov/org/icneighborhood/neighborhoodoption": IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); nform.setAgencyId(currUserAgencyId); nform.setGridId(cascadeItemColumnWrapper.getColValue()); - options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/education": - options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(adminOpenFeignClient.getEducationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/house": - options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(adminOpenFeignClient.getHouseOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/nation": - options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(adminOpenFeignClient.getNationOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/ninesmallplaces": - options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(adminOpenFeignClient.getNineSmallPlacesOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/relationship": - options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null); + options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 3c021235fd..ddb7c9307d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -832,6 +832,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> result = operCustomizeOpenFeignClient.listItems(form); - return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "查询表单相关信息失败"); + return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "查询表单相关信息失败", null); } } From ef755fd15271d3fe461f2af5eb63cae235f10e78 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 19 Nov 2021 15:59:51 +0800 Subject: [PATCH 231/253] =?UTF-8?q?=E6=88=BF=E5=B1=8B=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=85=9A=E5=91=98=E6=94=BE=E5=9C=A8=E6=9C=80=E5=89=8D=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcHouseServiceImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 0dbfa5796a..18ee67f7ae 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -219,6 +219,15 @@ public class IcHouseServiceImpl extends BaseServiceImpl Date: Fri, 19 Nov 2021 16:08:20 +0800 Subject: [PATCH 232/253] =?UTF-8?q?=E6=88=BF=E5=B1=8B=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=85=9A=E5=91=98=E6=94=BE=E5=9C=A8=E6=9C=80=E5=89=8D=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/IcHouseServiceImpl.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java index 18ee67f7ae..914bc68a56 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/IcHouseServiceImpl.java @@ -220,14 +220,16 @@ public class IcHouseServiceImpl extends BaseServiceImpl Date: Fri, 19 Nov 2021 16:23:48 +0800 Subject: [PATCH 233/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/constant/StrConstant.java | 2 + .../commons/tools/enums/FormItemTypeEnum.java | 53 +++++ .../controller/IcNeighborHoodController.java | 4 +- .../epmet/constant/IcResiUserConstant.java | 11 + .../controller/IcResiUserController.java | 62 ++++-- .../com/epmet/enums/IcResiUserTableEnum.java | 4 +- .../excel/support/ExportResiUserItemDTO.java | 29 +++ .../com/epmet/service/IcResiUserService.java | 7 +- .../impl/IcResiUserImportServiceImpl.java | 25 ++- .../service/impl/IcResiUserServiceImpl.java | 202 +++++++++--------- .../ic_resi_info_cid_for_easy_excel.xlsx | Bin 25132 -> 25170 bytes 11 files changed, 267 insertions(+), 132 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java create mode 100644 epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java index 2e1d7d5bea..a18f34f72b 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java @@ -75,6 +75,8 @@ public interface StrConstant { String STAR="*"; String QUESTION_MARK="?"; + String QUESTION_MARK_TRANSFER="\\?"; + String AND_MARK="&"; /** * 空字符串 diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java new file mode 100644 index 0000000000..753852bfff --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/FormItemTypeEnum.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.epmet.commons.tools.enums; + +/** + * form表单 配置item类型 枚举 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +public enum FormItemTypeEnum { + //枚举类型 + INPUT("input", "输入框"), + RADIO("radio", "单选框"), + CHECKBOX("checkbox", "复选框"), + SELECT("select", "下拉框"), + TEXTAREA("textarea", "文本域"), + CASCADER("cascader", "及联"), + DATE_PICKER("datepicker", "组织"), + UN_KNOWN("un_known", "不支持的类型"); + + private String code; + private String desc; + + FormItemTypeEnum(String value,String name) { + this.code = value; + this.desc = name; + } + + public static FormItemTypeEnum getEnum(String code) { + FormItemTypeEnum[] values = FormItemTypeEnum.values(); + for (FormItemTypeEnum value : values) { + if (value.getCode().equals(code)) { + return value; + } + } + return UN_KNOWN; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java index 14dcda318a..fcd64c4658 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/IcNeighborHoodController.java @@ -45,7 +45,7 @@ import java.util.Map; @RestController @RequestMapping("icneighborhood") public class IcNeighborHoodController { - + @Autowired private IcNeighborHoodService icNeighborHoodService; @@ -109,4 +109,4 @@ public class IcNeighborHoodController { return new Result>().ok(icNeighborHoodService.getListByIds(ids)); } -} \ No newline at end of file +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java new file mode 100644 index 0000000000..6b32f663fc --- /dev/null +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/constant/IcResiUserConstant.java @@ -0,0 +1,11 @@ +package com.epmet.constant; + +/** + * @author zhaoqifeng + * @dscription + * @date 2021/6/8 15:28 + */ +public interface IcResiUserConstant { + + String IC_RESI_USER = "ic_resi_user"; +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 8b571dce85..fd3a88fd79 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -44,10 +44,12 @@ import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.constant.IcResiUserConstant; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.enums.IcResiUserTableEnum; +import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.feign.OssFeignClient; import com.epmet.service.IcResiUserImportService; @@ -84,7 +86,7 @@ import java.util.stream.Collectors; @RestController @RequestMapping("icresiuser") public class IcResiUserController { - private static final String BASE_TABLE_NAME = "ic_resi_user"; + //todo 枚举吧 private static final String IC_RESI_FORM_CODE = "resi_base_info"; @@ -227,7 +229,7 @@ public class IcResiUserController { Map> otherSheetItems = buildItemMap(resiFormItems); - Map> resiMainList = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), BASE_TABLE_NAME, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiMainList = null;//icResiUserService.getDataForExport(otherSheetItems.get(IcResiUserConstant.IC_RESI_USER), IcResiUserConstant.IC_RESI_USER, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //resiMainList = (List>)JSON.parse("[{\"IS_BDHJ\":\"1\",\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest2\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":null,\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":null,\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":null,\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"},{\"IS_SPECIAL\":\"1\",\"IS_XFRY\":\"0\",\"REMARKS\":\"beizhu\",\"IS_PARTY\":\"1\",\"icResiUserId\":\"yzmtest\",\"HOME_ID\":\"中海国际社区一里城1号楼1单元101\",\"HOUSE_TYPE\":\"平房\",\"UNIT_NAME\":\"1单元\",\"GRID_ID\":\"市北区-市北区第三网格3\",\"IS_DB\":\"0\",\"GENDER\":\"男\",\"BIRTHDAY\":\"2021-10-04\",\"IS_VETERANS\":\"0\",\"IS_MB\":\"0\",\"IS_UNEMPLOYED\":\"0\",\"DEMAND_NAME\":\"心理咨询\",\"IS_KC\":\"0\",\"IS_ENSURE_HOUSE\":\"0\",\"IS_SD\":\"0\",\"NAME\":\"尹作梅\",\"RDSJ\":\"2021-10-28 00:00:00\",\"IS_VOLUNTEER\":\"1\",\"GRID_ID_VALUE\":\"e74829ffc43d5470eba6b5e060c11e63\",\"IS_SZ\":\"0\",\"IS_CJ\":\"0\",\"HOME_ID_VALUE\":\"200\",\"DEMAND_CATEGORY_IDS\":\"10180002\",\"VILLAGE_NAME\":\"中海国际社区一里城\",\"IS_DBH\":\"0\",\"IS_SN\":\"0\",\"BUILD_NAME\":\"1号楼\",\"IS_YLFN\":\"0\",\"IS_UNITED_FRONT\":\"0\",\"ID_CARD\":\"371325199310260529\",\"MOBILE\":\"15764229697\",\"IS_OLD_PEOPLE\":\"0\",\"DOOR_NAME\":\"101\"}]"); log.info("resiMainList:{}", JSON.toJSONString(resiMainList)); String templatePath = "excel/ic_resi_info_cid.xls"; @@ -241,13 +243,13 @@ public class IcResiUserController { AtomicInteger n = new AtomicInteger(); for (FormItemResult item : resiFormItems.getItemList()) { //如果 childGroup是空 或者是主表 则跳过 继续下次循环 - if (item.getChildGroup() == null || BASE_TABLE_NAME.equals(item.getChildGroup().getTableName())) { + if (item.getChildGroup() == null || IcResiUserConstant.IC_RESI_USER.equals(item.getChildGroup().getTableName())) { continue; } String tableName = item.getChildGroup().getTableName(); Map itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = null;//icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //resiChildMap.forEach((key, value) -> value.putAll(resiMainList.get(key))); Map mapData2 = new HashMap<>(); @@ -286,7 +288,7 @@ public class IcResiUserController { ExcelWriter excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); - IcResiUserTableEnum tableEnums = IcResiUserTableEnum.getObjectByTableName(BASE_TABLE_NAME); + IcResiUserTableEnum tableEnums = IcResiUserTableEnum.getObjectByTableName(IcResiUserConstant.IC_RESI_USER); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); @@ -296,24 +298,24 @@ public class IcResiUserController { Map childTableWriteSheetMap = new HashMap<>(); Map> resiMainTableMap = null; do { - resiMainTableMap = icResiUserService.getDataForExport(otherSheetItems.get(BASE_TABLE_NAME), BASE_TABLE_NAME, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + resiMainTableMap = null;//icResiUserService.getDataForExport(otherSheetItems.get(IcResiUserConstant.IC_RESI_USER), IcResiUserConstant.IC_RESI_USER, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 if (resiMainTableMap.keySet().size() < pageFormDTO.getPageSize()) { - stopSearchSet.add(BASE_TABLE_NAME); + stopSearchSet.add(IcResiUserConstant.IC_RESI_USER); } //写入数据 excelWriter.fill(new FillWrapper("t1", resiMainTableMap.values()), fillConfig, fistSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + 1); //重置数据 resiMainTableMap.clear(); - } while (!stopSearchSet.contains(BASE_TABLE_NAME)); + } while (!stopSearchSet.contains(IcResiUserConstant.IC_RESI_USER)); //子表数据写入 AtomicInteger n = new AtomicInteger(); for (FormItemResult item : resiFormItems.getItemList()) { //如果 childGroup是空 或者是主表 则跳过 继续下次循环 - if (item.getChildGroup() == null || BASE_TABLE_NAME.equals(item.getChildGroup().getTableName())) { + if (item.getChildGroup() == null || IcResiUserConstant.IC_RESI_USER.equals(item.getChildGroup().getTableName())) { continue; } String tableName = item.getChildGroup().getTableName(); @@ -326,7 +328,7 @@ public class IcResiUserController { continue; } Map itemMap1 = otherSheetItems.get(tableName); - Map> resiChildMap = icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + Map> resiChildMap = null;//icResiUserService.getDataForExport(itemMap1, tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); @@ -365,8 +367,6 @@ public class IcResiUserController { pageFormDTO.setCustomerId(customerId); pageFormDTO.setPageFlag(false); - - //获取模版文件 File file = getExportTemplateFile(customerId); ExcelWriter excelWriter = null; @@ -381,34 +381,56 @@ public class IcResiUserController { //获取表单项 List resiFormAllItems = icResiUserService.listFormItems(customerId, IC_RESI_FORM_CODE); + Map allItemMap = resiFormAllItems.stream().collect(Collectors.toMap(FormItemResult::getItemId, o -> o)); + Map map = new HashMap<>(); + allItemMap.values().forEach(item->{ + String tableName = item.getTableName(); + ExportResiUserItemDTO exportItem = map.getOrDefault(tableName, new ExportResiUserItemDTO()); + map.putIfAbsent(tableName,exportItem); + String columnName = item.getColumnName().concat(item.getColumnNum() == NumConstant.ZERO ? StrConstant.EPMETY_STR : item.getColumnNum().toString()); + exportItem.getItemMap().put(columnName,item); + if (item.getOptionSourceType().equals("remote")&&item.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ + //多个参数 + String[] paramArr = item.getOptionSourceValue().split(StrConstant.QUESTION_MARK_TRANSFER)[NumConstant.ONE].split(StrConstant.AND_MARK); + Arrays.stream(paramArr).forEach(o->{ + FormItemResult value = allItemMap.get(o); + if (value == null){ + return; + } + Set conditionSet = exportItem.getRemoteItemConditionMap().getOrDefault(item.getItemId(),new HashSet<>()); + conditionSet.add(value); + exportItem.getRemoteItemConditionMap().putIfAbsent(item.getItemId(),conditionSet); + }); + } + }); + //每个表对应的 item ;key:表名,value:<字段名:item对象> - Map> tableItemMap = resiFormAllItems.stream() - .collect(Collectors.groupingBy(FormItemResult::getTableName, - Collectors.toMap(o->o.getColumnName().concat(NumConstant.ZERO == o.getColumnNum()? StrConstant.EPMETY_STR:o.getColumnNum().toString()), o -> o))); Map childTableWriteSheetMap = new HashMap<>(); //表数据写入 //通过枚举获取相关表并按照sheetNo排序 List resiTableList = Arrays.stream(IcResiUserTableEnum.values()) .sorted(Comparator.comparing(IcResiUserTableEnum::getSheetNo)) .collect(Collectors.toList()); + List> resiResultList = null; for (IcResiUserTableEnum tableEnum : resiTableList) { String tableName = tableEnum.getTableName(); pageFormDTO.setPageNo(NumConstant.ONE); - //循环一次 写入每个sheet + //循环一次 写入一个sheet do { - Map> resiChildMap = icResiUserService.getDataForExport(tableItemMap.get(tableName), tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); + resiResultList = icResiUserService.getDataForExport(map.get(tableName), tableName, pageFormDTO, staffInfoCacheResult.getAgencyId(), staffOrgPath); //如果 返回的条数小于每页显示的数 则退出查询 - if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { + if (resiResultList.size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); } //如果没有 构建新的writeSheet WriteSheet writeSheet = childTableWriteSheetMap.getOrDefault(tableName,EasyExcel.writerSheet(tableEnum.getSheetNo()).build()); childTableWriteSheetMap.putIfAbsent(tableName, writeSheet); //写入数据 - excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiChildMap.values()), writeSheet); + excelWriter.fill(new FillWrapper("t" + (tableEnum.getSheetNo() + NumConstant.ONE), resiResultList), writeSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + NumConstant.ONE); //重置数据 - resiChildMap.clear(); + resiResultList.clear(); + //如果包含则说明子表的数据 已经查询完毕 无需再继续查询了 } while (!stopSearchSet.contains(tableName)); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java index eb4ecd977e..ffd0076429 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/enums/IcResiUserTableEnum.java @@ -10,7 +10,9 @@ import lombok.AllArgsConstructor; */ @AllArgsConstructor public enum IcResiUserTableEnum { - + /** + * 注释 + */ IC_RESI_USER("ic_resi_user","社区居民基本信息录入表", 0, 3, null), IC_PARTY_MEMBER("ic_party_member","党员信息录入表", 1, 2, "IS_PARTY"), IC_ENSURE_HOUSE("ic_ensure_house","保障房人员信息录入表", 2, 2, "IS_ENSURE_HOUSE"), diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java new file mode 100644 index 0000000000..8f7cb6de14 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/support/ExportResiUserItemDTO.java @@ -0,0 +1,29 @@ +package com.epmet.excel.support; + +import com.epmet.dto.result.FormItemResult; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * desc: + * + * @author: LiuJanJun + * @date: 2021/11/18 3:31 下午 + * @version: 1.0 + */ +@Data +public class ExportResiUserItemDTO implements Serializable { + + private static final long serialVersionUID = -6581208659638591761L; + + /** + * 该表对应的 字段名:item + */ + private Map itemMap = new HashMap<>(); + /** + * 该表对应的所有远程item的相关条件 key:remote的itemID value:条件中用到的所有的item + */ + private Map> remoteItemConditionMap = new HashMap<>(); +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index d18d47d1b3..52e256105c 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -23,6 +23,7 @@ import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; +import com.epmet.excel.support.ExportResiUserItemDTO; import java.util.List; import java.util.Map; @@ -105,12 +106,12 @@ public interface IcResiUserService extends BaseService { /** * desc:条件导出 * - * @param itemList + * @param exportResiUserItemDTO * @param baseTableName * @return Map> 用户Id:用户信息所有的字段名及值 */ - Map> getDataForExport(Map itemList, String baseTableName, IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, - String staffOrgPath); + List> getDataForExport(ExportResiUserItemDTO exportResiUserItemDTO, String baseTableName, IcResiUserPageFormDTO pageFormDTO, String currentStaffAgencyId, + String staffOrgPath); /** * @Description 家庭关系 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index e0e1bac217..b2adb20543 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -7,6 +7,7 @@ import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcelFactory; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.OptionResultDTO; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -15,7 +16,6 @@ import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.dao.IcResiUserDao; import com.epmet.dto.*; -import com.epmet.dto.form.AgencyIdFormDTO; import com.epmet.dto.form.GridOptionFormDTO; import com.epmet.dto.form.HouseFormDTO; import com.epmet.dto.form.LoginUserDetailsFormDTO; @@ -90,7 +90,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res // 是否必填 private Integer required; - private List colIndexs; + private List colIndex; //private List colContents; // 单元格内容 private String cellContent; @@ -544,7 +544,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res || "daterange".equals(columnWrapper.getItemType()) ) { - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + String cellContent = row.get(columnWrapper.getColIndex().get(0)); columnWrapper.setCellContent(cellContent); columnWrapper.setColValue(cellContent); @@ -553,7 +553,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String optionSourceType = columnWrapper.getOptionSourceType(); // 取单元格的内容 - String cellContent = row.get(columnWrapper.getColIndexs().get(0)); + String cellContent = row.get(columnWrapper.getColIndex().get(0)); columnWrapper.setCellContent(cellContent); if ("local".equals(optionSourceType)) { @@ -677,7 +677,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel()); columnWrapper.setCombinedLabel(combinedLabel); columnWrapper.setColumnName(item.getColumnName()); - columnWrapper.setColIndexs(entry.getValue()); + columnWrapper.setColIndex(entry.getValue()); columnWrapper.setRequired(item.getRequired()); columnWrapper.setOptionSourceType(item.getOptionSourceType()); @@ -699,7 +699,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res private String getCheckBoxColValue(ColumnWrapper columnWrapper, Map dataRow, Map checkboxOptions) { Map options = columnWrapper.getOptions(); - List colIndexs = columnWrapper.getColIndexs(); + List colIndexs = columnWrapper.getColIndex(); List optionValues = colIndexs.stream().filter(i -> { String cellContent = dataRow.get(i); @@ -770,8 +770,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String cascadeItemId = null; ColumnWrapper cascadeItemColumnWrapper = null; - if (fullUri.indexOf("?") != -1) { - String[] uriParts = fullUri.split("\\?"); + if (fullUri.indexOf(StrConstant.QUESTION_MARK) != -1) { + String[] uriParts = fullUri.split(StrConstant.QUESTION_MARK_TRANSFER); pureUri = uriParts[0]; cascadeItemId = uriParts[1]; @@ -819,8 +819,11 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res break; case "/gov/org/icneighborhood/neighborhoodoption": IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); - nform.setAgencyId(currUserAgencyId); - nform.setGridId(cascadeItemColumnWrapper.getColValue()); + String gridId = cascadeItemColumnWrapper.getColValue(); + if (StringUtils.isBlank(gridId)){ + nform.setAgencyId(currUserAgencyId); + } + nform.setGridId(gridId); options = getResultDataOrThrowsException(govOrgOpenFeignClient.getNeighborHoodOptions(nform), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; case "/sys/dict/data/education": @@ -838,6 +841,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res case "/sys/dict/data/relationship": options = getResultDataOrThrowsException(adminOpenFeignClient.getRelationshipOption(), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null, null); break; + default: + log.warn("listRemoteOptions url is not supported"); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index ddb7c9307d..277b7220a7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; +import com.epmet.commons.tools.enums.FormItemTypeEnum; import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.enums.RelationshipEnum; @@ -44,6 +45,7 @@ import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.IcPlatformConstant; +import com.epmet.constant.IcResiUserConstant; import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; @@ -55,6 +57,7 @@ import com.epmet.dto.form.*; import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.dto.result.*; import com.epmet.entity.IcResiUserEntity; +import com.epmet.excel.support.ExportResiUserItemDTO; import com.epmet.feign.EpmetHeartOpenFeignClient; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; @@ -63,6 +66,8 @@ import com.epmet.service.IcResiUserService; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -639,131 +644,136 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> getDataForExport(Map formItemMap, String baseTableName,IcResiUserPageFormDTO pageFormDTO, - String currentStaffAgencyId, - String staffOrgPath) { + public List> getDataForExport(ExportResiUserItemDTO formItemMap, String baseTableName, IcResiUserPageFormDTO pageFormDTO, + String currentStaffAgencyId, + String staffOrgPath) { Page> mapListPage = PageHelper.startPage(pageFormDTO.getPageNo(), pageFormDTO.getPageSize(), pageFormDTO.getPageFlag()).doSelectPage(() -> { this.dynamicQuery(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), baseTableName, pageFormDTO.getConditions(), currentStaffAgencyId, staffOrgPath); }); - List> mapList = mapListPage.getResult(); - Map> result = new LinkedHashMap<>(); - mapList.stream().filter(Objects::nonNull).forEach(map -> { - //遍历所有字段 格式化时间字段 - map.forEach((k,o) -> { - if (o instanceof java.sql.Date){ - o = DateUtils.format(((Date) o),DateUtils.DATE_PATTERN); - } - if (o instanceof java.sql.Timestamp){ - o = DateUtils.format(new Date(((Timestamp) o).getTime()),DateUtils.DATE_TIME_PATTERN); - } - map.put(k,o); - - //把checkbox radio select的值放入到map里 并添加对应的 - - }); - Object gridId = map.get(UserConstant.GRID_ID); + mapListPage.getResult().stream().filter(Objects::nonNull).forEach(map -> { String resiId = null; - //获取用户Id - if ("ic_resi_user".equals(baseTableName)) { + if (IcResiUserConstant.IC_RESI_USER.equals(baseTableName)) { resiId = (String) map.get("ID"); }else { resiId = (String) map.get(UserConstant.IC_RESI_USER); } - if (StringUtils.isBlank(resiId)){ log.error("getDataForExport error,resiId is net exist:{}",map); return; } - //把人放进去 - result.put(resiId, map); - - for (Map.Entry e : formItemMap.entrySet()) { - String k = e.getKey(); - FormItemResult v = e.getValue(); - Object temp = map.get(k); - String vauleStr = temp == null ? "" : temp.toString(); - - if (v.getOptionSourceType().equals("remote")) { - try { - Map columnWrappers = new HashMap<>(); - if (v.getItemId().equals("1078")) { - IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); - value.setColValue(gridId.toString()); - columnWrappers.put("1001", value); - }else if (v.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ - continue; - } - //todo 获取 options - Map stringMap = icResiUserImportService.listRemoteOptions(columnWrappers, v.getOptionSourceValue(), currentStaffAgencyId, "query"); - if ("checkbox".equals(v.getItemType())) { - stringMap.forEach((label, value) -> map.put(value, vauleStr.contains(value) ? "是" : "否")); - } else if ("select".equals(v.getItemType())) { - stringMap.forEach((label, value) -> { - if (vauleStr.equals(value)) { - map.put(k, label); - } - }); - } - } catch (Exception ex) { - log.warn("listRemoteOptions url:{}", v.getOptionSourceValue()); - } - } else { - if ("checkbox".equals(v.getItemType())) { + //遍历所有字段 格式化时间字段 + map.forEach((k,o) -> { + if (o instanceof java.sql.Date){ + o = DateUtils.format(((Date) o),DateUtils.DATE_PATTERN); + }else if (o instanceof java.sql.Timestamp){ + o = DateUtils.format(new Date(((Timestamp) o).getTime()),DateUtils.DATE_TIME_PATTERN); + } + map.put(k,o); + FormItemResult itemResult = formItemMap.getItemMap().get(k); + if (itemResult == null){ + return; + } + }); - v.getOptions().forEach(optionDTO -> { - map.put(optionDTO.getValue(), vauleStr.contains(optionDTO.getValue()) ? "是" : "否"); - }); - } else if ("select".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - if (optionDTO.getValue().equals(vauleStr)) { - map.put(k, optionDTO.getLabel()); - } - }); - } else if ("radio".equals(v.getItemType())) { - v.getOptions().forEach(optionDTO -> { - if (optionDTO.getValue().equals(vauleStr)) { - map.put(k, optionDTO.getLabel()); - } - }); - } + //当前条数据原始的id值 map + Map originalConditionMap = new HashMap<>(); + for (FormItemResult e : formItemMap.getItemMap().values()) { + String columnName = getColumnName(e); + Object temp = map.get(columnName); + String vauleStr = temp == null ? StrConstant.EPMETY_STR : temp.toString(); + originalConditionMap.putIfAbsent(columnName,vauleStr); + if ("remote".equals(e.getOptionSourceType()) && StringUtils.isNotBlank(vauleStr)) { + putRemoteValue(formItemMap.getRemoteItemConditionMap().get(e.getItemId()), currentStaffAgencyId, map,originalConditionMap, e, columnName, vauleStr); + } else { + putOptionValue(map, e, columnName, vauleStr); } } - if (!"ic_resi_user".equals(baseTableName)) { + if (!IcResiUserConstant.IC_RESI_USER.equals(baseTableName)) { Map o = redisUtils.hGetAll(RedisKeys.getExportResiBaseInfoKey(resiId)); if (o != null){ map.putAll(o); } return; } + //把人放入redis缓存 便于后面的sheet使用基础信息 + redisUtils.hMSet(RedisKeys.getExportResiBaseInfoKey(resiId),map,RedisUtils.MINUTE_THIRTY_EXPIRE); + }); + remoteOptionCacheMap.clear(); + return mapListPage.getResult(); + } - /*if (gridId != null) { - CustomerGridFormDTO formDTO = new CustomerGridFormDTO(); - formDTO.setGridId(gridId.toString()); - Result gridInfoRes = govOrgOpenFeignClient.getGridBaseInfoByGridId(formDTO); - if (gridInfoRes != null && gridInfoRes.success() && gridInfoRes.getData() != null) { - map.put(UserConstant.GRID_NAME, gridInfoRes.getData().getGridName()); + /** + * key:itemId,value: key:columnName,中文 + */ + private static Map> remoteOptionCacheMap = new HashMap<>(); + private void putRemoteValue(Set conditionItemSet, String currentStaffAgencyId, Map map, Map originalConditionMap, FormItemResult e, String columnName, String vauleStr) { + try { + Map columnWrappers = new HashMap<>(); + if (e.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ + for (FormItemResult o : conditionItemSet) { + String column = getColumnName(o); + Object conditionValue = originalConditionMap.getOrDefault(column, map.get(column)); + originalConditionMap.putIfAbsent(column,conditionValue.toString()); + IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); + value.setColValue(conditionValue.toString()); + columnWrappers.put(o.getItemId(), value); } + } + /*if (e.getItemId().equals("1078")) { + IcResiUserImportServiceImpl.ColumnWrapper value = new IcResiUserImportServiceImpl.ColumnWrapper(); + value.setColValue(gridId.toString()); + columnWrappers.put("1001", value); + }else if (e.getOptionSourceValue().contains(StrConstant.QUESTION_MARK)){ + continue; }*/ - Object homeId = map.get(UserConstant.HOME_ID); - if (homeId != null) { - HashSet houseIds = new HashSet<>(); - houseIds.add(homeId.toString()); - Result> houseInfoRes = govOrgOpenFeignClient.queryListHouseInfo(houseIds); - if (houseInfoRes != null && houseInfoRes.success() && CollectionUtils.isNotEmpty(houseInfoRes.getData())) { - HouseInfoDTO houseInfoDTO = houseInfoRes.getData().get(NumConstant.ZERO); - map.put("VILLAGE_NAME", houseInfoDTO.getNeighborHoodName()); - map.put("BUILD_NAME", houseInfoDTO.getBuildingName()); - map.put("HOME_ID", houseInfoDTO.getHouseName()); - map.put("UNIT_ID", houseInfoDTO.getUnitName()); + Cache cache = remoteOptionCacheMap.getOrDefault(e.getItemId(), CacheBuilder.newBuilder().maximumSize(NumConstant.FIVE_HUNDRED).build()); + remoteOptionCacheMap.put(e.getItemId(),cache); + String cacheValue = cache.getIfPresent(vauleStr); + if (StringUtils.isNotBlank(cacheValue)){ + map.put(columnName,cacheValue); + } else { + Map remoteOptions = icResiUserImportService.listRemoteOptions(columnWrappers, e.getOptionSourceValue(), currentStaffAgencyId, "query"); + if (FormItemTypeEnum.CHECKBOX.getCode().equals(e.getItemType())) { + remoteOptions.forEach((label, value) -> map.put(value, vauleStr.contains(value) ? "是" : "否")); + } else if (FormItemTypeEnum.SELECT.getCode().equals(e.getItemType())) { + remoteOptions.forEach((label, value) -> { + if (vauleStr.equals(value)) { + map.put(columnName, label); + } + cache.put(value,label); + }); } } - //把人放入缓存 - redisUtils.hMSet(RedisKeys.getExportResiBaseInfoKey(resiId),map,RedisUtils.MINUTE_THIRTY_EXPIRE); - }); - return result; + } catch (Exception ex) { + log.warn("listRemoteOptions url:{}", e.getOptionSourceValue()); + } + } + + private void putOptionValue(Map map, FormItemResult e, String columnName, String vauleStr) { + FormItemTypeEnum itemTypeEnum = FormItemTypeEnum.getEnum(e.getItemType()); + switch (itemTypeEnum) { + case CHECKBOX: + e.getOptions().forEach(optionDTO -> { + map.put(optionDTO.getValue(), vauleStr.contains(optionDTO.getValue()) ? "是" : "否"); + }); + break; + case SELECT: + case RADIO: + e.getOptions().forEach(optionDTO -> { + if (optionDTO.getValue().equals(vauleStr)) { + map.put(columnName, optionDTO.getLabel()); + } + }); + break; + default: + } + } + + private String getColumnName(FormItemResult e) { + return e.getColumnNum() == NumConstant.ZERO? e.getColumnName():e.getColumnName().concat(e.getColumnNum().toString()); } /** diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/ic_resi_info_cid_for_easy_excel.xlsx index c427b87ad521578abe21e75d3462592d4dc793b6..bb88725ee669eec8e404a2dbdfaf20943df9e261 100644 GIT binary patch delta 16419 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 Cz#$v} From dec8498fe068f28d11d9010ec97eda1321ebc34e Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 19 Nov 2021 16:26:32 +0800 Subject: [PATCH 234/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/IcResiUserController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index fd3a88fd79..bcd83a9e3e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -354,6 +354,18 @@ public class IcResiUserController { excelWriter.finish(); } + /** + * desc: 导出居民信息 + * + * @param customerId + * @param tokenDto + * @param pageFormDTO + * @param response + * @return void + * @author LiuJanJun + * @date 2021/11/19 4:24 下午 + * @remark:分页批量导出 + */ @RequestMapping(value = "/exportExcel") public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); From e68ca8a448d21ad71eea168ff95bdec0e651373f Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 19 Nov 2021 17:42:45 +0800 Subject: [PATCH 235/253] =?UTF-8?q?=E6=94=B9=E4=BA=86=E4=B8=AA=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IcResiUserController.java | 5 ++-- .../service/impl/IcResiUserServiceImpl.java | 30 ++++++++----------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index bcd83a9e3e..7f95af3d76 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -385,12 +385,9 @@ public class IcResiUserController { try { excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); - pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); - pageFormDTO.setPageNo(NumConstant.ONE); //子表是否停止查询 Set stopSearchSet = new HashSet<>(); - //获取表单项 List resiFormAllItems = icResiUserService.listFormItems(customerId, IC_RESI_FORM_CODE); Map allItemMap = resiFormAllItems.stream().collect(Collectors.toMap(FormItemResult::getItemId, o -> o)); @@ -424,6 +421,8 @@ public class IcResiUserController { .sorted(Comparator.comparing(IcResiUserTableEnum::getSheetNo)) .collect(Collectors.toList()); List> resiResultList = null; + + pageFormDTO.setPageSize(NumConstant.FIVE_HUNDRED); for (IcResiUserTableEnum tableEnum : resiTableList) { String tableName = tableEnum.getTableName(); pageFormDTO.setPageNo(NumConstant.ONE); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 277b7220a7..f82bcf97dc 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -650,56 +650,52 @@ public class IcResiUserServiceImpl extends BaseServiceImpl> mapListPage = PageHelper.startPage(pageFormDTO.getPageNo(), pageFormDTO.getPageSize(), pageFormDTO.getPageFlag()).doSelectPage(() -> { this.dynamicQuery(pageFormDTO.getCustomerId(), pageFormDTO.getFormCode(), baseTableName, pageFormDTO.getConditions(), currentStaffAgencyId, staffOrgPath); }); - mapListPage.getResult().stream().filter(Objects::nonNull).forEach(map -> { + mapListPage.getResult().stream().filter(Objects::nonNull).forEach(resiUser -> { String resiId = null; //获取用户Id if (IcResiUserConstant.IC_RESI_USER.equals(baseTableName)) { - resiId = (String) map.get("ID"); + resiId = (String) resiUser.get("ID"); }else { - resiId = (String) map.get(UserConstant.IC_RESI_USER); + resiId = (String) resiUser.get(UserConstant.IC_RESI_USER); } if (StringUtils.isBlank(resiId)){ - log.error("getDataForExport error,resiId is net exist:{}",map); + log.error("getDataForExport error,resiId is net exist:{}",resiUser); return; } //遍历所有字段 格式化时间字段 - map.forEach((k,o) -> { + resiUser.forEach((k,o) -> { if (o instanceof java.sql.Date){ o = DateUtils.format(((Date) o),DateUtils.DATE_PATTERN); }else if (o instanceof java.sql.Timestamp){ o = DateUtils.format(new Date(((Timestamp) o).getTime()),DateUtils.DATE_TIME_PATTERN); } - map.put(k,o); - FormItemResult itemResult = formItemMap.getItemMap().get(k); - if (itemResult == null){ - return; - } + resiUser.put(k,o); }); - //当前条数据原始的id值 map + //当前条数据原始的id值 resiUser Map originalConditionMap = new HashMap<>(); for (FormItemResult e : formItemMap.getItemMap().values()) { String columnName = getColumnName(e); - Object temp = map.get(columnName); + Object temp = resiUser.get(columnName); String vauleStr = temp == null ? StrConstant.EPMETY_STR : temp.toString(); originalConditionMap.putIfAbsent(columnName,vauleStr); if ("remote".equals(e.getOptionSourceType()) && StringUtils.isNotBlank(vauleStr)) { - putRemoteValue(formItemMap.getRemoteItemConditionMap().get(e.getItemId()), currentStaffAgencyId, map,originalConditionMap, e, columnName, vauleStr); + putRemoteValue(formItemMap.getRemoteItemConditionMap().get(e.getItemId()), currentStaffAgencyId, resiUser,originalConditionMap, e, columnName, vauleStr); } else { - putOptionValue(map, e, columnName, vauleStr); + putOptionValue(resiUser, e, columnName, vauleStr); } } if (!IcResiUserConstant.IC_RESI_USER.equals(baseTableName)) { Map o = redisUtils.hGetAll(RedisKeys.getExportResiBaseInfoKey(resiId)); if (o != null){ - map.putAll(o); + resiUser.putAll(o); } return; } //把人放入redis缓存 便于后面的sheet使用基础信息 - redisUtils.hMSet(RedisKeys.getExportResiBaseInfoKey(resiId),map,RedisUtils.MINUTE_THIRTY_EXPIRE); + redisUtils.hMSet(RedisKeys.getExportResiBaseInfoKey(resiId),resiUser,RedisUtils.MINUTE_THIRTY_EXPIRE); }); remoteOptionCacheMap.clear(); return mapListPage.getResult(); @@ -730,7 +726,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl cache = remoteOptionCacheMap.getOrDefault(e.getItemId(), CacheBuilder.newBuilder().maximumSize(NumConstant.FIVE_HUNDRED).build()); - remoteOptionCacheMap.put(e.getItemId(),cache); + remoteOptionCacheMap.putIfAbsent(e.getItemId(),cache); String cacheValue = cache.getIfPresent(vauleStr); if (StringUtils.isNotBlank(cacheValue)){ map.put(columnName,cacheValue); From f96d48a3bf27ba025154dc730955655b2e53a707 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 19 Nov 2021 17:57:49 +0800 Subject: [PATCH 236/253] =?UTF-8?q?=E5=88=86=E7=B1=BB=E9=A2=84=E8=AD=A6?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/exception/EpmetErrorCode.java | 7 ++++- .../ResiCategoryStatsConfigController.java | 26 +++++++------------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index b57a5c8584..8ecb5a189a 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -222,7 +222,12 @@ public enum EpmetErrorCode { ORG_ADD_FAILED(8919,"添加失败"), ORG_EDIT_FAILED(8920,"编辑失败"), - ORG_DEL_FAILED(8921,"删除失败"); + ORG_DEL_FAILED(8921,"删除失败"), + //通用的 错误消息自己定义返回 + OPERATION_FAILED(9999,"网络开小差。。。"), + ; + + private int code; private String msg; diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index fdec343adf..1e48a9c6f6 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -19,15 +19,11 @@ package com.epmet.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; -import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.Result; -import com.epmet.commons.tools.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.constant.IcResiCategoryStatsConfigConstant; import com.epmet.dao.IcResiCategoryStatsConfigDao; @@ -36,22 +32,20 @@ import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.IcResiCategoryWarnConfigDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; -import com.epmet.dto.form.UpGovRoleFormDTO; import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; import com.epmet.entity.IcResiCategoryStatsConfigEntity; import com.epmet.entity.IcResiCategoryWarnConfigEntity; -import com.epmet.excel.IcResiCategoryStatsConfigExcel; import com.epmet.service.IcResiCategoryStatsConfigService; import com.epmet.service.ResiCategoryStatsConfigService; -import com.github.pagehelper.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; import java.util.List; -import java.util.Map; /** @@ -63,7 +57,7 @@ import java.util.Map; @RestController @RequestMapping("resicategorystatsconfig") public class ResiCategoryStatsConfigController { - + @Autowired private IcResiCategoryStatsConfigService icResiCategoryStatsConfigService; @Autowired @@ -96,13 +90,13 @@ public class ResiCategoryStatsConfigController { if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ //判断level1 和level2 的值 if(null ==level1 || level1==0){ - return new Result().error(8001,"等级1阈值需大于0"); + return new Result().error(EpmetErrorCode.OPERATION_FAILED.getCode(),"黄色预警阈值需大于0"); } if(null == level2 || level2==0){ - return new Result().error(8001,"等级2阈值需大于0"); + return new Result().error(EpmetErrorCode.OPERATION_FAILED.getCode(),"红色预警阈值需大于0"); } if(level2<=level1){ - return new Result().error(8001,"等级2阈值需大于等级1阈值"); + return new Result().error(EpmetErrorCode.OPERATION_FAILED.getCode(),"黄色预警阈值需大于红色预警阈值"); } } resiCategoryStatsConfigService.update(customerId,formDTO); @@ -170,4 +164,4 @@ public class ResiCategoryStatsConfigController { } -} \ No newline at end of file +} From 08e84a5b4fa601a76d96f5ba6dd39342c3023bf8 Mon Sep 17 00:00:00 2001 From: lzh Date: Fri, 19 Nov 2021 23:29:50 +0800 Subject: [PATCH 237/253] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=B1=BB=E5=88=AB?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResiCategoryStatsConfigListFormDTO.java | 48 +++++++++++++++++++ .../ResiCategoryStatsConfigController.java | 7 ++- .../ResiCategoryStatsConfigService.java | 3 +- .../ResiCategoryStatsConfigServiceImpl.java | 29 +++++++++-- 4 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ResiCategoryStatsConfigListFormDTO.java diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ResiCategoryStatsConfigListFormDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ResiCategoryStatsConfigListFormDTO.java new file mode 100644 index 0000000000..96401a3029 --- /dev/null +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/form/ResiCategoryStatsConfigListFormDTO.java @@ -0,0 +1,48 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

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

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

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto.form; + +import com.epmet.commons.tools.validator.group.UpdateGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + + +/** + * 居民类别配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-11-04 + */ +@Data +public class ResiCategoryStatsConfigListFormDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 是否预警 + */ + private Integer isWarn; + + /** + * 预警等级 + */ + private Integer level; + +} \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index 1e48a9c6f6..ef94b7b4ac 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -19,6 +19,7 @@ package com.epmet.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; @@ -32,6 +33,7 @@ import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.IcResiCategoryWarnConfigDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; +import com.epmet.dto.form.ResiCategoryStatsConfigListFormDTO; import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; import com.epmet.entity.IcResiCategoryStatsConfigEntity; import com.epmet.entity.IcResiCategoryWarnConfigEntity; @@ -73,13 +75,14 @@ public class ResiCategoryStatsConfigController { * @return */ @PostMapping("list") - public Result> list(@LoginUser TokenDto tokenDTO){ + public Result> list(@LoginUser TokenDto tokenDTO,@RequestBody ResiCategoryStatsConfigListFormDTO formDTO){ String customerId = tokenDTO.getCustomerId(); // String customerId = "123123"; - return new Result>().ok(resiCategoryStatsConfigService.list(customerId)); + return new Result>().ok(resiCategoryStatsConfigService.list(customerId,formDTO)); } @PostMapping("update") + @NoRepeatSubmit public Result update(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, UpdateGroup.class); String customerId = tokenDTO.getCustomerId(); diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java index 9f351d91b4..2494953fcb 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java @@ -22,6 +22,7 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; +import com.epmet.dto.form.ResiCategoryStatsConfigListFormDTO; import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; import com.epmet.entity.IcResiCategoryStatsConfigEntity; @@ -36,7 +37,7 @@ import java.util.Map; */ public interface ResiCategoryStatsConfigService { - List list(String customerId); + List list(String customerId, ResiCategoryStatsConfigListFormDTO formDTO); IcResiCategoryStatsConfigResultDTO info(String id); diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index bfeeaa0b9d..8865e16362 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -9,6 +9,7 @@ import com.epmet.dao.IcResiCategoryWarnConfigDao; import com.epmet.dto.IcResiCategoryStatsConfigDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigFormDTO; import com.epmet.dto.form.IcResiCategoryStatsConfigSortFormDTO; +import com.epmet.dto.form.ResiCategoryStatsConfigListFormDTO; import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; import com.epmet.entity.IcFormItemEntity; import com.epmet.entity.IcFormItemGroupEntity; @@ -47,7 +48,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf @Override @Transactional(rollbackFor = Exception.class) - public List list(String customerId) { + public List list(String customerId, ResiCategoryStatsConfigListFormDTO formDTO) { //1.获取IC_FORM_ITEM 中 用于数据分析字段的 id 和label List icFormItemEntityList = icFormItemDao.selectList(new QueryWrapper().lambda().eq(IcFormItemEntity::getCustomerId,customerId).eq(IcFormItemEntity::getDataAnalyse, 1)); if(CollectionUtils.isEmpty(icFormItemEntityList)){ @@ -160,7 +161,28 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf result.add(icResiCategoryStatsConfigResultDTO); }); - return result; + if(null == formDTO){ + return result; + } + List collect = new ArrayList<>(); + for (IcResiCategoryStatsConfigResultDTO item:result){ + String isWarn = String.valueOf(formDTO.getIsWarn()); + if(null !=formDTO.getIsWarn() && (!item.getWarn().equals(isWarn))){ + continue; + } + if(null!=formDTO.getLevel()){ + if(1==formDTO.getLevel()&&null==item.getLevel1()){ + continue; + } + if(2==formDTO.getLevel()&&null==item.getLevel2()){ + continue; + } + } + collect.add(item); + + } + + return collect; } @Override @@ -198,9 +220,10 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf @Transactional(rollbackFor = Exception.class) public void update(String customerId,IcResiCategoryStatsConfigFormDTO formDTO) { IcResiCategoryStatsConfigDTO icResiCategoryStatsConfigDTO = icResiCategoryStatsConfigService.get(formDTO.getId()); - if(null == icResiCategoryStatsConfigDTO){ + if(null == icResiCategoryStatsConfigDTO || !customerId.equals(icResiCategoryStatsConfigDTO.getCustomerId())){ return ; } + //更新配置类别 IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); BeanUtils.copyProperties(formDTO,icResiCategoryStatsConfigEntity); From a0caaa96e1e8a6f6d268affcaa9035f1ce3c4d24 Mon Sep 17 00:00:00 2001 From: lzh Date: Sat, 20 Nov 2021 21:13:03 +0800 Subject: [PATCH 238/253] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E8=AE=BE=E7=BD=AEcustomerId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ResiCategoryStatsConfigServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index 8865e16362..3cdcd7944f 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -227,7 +227,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf //更新配置类别 IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); BeanUtils.copyProperties(formDTO,icResiCategoryStatsConfigEntity); - icResiCategoryStatsConfigEntity.setCustomerId(customerId); +// icResiCategoryStatsConfigEntity.setCustomerId(customerId); icResiCategoryStatsConfigDao.updateById(icResiCategoryStatsConfigEntity); //更新配置预警 @@ -249,7 +249,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf icResiCategoryWarnConfigEntity.setSort(icResiCategoryStatsConfigDTO.getSort()); icResiCategoryWarnConfigDao.insert(icResiCategoryWarnConfigEntity); }else{ - icResiCategoryWarnConfigEntity.setCustomerId(customerId); +// icResiCategoryWarnConfigEntity.setCustomerId(customerId); icResiCategoryWarnConfigEntity.setLabel(icResiCategoryStatsConfigDTO.getLabel()); icResiCategoryWarnConfigEntity.setTableName(icResiCategoryStatsConfigDTO.getTableName()); icResiCategoryWarnConfigEntity.setColumnName(icResiCategoryStatsConfigDTO.getColumnName()); @@ -276,7 +276,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf //更新配置类别 IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); BeanUtils.copyProperties(formDTO,icResiCategoryStatsConfigEntity); - icResiCategoryStatsConfigEntity.setCustomerId(customerId); +// icResiCategoryStatsConfigEntity.setCustomerId(customerId); icResiCategoryStatsConfigDao.updateById(icResiCategoryStatsConfigEntity); } @@ -287,7 +287,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf for (IcResiCategoryStatsConfigSortFormDTO formDTO : formDTOs) { IcResiCategoryStatsConfigEntity icResiCategoryStatsConfigEntity = new IcResiCategoryStatsConfigEntity(); icResiCategoryStatsConfigEntity.setId(formDTO.getId()); - icResiCategoryStatsConfigEntity.setCustomerId(customerId); +// icResiCategoryStatsConfigEntity.setCustomerId(customerId); icResiCategoryStatsConfigEntity.setSort(formDTO.getSort()); entityList.add(icResiCategoryStatsConfigEntity); } From 3497e41e5d337f771ce75fa63bb19b151fb84d41 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 22 Nov 2021 14:46:50 +0800 Subject: [PATCH 239/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ResiCategoryStatsConfigServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index 3cdcd7944f..9759eb2b9c 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -81,16 +81,16 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf //3.新增不存在的,删除不在tableColumnMap的 Map statsTableColumnMap = new HashMap<>(); - statsConfigEntityList.stream().forEach(item->{ + statsConfigEntityList.forEach(item->{ statsTableColumnMap.put(item.getTableName()+"-"+item.getColumnName(),item); }); Map warnTableColumnMap = new HashMap<>(); - warnConfigEntityList.stream().forEach(item->{ + warnConfigEntityList.forEach(item->{ warnTableColumnMap.put(item.getTableName()+"-"+item.getColumnName(),item); }); //差集 //新增 - List newStatsList = tableColumnMap.keySet().stream().filter(item -> !statsTableColumnMap.keySet().contains(item)).collect(Collectors.toList()); + List newStatsList = tableColumnMap.keySet().stream().filter(item -> !statsTableColumnMap.containsKey(item)).collect(Collectors.toList()); List newStatsEntityList = new ArrayList<>(); newStatsList.forEach(item->{ @@ -114,8 +114,8 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf List delStatsEntityIdList = new ArrayList<>(); List delWarnEntityIdList = new ArrayList<>(); //需要删除的 - List delStatsList = statsTableColumnMap.keySet().stream().filter(item -> !tableColumnMap.keySet().contains(item)).collect(Collectors.toList()); - List delWarnList = warnTableColumnMap.keySet().stream().filter(item -> !tableColumnMap.keySet().contains(item)).collect(Collectors.toList()); + List delStatsList = statsTableColumnMap.keySet().stream().filter(item -> !tableColumnMap.containsKey(item)).collect(Collectors.toList()); + List delWarnList = warnTableColumnMap.keySet().stream().filter(item -> !tableColumnMap.containsKey(item)).collect(Collectors.toList()); delStatsList.forEach(item->{ delStatsEntityIdList.add(statsTableColumnMap.get(item).getId()); }); From 595fac05ff4fedf9080ecf98134f2276d2e4c6b0 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 22 Nov 2021 15:44:26 +0800 Subject: [PATCH 240/253] =?UTF-8?q?user=20=E6=B5=8B=E8=AF=95=20=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E7=8E=AF=E5=A2=83mq=20consumer=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-user/epmet-user-server/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index 08b20aeaa5..e6c7655e35 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -319,7 +319,7 @@ true - 192.168.1.140:9876;192.168.1.141:9876 + 192.168.10.161:9876 @@ -362,7 +362,7 @@ true - 192.168.1.140:9876;192.168.1.141:9876 + 192.168.11.187:9876;192.168.11.184:9876 From 626443cfc21e733ba8229f4aaa942854f4812092 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 22 Nov 2021 15:57:23 +0800 Subject: [PATCH 241/253] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=AE=A2=E6=88=B7id?= =?UTF-8?q?=20=E8=8E=B7=E5=8F=96=E9=A2=84=E8=AD=A6=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/feign/OperCustomizeOpenFeignClient.java | 2 +- .../fallback/OperCustomizeOpenFeignClientFallback.java | 4 ++-- .../controller/ResiCategoryStatsConfigController.java | 9 +++------ .../com/epmet/service/impl/StatsResiWarnServiceImpl.java | 6 +++--- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java index cb7f414587..2882f9977f 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/OperCustomizeOpenFeignClient.java @@ -106,7 +106,7 @@ public interface OperCustomizeOpenFeignClient { Result> resiCategoryStatsListShowd(@RequestBody IcResiCategoryStatsConfigFormDTO formDTO); @PostMapping("/oper/customize/resicategorystatsconfig/resicategorywarnlist") - Result> resiCategoryWarnList(); + Result> resiCategoryWarnList(@RequestParam String customerId); @PostMapping("/oper/customize/resicategorystatsconfig/resicategorywarninfobyid") Result resiCategoryWarnInfoById(@RequestBody IcResiCategoryWarnConfigDTO dto); diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java index a793685644..a75999eb0e 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/feign/fallback/OperCustomizeOpenFeignClientFallback.java @@ -90,8 +90,8 @@ public class OperCustomizeOpenFeignClientFallback implements OperCustomizeOpenFe } @Override - public Result> resiCategoryWarnList() { - return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryWarnList"); + public Result> resiCategoryWarnList(String customerId) { + return ModuleUtils.feignConError(ServiceConstant.OPER_CUSTOMIZE_SERVER, "resiCategoryWarnList",customerId); } @Override diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index ef94b7b4ac..26f3537689 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -41,10 +41,7 @@ import com.epmet.service.IcResiCategoryStatsConfigService; import com.epmet.service.ResiCategoryStatsConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -148,11 +145,11 @@ public class ResiCategoryStatsConfigController { } @PostMapping("resicategorywarnlist") - public Result> resiCategoryWarnList(@LoginUser TokenDto tokenDTO){ + public Result> resiCategoryWarnList(@RequestParam String customerId){ //获取预警配置列表 List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper() .lambda() - .eq(IcResiCategoryWarnConfigEntity::getCustomerId,tokenDTO.getCustomerId()) + .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) .orderByAsc(IcResiCategoryWarnConfigEntity::getSort)); return new Result>().ok(ConvertUtils.sourceToTarget(warnConfigEntityList, IcResiCategoryWarnConfigDTO.class)); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java index 60d355cbf4..3b12bcd10d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsResiWarnServiceImpl.java @@ -56,7 +56,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { } List icResiCategoryStatsConfigDTOList = statsResult.getData(); //feign获取当前需要预警的配置信息以及阈值 - Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(customerId); if (!warnResult.success() || null == warnResult.getData()) { throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); @@ -200,7 +200,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { @Transactional(rollbackFor = Exception.class) public void resiWarn(String customerId) { // 获取预警配置项 - Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(customerId); if (!warnResult.success() || null == warnResult.getData()) { throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); } @@ -238,7 +238,7 @@ public class StatsResiWarnServiceImpl implements StatsResiWarnService { @Override public void resiWarnByOne(String customerId, String userId) { // 获取预警配置项 - Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(); + Result> warnResult = operCustomizeOpenFeignClient.resiCategoryWarnList(customerId); if (!warnResult.success() || null == warnResult.getData()) { throw new RenException("预警配置查询失败:"+ warnResult.getMsg()); } From 4c24b8b7a41049eda64edfb67ae66727815bafe6 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 23 Nov 2021 09:23:11 +0800 Subject: [PATCH 242/253] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E9=A2=84=E8=AD=A6=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/IcResiCategoryWarnConfigDTO.java | 4 + .../ResiCategoryStatsConfigController.java | 3 +- .../dao/IcResiCategoryStatsConfigDao.java | 15 +- .../IcResiCategoryWarnConfigEntity.java | 4 + .../ResiCategoryStatsConfigService.java | 2 +- .../ResiCategoryStatsConfigServiceImpl.java | 149 ++++-------------- .../mapper/IcResiCategoryStatsConfigDao.xml | 49 ++++++ .../mapper/IcResiCategoryWarnConfigDao.xml | 1 + 8 files changed, 109 insertions(+), 118 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java index b4a2609d5e..c7ef3d17f8 100644 --- a/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java +++ b/epmet-module/oper-customize/oper-customize-client/src/main/java/com/epmet/dto/IcResiCategoryWarnConfigDTO.java @@ -57,6 +57,10 @@ public class IcResiCategoryWarnConfigDTO implements Serializable { * 列名 */ private String columnName; + /** + * 是否预警 1 是 0 否 + */ + private String warn; /** * 排序 diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index 26f3537689..97059846c6 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -124,7 +124,7 @@ public class ResiCategoryStatsConfigController { @PostMapping("info") public Result info(@LoginUser TokenDto tokenDTO,@RequestBody IcResiCategoryStatsConfigFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, IcResiCategoryStatsConfigFormDTO.SelectGroup.class); - return new Result().ok(resiCategoryStatsConfigService.info(formDTO.getId())); + return new Result().ok(resiCategoryStatsConfigService.info(formDTO.getId(),tokenDTO.getCustomerId())); } @PostMapping("resicategorystatslistshowd") @@ -150,6 +150,7 @@ public class ResiCategoryStatsConfigController { List warnConfigEntityList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper() .lambda() .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) + .eq(IcResiCategoryWarnConfigEntity::getWarn,"1") .orderByAsc(IcResiCategoryWarnConfigEntity::getSort)); return new Result>().ok(ConvertUtils.sourceToTarget(warnConfigEntityList, IcResiCategoryWarnConfigDTO.class)); diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java index bb55c52594..95fd7c9222 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/dao/IcResiCategoryStatsConfigDao.java @@ -18,8 +18,12 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.result.IcResiCategoryStatsConfigResultDTO; import com.epmet.entity.IcResiCategoryStatsConfigEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 居民类别配置表 @@ -29,5 +33,14 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface IcResiCategoryStatsConfigDao extends BaseDao { - + + /** + * 获取配置信息 + * @param customerId + * @param isWarn + * @param level + */ + List listInfo(@Param("customerId") String customerId, @Param("isWarn") Integer isWarn, @Param("level") Integer level); + + IcResiCategoryStatsConfigResultDTO info(@Param("id") String id,@Param("customerId") String customerId); } \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java index f604689f81..9175c282a6 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/entity/IcResiCategoryWarnConfigEntity.java @@ -58,6 +58,10 @@ public class IcResiCategoryWarnConfigEntity extends BaseEpmetEntity { * 列名 */ private String columnName; + /** + * 是否预警 1 是 0 否 + */ + private String warn; /** * 排序 diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java index 2494953fcb..c9a4ff28b7 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/ResiCategoryStatsConfigService.java @@ -39,7 +39,7 @@ public interface ResiCategoryStatsConfigService { List list(String customerId, ResiCategoryStatsConfigListFormDTO formDTO); - IcResiCategoryStatsConfigResultDTO info(String id); + IcResiCategoryStatsConfigResultDTO info(String id,String customerId); void update(String customerId,IcResiCategoryStatsConfigFormDTO formDTO); diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index 9759eb2b9c..086b9b700f 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -1,6 +1,8 @@ package com.epmet.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; import com.epmet.constant.IcResiCategoryStatsConfigConstant; import com.epmet.dao.IcFormItemDao; import com.epmet.dao.IcFormItemGroupDao; @@ -59,11 +61,13 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf if(!CollectionUtils.isEmpty(groupIds)){ icFormItemGroupEntityList.addAll(icFormItemGroupDao.selectList(new QueryWrapper().lambda().eq(IcFormItemGroupEntity::getCustomerId,customerId).in(IcFormItemGroupEntity::getId, groupIds))); } + //获取tableName和COLUMN_NAME Map tableColumnMap = new HashMap<>(); Map idTableMap = new HashMap<>(); icFormItemEntityList.forEach(item->{ Map map = new HashMap<>(); + item.setColumnName(item.getColumnName().concat(NumConstant.ZERO == item.getColumnNum() ? StrConstant.EPMETY_STR : item.getColumnNum().toString())); if("0".equals(item.getItemGroupId())){ tableColumnMap.put(IcResiCategoryStatsConfigConstant.IC_RESI_USER+"-"+item.getColumnName(),item); idTableMap.put(item.getId(),IcResiCategoryStatsConfigConstant.IC_RESI_USER); @@ -110,7 +114,22 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf if(!CollectionUtils.isEmpty(newStatsEntityList)){ icResiCategoryStatsConfigService.insertBatch(newStatsEntityList); } - + List newWarnList = tableColumnMap.keySet().stream().filter(item -> !warnTableColumnMap.containsKey(item)).collect(Collectors.toList()); + List newWarnEntityList = new ArrayList<>(); + newWarnList.forEach(item->{ + IcFormItemEntity icFormItemEntity = tableColumnMap.get(item); + IcResiCategoryWarnConfigEntity entity = new IcResiCategoryWarnConfigEntity(); + entity.setCustomerId(customerId); + entity.setLabel(icFormItemEntity.getLabel()); + entity.setTableName(idTableMap.get(icFormItemEntity.getId())); + entity.setColumnName(icFormItemEntity.getColumnName()); + entity.setWarn("0"); + entity.setSort(icFormItemEntity.getSort()); + newWarnEntityList.add(entity); + }); + if(!CollectionUtils.isEmpty(newWarnEntityList)){ + icResiCategoryWarnConfigService.insertBatch(newWarnEntityList); + } List delStatsEntityIdList = new ArrayList<>(); List delWarnEntityIdList = new ArrayList<>(); //需要删除的 @@ -130,90 +149,16 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf } //4.返回数据 - List statsConfigList = icResiCategoryStatsConfigDao.selectList(new QueryWrapper().lambda() - .eq(IcResiCategoryStatsConfigEntity::getCustomerId,customerId) - .orderByAsc(IcResiCategoryStatsConfigEntity::getSort)); - List warnConfigList = icResiCategoryWarnConfigDao.selectList(new QueryWrapper().lambda() - .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId)); - Map warnMap =new HashMap<>(); - warnConfigList.forEach(item->{ - warnMap.put(item.getTableName()+"-"+item.getColumnName(),item); - }); - List result = new ArrayList<>(); - statsConfigList.forEach(item->{ - IcResiCategoryStatsConfigResultDTO icResiCategoryStatsConfigResultDTO = new IcResiCategoryStatsConfigResultDTO(); - icResiCategoryStatsConfigResultDTO.setId(item.getId()); - icResiCategoryStatsConfigResultDTO.setLabel(item.getLabel()); - icResiCategoryStatsConfigResultDTO.setManagementIcon(item.getManagementIcon()); - icResiCategoryStatsConfigResultDTO.setDataIcon(item.getDataIcon()); - icResiCategoryStatsConfigResultDTO.setHouseShowIcon(item.getHouseShowIcon()); - icResiCategoryStatsConfigResultDTO.setStatus(item.getStatus()); - icResiCategoryStatsConfigResultDTO.setSort(item.getSort()); - IcResiCategoryWarnConfigEntity warnConfigEntity = warnMap.get(item.getTableName() + "-" + item.getColumnName()); - if(warnConfigEntity==null){ - icResiCategoryStatsConfigResultDTO.setWarn(IcResiCategoryStatsConfigConstant.WARN_NO); - }else{ - icResiCategoryStatsConfigResultDTO.setWarn(IcResiCategoryStatsConfigConstant.WARN_YES); - icResiCategoryStatsConfigResultDTO.setLevel1(warnConfigEntity.getLevel1()); - icResiCategoryStatsConfigResultDTO.setLevel2(warnConfigEntity.getLevel2()); - icResiCategoryStatsConfigResultDTO.setLevel3(warnConfigEntity.getLevel3()); - } - result.add(icResiCategoryStatsConfigResultDTO); + List result = icResiCategoryStatsConfigDao.listInfo(customerId,formDTO.getIsWarn(),formDTO.getLevel()); - }); - if(null == formDTO){ - return result; - } - List collect = new ArrayList<>(); - for (IcResiCategoryStatsConfigResultDTO item:result){ - String isWarn = String.valueOf(formDTO.getIsWarn()); - if(null !=formDTO.getIsWarn() && (!item.getWarn().equals(isWarn))){ - continue; - } - if(null!=formDTO.getLevel()){ - if(1==formDTO.getLevel()&&null==item.getLevel1()){ - continue; - } - if(2==formDTO.getLevel()&&null==item.getLevel2()){ - continue; - } - } - collect.add(item); - - } - - return collect; + return result; } @Override @Transactional(rollbackFor = Exception.class) - public IcResiCategoryStatsConfigResultDTO info(String id) { + public IcResiCategoryStatsConfigResultDTO info(String id,String customerId) { IcResiCategoryStatsConfigResultDTO result =new IcResiCategoryStatsConfigResultDTO(); - IcResiCategoryStatsConfigDTO icResiCategoryStatsConfigDTO = icResiCategoryStatsConfigService.get(id); - if(null == icResiCategoryStatsConfigDTO){ - return result; - } - IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() - .eq(IcResiCategoryWarnConfigEntity::getCustomerId, icResiCategoryStatsConfigDTO.getCustomerId()) - .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) - .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); - -// IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = Optional.ofNullable(entity).orElse(new IcResiCategoryWarnConfigEntity()); - result.setId(icResiCategoryStatsConfigDTO.getId()); - result.setLabel(icResiCategoryStatsConfigDTO.getLabel()); - result.setManagementIcon(icResiCategoryStatsConfigDTO.getManagementIcon()); - result.setDataIcon(icResiCategoryStatsConfigDTO.getDataIcon()); - result.setHouseShowIcon(icResiCategoryStatsConfigDTO.getHouseShowIcon()); - result.setStatus(icResiCategoryStatsConfigDTO.getStatus()); - result.setSort(icResiCategoryStatsConfigDTO.getSort()); - result.setWarn(null==icResiCategoryWarnConfigEntity?IcResiCategoryStatsConfigConstant.WARN_NO:IcResiCategoryStatsConfigConstant.WARN_YES); - if(null!=icResiCategoryWarnConfigEntity){ - result.setLevel1(icResiCategoryWarnConfigEntity.getLevel1()); - result.setLevel2(icResiCategoryWarnConfigEntity.getLevel2()); - result.setLevel3(icResiCategoryWarnConfigEntity.getLevel3()); - } - return result; - + return icResiCategoryStatsConfigDao.info(id,customerId); } @Override @@ -231,42 +176,16 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf icResiCategoryStatsConfigDao.updateById(icResiCategoryStatsConfigEntity); //更新配置预警 - if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ - //更新 - IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() - .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) - .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) - .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); - if(null == icResiCategoryWarnConfigEntity){ - icResiCategoryWarnConfigEntity = new IcResiCategoryWarnConfigEntity(); - icResiCategoryWarnConfigEntity.setCustomerId(customerId); - icResiCategoryWarnConfigEntity.setLabel(icResiCategoryStatsConfigDTO.getLabel()); - icResiCategoryWarnConfigEntity.setTableName(icResiCategoryStatsConfigDTO.getTableName()); - icResiCategoryWarnConfigEntity.setColumnName(icResiCategoryStatsConfigDTO.getColumnName()); - icResiCategoryWarnConfigEntity.setLevel1(formDTO.getLevel1()); - icResiCategoryWarnConfigEntity.setLevel2(formDTO.getLevel2()); - icResiCategoryWarnConfigEntity.setLevel3(formDTO.getLevel3()); - icResiCategoryWarnConfigEntity.setSort(icResiCategoryStatsConfigDTO.getSort()); - icResiCategoryWarnConfigDao.insert(icResiCategoryWarnConfigEntity); - }else{ -// icResiCategoryWarnConfigEntity.setCustomerId(customerId); - icResiCategoryWarnConfigEntity.setLabel(icResiCategoryStatsConfigDTO.getLabel()); - icResiCategoryWarnConfigEntity.setTableName(icResiCategoryStatsConfigDTO.getTableName()); - icResiCategoryWarnConfigEntity.setColumnName(icResiCategoryStatsConfigDTO.getColumnName()); - icResiCategoryWarnConfigEntity.setLevel1(formDTO.getLevel1()); - icResiCategoryWarnConfigEntity.setLevel2(formDTO.getLevel2()); - icResiCategoryWarnConfigEntity.setLevel3(formDTO.getLevel3()); - icResiCategoryWarnConfigEntity.setSort(icResiCategoryStatsConfigDTO.getSort()); - icResiCategoryWarnConfigDao.updateById(icResiCategoryWarnConfigEntity); - } - }else if(IcResiCategoryStatsConfigConstant.WARN_NO.equals(formDTO.getWarn())){ - //删除 - icResiCategoryWarnConfigDao.delete(new QueryWrapper().lambda() - .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) - .eq(IcResiCategoryWarnConfigEntity::getTableName,icResiCategoryStatsConfigDTO.getTableName()) - .eq(IcResiCategoryWarnConfigEntity::getColumnName,icResiCategoryStatsConfigDTO.getColumnName())); - } - + //更新 + IcResiCategoryWarnConfigEntity icResiCategoryWarnConfigEntity = icResiCategoryWarnConfigDao.selectOne(new QueryWrapper().lambda() + .eq(IcResiCategoryWarnConfigEntity::getCustomerId,customerId) + .eq(IcResiCategoryWarnConfigEntity::getTableName, icResiCategoryStatsConfigDTO.getTableName()) + .eq(IcResiCategoryWarnConfigEntity::getColumnName, icResiCategoryStatsConfigDTO.getColumnName())); + icResiCategoryWarnConfigEntity.setWarn(formDTO.getWarn()); + icResiCategoryWarnConfigEntity.setLevel1(formDTO.getLevel1()); + icResiCategoryWarnConfigEntity.setLevel2(formDTO.getLevel2()); + icResiCategoryWarnConfigEntity.setLevel3(formDTO.getLevel3()); + icResiCategoryWarnConfigDao.updateById(icResiCategoryWarnConfigEntity); } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml index 5fb6f245b4..f3afd11c49 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryStatsConfigDao.xml @@ -22,5 +22,54 @@ + + + + \ No newline at end of file diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml index 419adda97c..7fe3679b42 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml +++ b/epmet-module/oper-customize/oper-customize-server/src/main/resources/mapper/IcResiCategoryWarnConfigDao.xml @@ -9,6 +9,7 @@ + From 41d1428f0297ac35eae21c7f4b067fd0644d29a6 Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 23 Nov 2021 10:04:16 +0800 Subject: [PATCH 243/253] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ResiCategoryStatsConfigServiceImpl.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java index 086b9b700f..e95f209aba 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/ResiCategoryStatsConfigServiceImpl.java @@ -56,7 +56,7 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf if(CollectionUtils.isEmpty(icFormItemEntityList)){ return new ArrayList<>(); } - Set groupIds = icFormItemEntityList.stream().filter(item-> !"0".equals(item.getItemGroupId())).map(item->item.getItemGroupId()).collect(Collectors.toSet()); + Set groupIds = icFormItemEntityList.stream().filter(item-> !"0".equals(item.getItemGroupId())).map(IcFormItemEntity::getItemGroupId).collect(Collectors.toSet()); List icFormItemGroupEntityList = new ArrayList<>(); if(!CollectionUtils.isEmpty(groupIds)){ icFormItemGroupEntityList.addAll(icFormItemGroupDao.selectList(new QueryWrapper().lambda().eq(IcFormItemGroupEntity::getCustomerId,customerId).in(IcFormItemGroupEntity::getId, groupIds))); @@ -149,15 +149,11 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf } //4.返回数据 - List result = icResiCategoryStatsConfigDao.listInfo(customerId,formDTO.getIsWarn(),formDTO.getLevel()); - - return result; + return icResiCategoryStatsConfigDao.listInfo(customerId,formDTO.getIsWarn(),formDTO.getLevel()); } @Override - @Transactional(rollbackFor = Exception.class) public IcResiCategoryStatsConfigResultDTO info(String id,String customerId) { - IcResiCategoryStatsConfigResultDTO result =new IcResiCategoryStatsConfigResultDTO(); return icResiCategoryStatsConfigDao.info(id,customerId); } @@ -228,7 +224,5 @@ public class ResiCategoryStatsConfigServiceImpl implements ResiCategoryStatsConf warnConfigEntity.setSort(collect.get(0).getSort()); } icResiCategoryWarnConfigService.updateBatchById(warnConfigEntityList); - - } } From 3bc7126add6685dda729304e7e64ade7856a4b9a Mon Sep 17 00:00:00 2001 From: jianjun Date: Tue, 23 Nov 2021 13:21:04 +0800 Subject: [PATCH 244/253] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E5=9C=B0=E5=9D=80=E6=96=B9=E6=B3=95=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/commons/tools/utils/IpUtils.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IpUtils.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IpUtils.java index d051717d8d..8aabf5f5d9 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IpUtils.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IpUtils.java @@ -12,6 +12,7 @@ import com.epmet.commons.tools.constant.StrConstant; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cloud.commons.util.InetUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -127,12 +128,12 @@ public class IpUtils { * 遍历本地网卡的方式,在云平台虚拟机取不到真正的ip * @return */ - InetAddress localAddress = InetAddress.getLocalHost(); - if (isValidAddress(localAddress)) { - return localAddress.getHostAddress(); + InetUtils inetUtils = SpringContextUtils.getBean(InetUtils.class); + if (inetUtils == null || inetUtils.findFirstNonLoopbackHostInfo() == null) { + logger.warn("Could not get local host ip address"); + } else { + SERVER_IP = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); } - logger.warn("Could not get local host ip address"); - return null; } catch (Exception e) { logger.error("IpUtils getServerIp exception ", e); } From a3733f35cc2c4fd0fb77304c60f7e14989d4f3f9 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Tue, 23 Nov 2021 13:41:47 +0800 Subject: [PATCH 245/253] =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=8F=98=E5=8A=A8=20mq=E6=8E=A8=E9=80=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/constant/SystemMessageType.java | 5 +++ .../impl/SystemMessageServiceImpl.java | 1 + .../controller/IcResiUserController.java | 33 +++++++++++++++++-- .../com/epmet/service/IcResiUserService.java | 4 +-- .../service/impl/IcResiUserServiceImpl.java | 23 +++---------- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java index 4536d6c330..5d6cd6190c 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java @@ -95,4 +95,9 @@ public interface SystemMessageType { */ String IC_RESI_USER_EDIT = "ic_resi_user_edit"; + /** + * 居民信息删除 + */ + String IC_RESI_USER_DEL = "ic_resi_user_del"; + } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java index ee4990405f..c57bd798f6 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java @@ -189,6 +189,7 @@ public class SystemMessageServiceImpl implements SystemMessageService { break; case SystemMessageType.IC_RESI_USER_ADD: case SystemMessageType.IC_RESI_USER_EDIT: + case SystemMessageType.IC_RESI_USER_DEL: topic = TopicConstants.IC_RESI_USER; break; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 7f95af3d76..73d97faf60 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -26,6 +26,7 @@ import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.messages.IcResiUserAddMQMsg; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.constant.NumConstant; @@ -45,11 +46,13 @@ import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.constant.IcResiUserConstant; +import com.epmet.constant.SystemMessageType; import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.enums.IcResiUserTableEnum; import com.epmet.excel.support.ExportResiUserItemDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.OperCustomizeOpenFeignClient; import com.epmet.feign.OssFeignClient; import com.epmet.service.IcResiUserImportService; @@ -114,6 +117,8 @@ public class IcResiUserController { private IcResiUserImportService icResiUserImportService; @Autowired private RedisUtils redisUtils; + @Autowired + private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; { // 初始化上传目录 @@ -144,6 +149,14 @@ public class IcResiUserController { formDTO.setCustomerId(tokenDto.getCustomerId()); ValidatorUtils.validateEntity(formDTO, DelIcResiUserFormDTO.IdGroup.class); icResiUserService.delete(formDTO); + //推送MQ事件 + IcResiUserAddMQMsg mqMsg = new IcResiUserAddMQMsg(); + mqMsg.setCustomerId(tokenDto.getCustomerId()); + mqMsg.setIcResiUser(formDTO.getIcResiUserId()); + SystemMsgFormDTO form = new SystemMsgFormDTO(); + form.setMessageType(SystemMessageType.IC_RESI_USER_DEL); + form.setContent(mqMsg); + epmetMessageOpenFeignClient.sendSystemMsgByMQ(form); return new Result(); } @@ -154,7 +167,15 @@ public class IcResiUserController { **/ @PostMapping("add") public Result add(@LoginUser TokenDto tokenDto, @RequestBody List formDTO) { - icResiUserService.add(tokenDto, formDTO); + String resiUserId = icResiUserService.add(tokenDto, formDTO); + //推送MQ事件 + IcResiUserAddMQMsg mqMsg = new IcResiUserAddMQMsg(); + mqMsg.setCustomerId(tokenDto.getCustomerId()); + mqMsg.setIcResiUser(resiUserId); + SystemMsgFormDTO form = new SystemMsgFormDTO(); + form.setMessageType(SystemMessageType.IC_RESI_USER_ADD); + form.setContent(mqMsg); + epmetMessageOpenFeignClient.sendSystemMsgByMQ(form); return new Result(); } @@ -164,7 +185,15 @@ public class IcResiUserController { **/ @PostMapping("edit") public Result edit(@LoginUser TokenDto tokenDto, @RequestBody List formDTO) { - icResiUserService.edit(tokenDto, formDTO); + String resiUserId = icResiUserService.edit(tokenDto, formDTO); + //推送MQ事件 + IcResiUserAddMQMsg mqMsg = new IcResiUserAddMQMsg(); + mqMsg.setCustomerId(tokenDto.getCustomerId()); + mqMsg.setIcResiUser(resiUserId); + SystemMsgFormDTO form = new SystemMsgFormDTO(); + form.setMessageType(SystemMessageType.IC_RESI_USER_EDIT); + form.setContent(mqMsg); + epmetMessageOpenFeignClient.sendSystemMsgByMQ(form); return new Result(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 52e256105c..2d8a3592bd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -48,13 +48,13 @@ public interface IcResiUserService extends BaseService { * @Author sun * @Description 党建互联平台--保存居民信息 **/ - void add(TokenDto tokenDto, List formDTO); + String add(TokenDto tokenDto, List formDTO); /** * @Author sun * @Description 党建互联平台--修改居民信息 **/ - void edit(TokenDto tokenDto, List formDTO); + String edit(TokenDto tokenDto, List formDTO); /** * @Description 获取房间内人员 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index f82bcf97dc..8b73150513 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -132,7 +132,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { + public String add(TokenDto tokenDto, List formDTO) { //循环自动拼接sql语句,往多个表新增数据 //0.校验必填字段是否为空 Result> resultList = operCustomizeOpenFeignClient.getMustColumn(tokenDto.getCustomerId()); @@ -196,14 +196,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl formDTO) { + public String edit(TokenDto tokenDto, List formDTO) { //1.校验主表数据是否存在 String resiUserId = ""; LinkedHashMap map = new LinkedHashMap<>(); @@ -260,15 +253,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Tue, 23 Nov 2021 14:28:16 +0800 Subject: [PATCH 246/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=201.?= =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0items=E4=B8=ADcolumnName=E5=92=8CcolumnNum?= =?UTF-8?q?=E7=9A=84=E6=8B=BC=E6=8E=A5=EF=BC=8C=E5=85=B1=E5=90=8C=E7=BB=84?= =?UTF-8?q?=E6=88=90columnName?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/IcResiUserImportServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index b2adb20543..f36d746475 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -670,13 +670,16 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res ColumnWrapper columnWrapper = new ColumnWrapper(); + String columnName = item.getColumnName(); + Integer columnNum = item.getColumnNum(); + // 填充options columnWrapper.setItemType(item.getItemType()); columnWrapper.setItemId(item.getItemId()); String groupLabel = item.getGroupLabel(); String combinedLabel = StringUtils.isBlank(groupLabel) ? item.getLabel() : groupLabel.concat(":").concat(item.getLabel()); columnWrapper.setCombinedLabel(combinedLabel); - columnWrapper.setColumnName(item.getColumnName()); + columnWrapper.setColumnName((columnNum == null || columnNum == 0) ? columnName : columnName + columnNum); columnWrapper.setColIndex(entry.getValue()); columnWrapper.setRequired(item.getRequired()); From e4825dee6a3f6ff12cef2b8efcfbc7a8644aeaa2 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 25 Nov 2021 10:40:47 +0800 Subject: [PATCH 247/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=201.?= =?UTF-8?q?=E5=B1=85=E6=B0=91=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/IcResiUserImportServiceImpl.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index f36d746475..9b50c237dd 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -29,6 +29,8 @@ import com.epmet.feign.EpmetAdminOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.service.IcResiUserImportService; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -59,6 +61,15 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res public static final ThreadLocal>> errorRows = new ThreadLocal<>(); public static final ThreadLocal>> skipedRows = new ThreadLocal<>(); + /** + * key: itemId + * value: + * key: option的中文 + * value: options的英文key,也可能是数据id + */ + Cache> itemIdAndOptionsCache = CacheBuilder.newBuilder().maximumSize(500).build(); + + @Autowired private LoginUserUtil loginUserUtil; @@ -212,6 +223,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } finally { skipedRows.remove(); errorRows.remove(); + itemIdAndOptionsCache.invalidateAll(); } } @@ -562,10 +574,13 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res String colValue = options.get(cellContent); columnWrapper.setColValue(colValue); } else { - // remote类型 - - Map options = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId, "saveorupdate"); - String colValue = options.get(cellContent); + // remote类型。优先从缓存取 + Map optionsOfItem = itemIdAndOptionsCache.getIfPresent(columnWrapperEntry.getKey()); + if (optionsOfItem == null || optionsOfItem.size() == 0) { + optionsOfItem = listRemoteOptions(headerColumnWrapper, columnWrapper.getOptionSourceValue(), currUserAgencyId, "saveorupdate"); + itemIdAndOptionsCache.put(columnWrapperEntry.getKey(), optionsOfItem); + } + String colValue = optionsOfItem.get(cellContent); columnWrapper.setColValue(colValue); } } else if ("checkbox".equals(columnWrapper.getItemType())) { From db819d6bccdddc6f7990184a707ef80fe0857123 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 25 Nov 2021 10:42:37 +0800 Subject: [PATCH 248/253] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=9C=80=E6=B1=82?= =?UTF-8?q?=EF=BC=9A=E6=96=B0=E5=A2=9E=E3=80=81=E4=BF=AE=E6=94=B9=E5=B1=85?= =?UTF-8?q?=E6=B0=91=E4=BF=A1=E6=81=AF=EF=BC=8C=E8=BA=AB=E4=BB=BD=E8=AF=81?= =?UTF-8?q?=E5=8F=B7=E5=94=AF=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dao/IcResiUserDao.java | 6 +++++ .../service/impl/IcResiUserServiceImpl.java | 27 ++++++++++++++++--- .../main/resources/mapper/IcResiUserDao.xml | 13 +++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java index 9897d01be7..81cd7bf54e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcResiUserDao.java @@ -18,6 +18,7 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.IcResiUserDTO; import com.epmet.dto.form.ResiUserQueryValueDTO; import com.epmet.dto.result.IcFormResColumnDTO; import com.epmet.dto.result.PersonDataResultDTO; @@ -145,4 +146,9 @@ public interface IcResiUserDao extends BaseDao { Map selectPersonType(@Param("columns")List columns,@Param("customerId")String customerId, @Param("tableName")String tableName,@Param("userId")String userId); + /** + * @Author sun + * @Description 查询居民信息 + **/ + IcResiUserDTO getResiUser(IcResiUserDTO dto); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 8b73150513..26d9810d03 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -49,10 +49,7 @@ import com.epmet.constant.IcResiUserConstant; import com.epmet.constant.SystemMessageType; import com.epmet.constant.UserConstant; import com.epmet.dao.IcResiUserDao; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.IcHouseDTO; -import com.epmet.dto.IcNeighborHoodDTO; -import com.epmet.dto.IcResiCategoryStatsConfigDTO; +import com.epmet.dto.*; import com.epmet.dto.form.*; import com.epmet.dto.form.demand.UserDemandNameQueryFormDTO; import com.epmet.dto.result.*; @@ -169,6 +166,17 @@ public class IcResiUserServiceImpl extends BaseServiceImpl result = govOrgOpenFeignClient.getAgencyById(agencyId); @@ -216,6 +224,17 @@ public class IcResiUserServiceImpl extends BaseServiceImpl + From 2ff6be80a273f401741645f86219e62a6588298f Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 25 Nov 2021 11:17:41 +0800 Subject: [PATCH 249/253] =?UTF-8?q?=E9=98=B2=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/controller/IcResiUserController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 73d97faf60..f703d7304b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -144,6 +144,7 @@ public class IcResiUserController { IC_RESI_DOWNLOAD_DIR = exportDir; } + @NoRepeatSubmit @PostMapping("delete") public Result delete(@LoginUser TokenDto tokenDto, @RequestBody DelIcResiUserFormDTO formDTO) { formDTO.setCustomerId(tokenDto.getCustomerId()); @@ -165,6 +166,7 @@ public class IcResiUserController { * @Author sun * @Description 党建互联平台--保存居民信息 **/ + @NoRepeatSubmit @PostMapping("add") public Result add(@LoginUser TokenDto tokenDto, @RequestBody List formDTO) { String resiUserId = icResiUserService.add(tokenDto, formDTO); @@ -183,6 +185,7 @@ public class IcResiUserController { * @Author sun * @Description 党建互联平台--修改居民信息 **/ + @NoRepeatSubmit @PostMapping("edit") public Result edit(@LoginUser TokenDto tokenDto, @RequestBody List formDTO) { String resiUserId = icResiUserService.edit(tokenDto, formDTO); @@ -395,6 +398,7 @@ public class IcResiUserController { * @date 2021/11/19 4:24 下午 * @remark:分页批量导出 */ + @NoRepeatSubmit @RequestMapping(value = "/exportExcel") public void exportExcelByEasyExcel(@RequestHeader String customerId,@LoginUser TokenDto tokenDto, @RequestBody IcResiUserPageFormDTO pageFormDTO, HttpServletResponse response) throws Exception { //tokenDto.setUserId("9e37adcce6472152e6508a19d3683e02"); From 84705fadcba5998f7d0ee3b80e7b48b9ab82eb6f Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 25 Nov 2021 14:15:15 +0800 Subject: [PATCH 250/253] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 26d9810d03..d2ace7a43d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -173,7 +173,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Thu, 25 Nov 2021 14:46:44 +0800 Subject: [PATCH 251/253] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index d2ace7a43d..58ccc0158d 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -173,7 +173,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Thu, 25 Nov 2021 14:58:20 +0800 Subject: [PATCH 252/253] =?UTF-8?q?=E4=BA=8C=E4=BA=8C=E4=B8=89=E5=9B=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 58ccc0158d..9b3feb7773 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -173,7 +173,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl Date: Thu, 25 Nov 2021 17:30:11 +0800 Subject: [PATCH 253/253] =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ResiCategoryStatsConfigController.java | 6 +++--- .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java index 97059846c6..99b6299afa 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/controller/ResiCategoryStatsConfigController.java @@ -90,13 +90,13 @@ public class ResiCategoryStatsConfigController { if(IcResiCategoryStatsConfigConstant.WARN_YES.equals(formDTO.getWarn())){ //判断level1 和level2 的值 if(null ==level1 || level1==0){ - return new Result().error(EpmetErrorCode.OPERATION_FAILED.getCode(),"黄色预警阈值需大于0"); + return new Result().error(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"黄色预警阈值需大于0"); } if(null == level2 || level2==0){ - return new Result().error(EpmetErrorCode.OPERATION_FAILED.getCode(),"红色预警阈值需大于0"); + return new Result().error(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"红色预警阈值需大于0"); } if(level2<=level1){ - return new Result().error(EpmetErrorCode.OPERATION_FAILED.getCode(),"黄色预警阈值需大于红色预警阈值"); + return new Result().error(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"黄色预警阈值需大于红色预警阈值"); } } resiCategoryStatsConfigService.update(customerId,formDTO); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 9b3feb7773..dfc0185caf 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -32,6 +32,7 @@ import com.epmet.commons.tools.enums.GenderEnum; import com.epmet.commons.tools.enums.HouseTypeEnum; import com.epmet.commons.tools.enums.RelationshipEnum; import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; @@ -173,7 +174,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl