From 932932ea48ca149ca5229f20cc7673a4cd3fc1e0 Mon Sep 17 00:00:00 2001 From: wxz Date: Wed, 13 Oct 2021 17:35:47 +0800 Subject: [PATCH 001/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=201.epmet-d?= =?UTF-8?q?ata-open=E6=A8=A1=E5=9D=97=20=E4=BF=AE=E6=94=B9=EF=BC=9A=201.ep?= =?UTF-8?q?met-message=E6=9C=8D=E5=8A=A1=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=92=88=E5=AF=B9=E5=B7=A5=E4=BD=9C=E4=BA=BA=E5=91=98/?= =?UTF-8?q?=E6=9C=BA=E6=9E=84=E7=9A=84=E5=88=9B=E5=BB=BA/=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=BA=8B=E4=BB=B6=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/ConsomerGroupConstants.java | 10 + .../rocketmq/constants/TopicConstants.java | 11 + .../com/epmet/constant/SystemMessageType.java | 40 +++ .../impl/SystemMessageServiceImpl.java | 12 + .../open-data-worker-client/pom.xml | 15 + .../open-data-worker-server/pom.xml | 258 ++++++++++++++++++ .../epmet/opendata/OpenDataApplication.java | 26 ++ .../NacosServiceListListenerRegisterer.java | 161 +++++++++++ .../opendata/mq/RocketMQConsumerRegister.java | 39 +++ .../OpenDataOrgChangeEventListener.java | 61 +++++ .../OpenDataStaffChangeEventListener.java | 61 +++++ .../src/main/resources/bootstrap.yml | 138 ++++++++++ .../src/main/resources/init_db.sql | 14 + .../src/main/resources/logback-spring.xml | 176 ++++++++++++ epmet-module/open-data-worker/pom.xml | 18 ++ epmet-module/pom.xml | 3 +- 16 files changed, 1042 insertions(+), 1 deletion(-) create mode 100644 epmet-module/open-data-worker/open-data-worker-client/pom.xml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/pom.xml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/NacosServiceListListenerRegisterer.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/init_db.sql create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/logback-spring.xml create mode 100644 epmet-module/open-data-worker/pom.xml 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 890d19acf1..b4dba548b7 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 @@ -45,4 +45,14 @@ public interface ConsomerGroupConstants { */ String POINT_OPERATION_LOG_GROUP = "point_operation_log_group"; + /** + * 开放的对接数据(中间库) 组织变更事件监听器分组 + */ + String OPEN_DATA_ORG_CHANGE_EVENT_LISTENER_GROUP = "open_data_org_change_event_listener_group"; + + /** + * 开放的对接数据(中间库) 工作人员变更事件监听器分组 + */ + String OPEN_DATA_STAFF_CHANGE_EVENT_LISTENER_GROUP = "open_data_staff_change_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 8fe36aa53a..927fa19198 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 @@ -13,6 +13,7 @@ public interface TopicConstants { * 项目变动 */ String PROJECT_CHANGED = "project_changed"; + /** * 小组成就 */ @@ -27,4 +28,14 @@ public interface TopicConstants { * 积分系统话题 */ String POINT = "point"; + + /** + * 组织信息变更 + */ + String ORG = "org"; + + /** + * 工作人员信息变更 + */ + String STAFF = "staff"; } 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 626b081436..e1c59f003e 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 @@ -25,4 +25,44 @@ public interface SystemMessageType { */ String POINT_RULE_CHANGED = "point_rule_changed"; + /** + * 网格新增 + */ + String GRID_CREATE = "grid_create"; + + /** + * 网格信息变更 + */ + String GRID_CHANGE = "grid_change"; + + /** + * agency机构新增 + */ + String AGENCY_CREATE = "agency_create"; + + /** + * agency机构信息变更 + */ + String AGENCY_CHANGE = "agency_change"; + + /** + * 部门新增 + */ + String DEPARTMENT_CREATE = "department_create"; + + /** + * 部门信息变更 + */ + String DEPARTMENT_CHANGE = "department_change"; + + /** + * 工作人员新增 + */ + String STAFF_CREATE = "staff_create"; + + /** + * 工作人员变更 + */ + String STAFF_CHANGE = "staff_change"; + } 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 9c56520419..f7aacf297c 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 @@ -79,6 +79,18 @@ public class SystemMessageServiceImpl implements SystemMessageService { case SystemMessageType.POINT_RULE_CHANGED: topic = TopicConstants.POINT; break; + case SystemMessageType.GRID_CREATE: + case SystemMessageType.GRID_CHANGE: + case SystemMessageType.AGENCY_CREATE: + case SystemMessageType.AGENCY_CHANGE: + case SystemMessageType.DEPARTMENT_CREATE: + case SystemMessageType.DEPARTMENT_CHANGE: + topic = TopicConstants.ORG; + break; + case SystemMessageType.STAFF_CREATE: + case SystemMessageType.STAFF_CHANGE: + topic = TopicConstants.STAFF; + break; } return topic; } diff --git a/epmet-module/open-data-worker/open-data-worker-client/pom.xml b/epmet-module/open-data-worker/open-data-worker-client/pom.xml new file mode 100644 index 0000000000..14be115052 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/pom.xml @@ -0,0 +1,15 @@ + + + + open-data-worker + com.epmet + 2.0.0 + + 4.0.0 + + open-data-worker-client + + + \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml new file mode 100644 index 0000000000..289b030dc7 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -0,0 +1,258 @@ + + + + open-data-worker + com.epmet + 2.0.0 + + 4.0.0 + + open-data-worker-server + + + + com.epmet + epmet-commons-tools + 2.0.0 + + + com.epmet + epmet-commons-mybatis + 2.0.0 + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework + spring-context-support + + + org.springframework.boot + spring-boot-starter-actuator + + + de.codecentric + spring-boot-admin-starter-client + ${spring.boot.admin.version} + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + io.github.openfeign + feign-httpclient + 10.3.0 + + + + + com.epmet + epmet-commons-rocketmq + 2.0.0 + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + ${project.basedir}/src/main/java + + + true + ${basedir}/src/main/resources + + + + + + + dev + + 8117 + dev + + + + + + epmet_open_data_user + EpmEt-db-UsEr + + 0 + 192.168.1.140 + 6379 + 123456 + + true + 192.168.1.140:8848 + 1fecc730-5e6e-464c-aae9-7567944e7936 + + + false + + + true + + + false + + + https://oapi.dingtalk.com/robot/send?access_token=e894e5690f9d6a527722974c71548ff6c0fe29bd956589a09e21b16442a35ed4 + SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd + + + true + 192.168.1.140:9876;192.168.1.141:9876 + + + + local + + true + + + 8117 + local + + + + + + epmet_open_data_user + EpmEt-db-UsEr + + 0 + 192.168.1.140 + 6379 + 123456 + + false + 192.168.1.140:8848 + 1fecc730-5e6e-464c-aae9-7567944e7936 + + + false + + + false + + + false + + + https://oapi.dingtalk.com/robot/send?access_token=e894e5690f9d6a527722974c71548ff6c0fe29bd956589a09e21b16442a35ed4 + SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd + + + false + 192.168.1.140:9876;192.168.1.141:9876 + + + + test + + + 8117 + test + + + + + + epmet + elink@833066 + + 0 + r-m5eoz5b6tkx09y6bpz.redis.rds.aliyuncs.com + 6379 + EpmEtrEdIs!q@w + + true + 192.168.10.150:8848 + 67e3c350-533e-4d7c-9f8f-faf1b4aa82ae + + + false + + + true + + + true + + + https://oapi.dingtalk.com/robot/send?access_token=e894e5690f9d6a527722974c71548ff6c0fe29bd956589a09e21b16442a35ed4 + SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd + + + true + 192.168.10.161:9876 + + + + prod + + 8117 + prod + + + + + + epmet_open_data_user + EpmEt-db-UsEr + + 0 + r-m5ez3n1j0qc3ykq2ut.redis.rds.aliyuncs.com + 6379 + EpmEtclOUdrEdIs!Q2w + + true + 192.168.11.180:8848 + bd205d23-e696-47be-b995-916313f86e99 + + + false + + + true + + + true + + + https://oapi.dingtalk.com/robot/send?access_token=a5f66c3374b1642fe2142dbf56d5997e280172d4e8f2b546c9423a68c82ece6c + SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1 + + + true + 192.168.11.187:9876;192.168.11.184:9876 + + + + + \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java new file mode 100644 index 0000000000..bb8ff976ac --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java @@ -0,0 +1,26 @@ +package com.epmet.opendata; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; + +/** + * @Description OpenData服务启动类 + * 注意:此处要使用@ComponentScan的原因是,启动类处于包com.epmet.opendata下,想用com.epmet.commons包下的一些Spring对象,需要 + * 手动指定扫描包,否则无法扫描 + * @author wxz + * @date 2021.10.13 15:16:05 +*/ +@SpringBootApplication +@EnableDiscoveryClient +@EnableFeignClients +@ServletComponentScan +@ComponentScan(value = { "com.epmet.opendata", "com.epmet.commons" }) +public class OpenDataApplication { + public static void main(String[] args) { + SpringApplication.run(OpenDataApplication.class, args); + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/NacosServiceListListenerRegisterer.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/NacosServiceListListenerRegisterer.java new file mode 100644 index 0000000000..a25220cbfb --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/NacosServiceListListenerRegisterer.java @@ -0,0 +1,161 @@ +package com.epmet.opendata.config; + +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.listener.Event; +import com.alibaba.nacos.api.naming.listener.EventListener; +import com.alibaba.nacos.api.naming.listener.NamingEvent; +import com.alibaba.nacos.api.naming.pojo.ListView; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.netflix.loadbalancer.DynamicServerListLoadBalancer; +import com.netflix.loadbalancer.ILoadBalancer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.netflix.ribbon.SpringClientFactory; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; + +/** + * @author wxz + * @Description Nacos服务列表刷新监听注册器 + * @date 2021.09.22 14:33:11 + */ +@Slf4j +@Configuration +@ConditionalOnProperty(prefix = "spring.cloud.nacos.discovery.serviceListChangedListening", name = "enable", havingValue = "true", matchIfMissing = false) +public class NacosServiceListListenerRegisterer { + + public static final String REFRESH_SERVER_LIST_METHOD_NAME = "restOfInit"; + // 服务列表拉取间隔:10s + public static final long SERVICE_LIST_PULLING_DELAY_SECONDS = 10; + + private NamingService namingService; + + private ScheduledExecutorService executor; + + @Autowired + private NacosDiscoveryProperties discoveryProperties; + + @Autowired + private SpringClientFactory springClientFactory; + + // 监听中的服务列表 + private List observingServers = new ArrayList<>(33); + + @PostConstruct + public void init() { + namingService = discoveryProperties.namingServiceInstance(); + // 启动监听 + executor = new ScheduledThreadPoolExecutor(2, new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r); + thread.setDaemon(true); + thread.setName("NacosServiceListWatchingRegisterer"); + return thread; + } + }); + + // 立即启动,并15s刷新一次服务列表,用于新服务列表的发现 + ScheduledFuture future = executor.scheduleAtFixedRate(new EpmetNacosServiceListListener(), 0, SERVICE_LIST_PULLING_DELAY_SECONDS, TimeUnit.SECONDS); + } + + public class EpmetNacosServiceListListener implements Runnable { + + @Override + public void run() { + doRefreshServerList(); + } + + /** + * @param + * @return + * @description 执行刷新 + * @author wxz + * @date 2021.09.22 16:04:49 + */ + private synchronized void doRefreshServerList() { + ListView serviceListView = null; + try { + serviceListView = namingService.getServicesOfServer(1, 100); + //启动监听 + if (serviceListView == null || serviceListView.getCount() == 0) { + log.info("【Nacos服务列表定时刷新】当前无任何可添加监听的服务"); + return; + } + List serviceList = serviceListView.getData(); + log.info("【Nacos服务列表定时刷新】Nacos服务端服务列表: {}", serviceList); + + for (String service : serviceList) { + try { + + // 如果该服务已经在监听列表中存在了,则不再注册监听。注:不能取消空服务的监听,因为空服务随时可能恢复运行,需要实时监听。 + if (observingServers.contains(service)) { + continue; + } + + namingService.subscribe(service, new EventListener() { + @Override + public void onEvent(Event event) { + if (event instanceof NamingEvent) { + NamingEvent namingEvent = (NamingEvent) event; + log.info("【Nacos服务列表刷新监听】收到事件:{}:[{}]", namingEvent.getServiceName(), namingEvent.getInstances()); + doRefreshServerList(service); + } + } + }); + + // 将该服务加入到监听列表中 + observingServers.add(service); + } catch (NacosException e) { + String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); + log.error("【Nacos服务列表定时刷新】订阅ApplicationContext的刷新事件失败,错误信息:{}", errorStackTrace); + } + } + + } catch (NacosException e) { + String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); + log.error("【Nacos服务列表定时刷新】链接Nacos服务端失败,错误信息:{}", errorStackTrace); + } + } + + /** + * @param serviceName + * @return + * @description 刷新ServerList + * @author wxz + * @date 2021.09.22 09:29:16 + */ + private void doRefreshServerList(String serviceName) { + // 刷新方式1:反射调用DynamicServerListLoadBalancer中的restOfInit()方法。该方法原来只执行一次,此处不推荐用 + //ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName); + //if (loadBalancer instanceof ZoneAwareLoadBalancer) { + // ZoneAwareLoadBalancer zaLoadBalancer = (ZoneAwareLoadBalancer) loadBalancer; + // IClientConfig clientConfig = springClientFactory.getClientConfig(serviceName); + // try { + // Method restOfInitMethod = zaLoadBalancer.getClass().getSuperclass().getDeclaredMethod(REFRESH_SERVER_LIST_METHOD_NAME, IClientConfig.class); + // restOfInitMethod.setAccessible(true); + // restOfInitMethod.invoke(zaLoadBalancer, clientConfig); + // } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + // String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); + // log.error("【LoadBalancer刷新服务列表】失败:{}", errorStackTrace); + // } + //} + + // 刷新方式2:DynamicServerListLoadBalancer#updateListOfServers()该方法为ribbon定时刷新服务列表的时候真正调用的方法,但是加了@VisibleForTesting + // 暂且 1 try + ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName); + if (loadBalancer instanceof DynamicServerListLoadBalancer) { + DynamicServerListLoadBalancer dslb = (DynamicServerListLoadBalancer) loadBalancer; + dslb.updateListOfServers(); + } + } + } + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java new file mode 100644 index 0000000000..ede4eeb83a --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java @@ -0,0 +1,39 @@ +package com.epmet.opendata.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.opendata.mq.listener.OpenDataOrgChangeEventListener; +import com.epmet.opendata.mq.listener.OpenDataStaffChangeEventListener; +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 RocketMQConsumerRegister extends MQAbstractRegister { + + @Override + public void registerAllListeners(String env, MQConsumerProperties consumerProperties) { + // 客户初始化监听器注册 + register(consumerProperties, + ConsomerGroupConstants.OPEN_DATA_ORG_CHANGE_EVENT_LISTENER_GROUP, + MessageModel.CLUSTERING, + TopicConstants.ORG, + "*", + new OpenDataOrgChangeEventListener()); + + register(consumerProperties, + ConsomerGroupConstants.OPEN_DATA_STAFF_CHANGE_EVENT_LISTENER_GROUP, + MessageModel.CLUSTERING, + TopicConstants.STAFF, + "*", + new OpenDataStaffChangeEventListener()); + + // ...其他监听器类似 + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java new file mode 100644 index 0000000000..17cc9eca72 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -0,0 +1,61 @@ +package com.epmet.opendata.mq.listener; + +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +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; + +/** + * @Description 系统对接中间库,组织信息变更监听器 + * @author wxz + * @date 2021.10.13 15:21:48 +*/ +public class OpenDataOrgChangeEventListener implements MessageListenerConcurrently { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + 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 tags = messageExt.getTags(); + + logger.info("【开放数据事件监听器】-组织信息变更-收到消息内容:{},操作:{}", msg, tags); + + DistributedLock distributedLock = null; + RLock lock = null; + try { + //distributedLock = SpringContextUtils.getBean(DistributedLock.class); + //lock = distributedLock.getLock(String.format("lock:open_data_org:%s", orgId), + // 30L, 30L, TimeUnit.SECONDS); + } catch (RenException e) { + // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 + logger.error("【开放数据事件监听器】-组织信息变更-同步信息到中间库失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + } catch (Exception e) { + // 不是我们自己抛出的异常,可以让MQ重试 + logger.error("【开放数据事件监听器】-组织信息变更-同步信息到中间库失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + throw e; + } finally { + //distributedLock.unLock(lock); + } + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java new file mode 100644 index 0000000000..b8f0be40bd --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java @@ -0,0 +1,61 @@ +package com.epmet.opendata.mq.listener; + +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +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; + +/** + * @Description 系统对接中间库,工作人员信息变更监听器 + * @author wxz + * @date 2021.10.13 15:21:48 +*/ +public class OpenDataStaffChangeEventListener implements MessageListenerConcurrently { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + 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 tags = messageExt.getTags(); + + logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}", msg, tags); + + DistributedLock distributedLock = null; + RLock lock = null; + try { + //distributedLock = SpringContextUtils.getBean(DistributedLock.class); + //lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", staffId), + // 30L, 30L, TimeUnit.SECONDS); + } catch (RenException e) { + // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 + logger.error("【开放数据事件监听器】-工作人员信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + } catch (Exception e) { + // 不是我们自己抛出的异常,可以让MQ重试 + logger.error("【开放数据事件监听器】-工作人员信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + throw e; + } finally { + //distributedLock.unLock(lock); + } + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml new file mode 100644 index 0000000000..59302e27eb --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml @@ -0,0 +1,138 @@ +server: + port: @server.port@ + version: @version@ + servlet: + context-path: /opendata + +spring: + main: + allow-bean-definition-overriding: true + application: + name: open-data-server + #环境 dev|test|prod + profiles: + active: @spring.profiles.active@ + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + redis: + database: @spring.redis.index@ + host: @spring.redis.host@ + port: @spring.redis.port@ + password: @spring.redis.password@ + timeout: 30s + datasource: + druid: + #MySQL + driver-class-name: com.mysql.cj.jdbc.Driver + url: @spring.datasource.druid.url@ + username: @spring.datasource.druid.username@ + password: @spring.datasource.druid.password@ + cloud: + nacos: + discovery: + server-addr: @nacos.server-addr@ + #nacos的命名空间ID,默认是public + namespace: @nacos.discovery.namespace@ + #不把自己注册到注册中心的地址 + register-enabled: @nacos.register-enabled@ + ip: @nacos.ip@ + serviceListChangedListening: + enable: @nacos.service-list-changed-listening.enable@ + config: + enabled: @nacos.config-enabled@ + server-addr: @nacos.server-addr@ + namespace: @nacos.config.namespace@ + group: @nacos.config.group@ + file-extension: yaml + #指定共享配置,且支持动态刷新 +# ext-config: +# - data-id: datasource.yaml +# group: ${spring.cloud.nacos.config.group} +# refresh: true +# - data-id: common.yaml +# group: ${spring.cloud.nacos.config.group} +# refresh: true + + # 数据迁移工具flyway + flyway: + enabled: @spring.flyway.enabled@ + locations: classpath:db/migration + url: @spring.datasource.druid.url@ + user: @spring.datasource.druid.username@ + password: @spring.datasource.druid.password@ + baseline-on-migrate: true + baseline-version: 0 + + +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + +mybatis-plus: + mapper-locations: classpath:/mapper/**/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.epmet.entity + global-config: + #数据库相关配置 + db-config: + #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; + id-type: ID_WORKER + #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" + field-strategy: NOT_NULL + #驼峰下划线转换 + column-underline: true + banner: false + #原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + jdbc-type-for-null: 'null' + +feign: + hystrix: + enabled: true + client: + config: + default: + loggerLevel: BASIC + okhttp: + enabled: true + +hystrix: + command: + default: + execution: + isolation: + thread: + timeoutInMilliseconds: 60000 #缺省为1000 + +ribbon: + ReadTimeout: 300000 + ConnectTimeout: 300000 + +#pageHelper分页插件 +pagehelper: + helper-dialect: mysql + reasonable: false #分页合理化配置,例如输入页码为-1,则自动转化为最小页码1 + +#feign 日志需要该配置 +logging: + level: + com.epmet: debug + +dingTalk: + robot: + webHook: @dingTalk.robot.webHook@ + secret: @dingTalk.robot.secret@ + +rocketmq: + # 是否开启mq + enable: @rocketmq.enable@ + name-server: @rocketmq.nameserver@ \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/init_db.sql b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/init_db.sql new file mode 100644 index 0000000000..ac7d9c109c --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/init_db.sql @@ -0,0 +1,14 @@ +create database epmet_open_data default character set utf8mb4 collate utf8mb4_general_ci; + +-- 开发环境的脚本 +CREATE USER epmet_open_data_user@'%' IDENTIFIED BY 'EpmEt-db-UsEr'; +GRANT ALL ON `epmet_open_data`.* TO 'epmet_open_data_user'@'%'; +flush privileges; + + + +-- 测试环境的脚本 + + + +-- 生产环境的数据 \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/logback-spring.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000..bcbff37445 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/logback-spring.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + ${appname} + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${log.path}/debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${log.path}/info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${log.path}/warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${log.path}/error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + ${webHook} + ${secret} + ${appname} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/epmet-module/open-data-worker/pom.xml b/epmet-module/open-data-worker/pom.xml new file mode 100644 index 0000000000..97fe762b08 --- /dev/null +++ b/epmet-module/open-data-worker/pom.xml @@ -0,0 +1,18 @@ + + + + epmet-module + com.epmet + 2.0.0 + + 4.0.0 + + open-data-worker + pom + + open-data-worker-client + open-data-worker-server + + \ No newline at end of file diff --git a/epmet-module/pom.xml b/epmet-module/pom.xml index 56b1452eec..8b9efdfdb8 100644 --- a/epmet-module/pom.xml +++ b/epmet-module/pom.xml @@ -44,6 +44,7 @@ epmet-point epmet-ext data-aggregator - + open-data-worker + From e7c347d1f3985329122edfa1825ee6d8b29dfcb7 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 14 Oct 2021 10:28:34 +0800 Subject: [PATCH 002/177] =?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 --- .../epmet/dto/org/AgencyBaseInfoFormDTO.java | 29 +++++++++ .../epmet/dto/org/GridBaseInfoFormDTO.java | 29 +++++++++ .../epmet/dto/user/StaffBaseInfoFormDTO.java | 29 +++++++++ .../controller/DataReportingController.java | 60 +++++++++++++++++++ .../epmet/service/DataReportingService.java | 35 +++++++++++ .../impl/DataReportingServiceImpl.java | 60 +++++++++++++++++++ 6 files changed, 242 insertions(+) create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java create mode 100644 epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java create mode 100644 epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java new file mode 100644 index 0000000000..c3e98287ad --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java @@ -0,0 +1,29 @@ +package com.epmet.dto.org; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @dscription 插叙客户网格基础信息--接口入参 + * @author sun + */ +@Data +public class AgencyBaseInfoFormDTO implements Serializable { + + private static final long serialVersionUID = -3634745091993094743L; + /** + * 客户Id + */ + @NotBlank(message = "事件标识不能为空", groups = {Agency.class}) + private String customerId = ""; + /** + * 组织Id + */ + private List agencyIdList; + public interface Agency extends CustomerClientShowGroup {} + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java new file mode 100644 index 0000000000..583ac9cdf5 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java @@ -0,0 +1,29 @@ +package com.epmet.dto.org; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @dscription 插叙客户网格基础信息--接口入参 + * @author sun + */ +@Data +public class GridBaseInfoFormDTO implements Serializable { + + private static final long serialVersionUID = -3634745091993094743L; + /** + * 客户Id + */ + @NotBlank(message = "事件标识不能为空", groups = {Grid.class}) + private String customerId = ""; + /** + * 网格Id + */ + private List GridIdList; + public interface Grid extends CustomerClientShowGroup {} + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java new file mode 100644 index 0000000000..fca748f654 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java @@ -0,0 +1,29 @@ +package com.epmet.dto.user; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @dscription 插叙客户网格人员基础信息--接口入参 + * @author sun + */ +@Data +public class StaffBaseInfoFormDTO implements Serializable { + + private static final long serialVersionUID = -3634745091993094743L; + /** + * 客户Id + */ + @NotBlank(message = "事件标识不能为空", groups = {Staff.class}) + private String customerId = ""; + /** + * 人员Id + */ + private List staffIdList; + public interface Staff extends CustomerClientShowGroup {} + +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java new file mode 100644 index 0000000000..1632ef903a --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -0,0 +1,60 @@ +package com.epmet.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.CustomerGridDTO; +import com.epmet.dto.CustomerStaffDTO; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.service.DataReportingService; +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; + +/** + * @dscription 省网格化平台数据上报--数据查询 + * @author sun + */ +@RequestMapping("datareporting") +@RestController +public class DataReportingController { + @Autowired + private DataReportingService dataReportingService; + + /** + * @Author sun + * @Description 批量查询客户组织基础信息 + **/ + @PostMapping("agencybaseinfo") + public Result> getAgencyBaseInfo(@RequestBody(required = false) AgencyBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, AgencyBaseInfoFormDTO.Agency.class); + return new Result>().ok(dataReportingService.getAgencyBaseInfo(formDTO)); + } + + /** + * @Author sun + * @Description 批量查询客户网格基础信息 + **/ + @PostMapping("gridbaseinfo") + public Result> getGridBaseInfo(@RequestBody(required = false) GridBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, GridBaseInfoFormDTO.Grid.class); + return new Result>().ok(dataReportingService.getGridBaseInfo(formDTO)); + } + + /** + * @Author sun + * @Description 批量查询客户网格人员基础信息 + **/ + @PostMapping("staffbaseinfo") + public Result> getStaffBaseInfo(@RequestBody(required = false) StaffBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class); + return new Result>().ok(dataReportingService.getStaffBaseInfo(formDTO)); + } + +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java new file mode 100644 index 0000000000..e1bb8f1c53 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -0,0 +1,35 @@ +package com.epmet.service; + +import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.CustomerGridDTO; +import com.epmet.dto.CustomerStaffDTO; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.user.StaffBaseInfoFormDTO; + +import java.util.List; + +/** + * @dscription 省网格化平台数据上报--数据查询 + * @author sun + */ +public interface DataReportingService { + /** + * @Author sun + * @Description 批量查询客户组织基础信息 + **/ + List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); + + /** + * @Author sun + * @Description 批量查询客户网格基础信息 + **/ + List getGridBaseInfo(GridBaseInfoFormDTO formDTO); + + /** + * @Author sun + * @Description 批量查询客户网格人员基础信息 + **/ + List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); + +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java new file mode 100644 index 0000000000..528cc90542 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -0,0 +1,60 @@ +package com.epmet.service.impl; + +import com.epmet.dto.CustomerAgencyDTO; +import com.epmet.dto.CustomerGridDTO; +import com.epmet.dto.CustomerStaffDTO; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.service.DataReportingService; +import com.epmet.service.org.CustomerAgencyService; +import com.epmet.service.org.CustomerGridService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @dscription 省网格化平台数据上报--数据查询 + * @author sun + */ +@Slf4j +@Service +public class DataReportingServiceImpl implements DataReportingService { + @Autowired + private CustomerAgencyService customerAgencyService; + @Autowired + private CustomerGridService customerGridService; + + /** + * @Author sun + * @Description 批量查询客户组织基础信息 + **/ + @Override + public List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { + //批量查询客户组织信息 + return null; + } + + /** + * @Author sun + * @Description 批量查询客户网格基础信息 + **/ + @Override + public List getGridBaseInfo(GridBaseInfoFormDTO formDTO) { + //批量查询客户网格信息 + return null; + } + + /** + * @Author sun + * @Description 批量查询客户网格人员基础信息 + **/ + @Override + public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { + //批量查询客户网格人员信息 + return null; + } + +} From 6abd984d8fc4e523dfe2cd0b23193bdc91c46fb0 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 14 Oct 2021 10:47:01 +0800 Subject: [PATCH 003/177] =?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 --- .../dto/org/result/CustomerAgencyDTO.java | 145 ++++++++++++++++++ .../epmet/dto/org/result/CustomerGridDTO.java | 129 ++++++++++++++++ .../feign/DataStatisticalOpenFeignClient.java | 35 ++++- ...ataStatisticalOpenFeignClientFallBack.java | 23 +++ .../controller/DataReportingController.java | 6 +- .../epmet/service/DataReportingService.java | 15 +- .../impl/DataReportingServiceImpl.java | 15 +- 7 files changed, 351 insertions(+), 17 deletions(-) create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java new file mode 100644 index 0000000000..c78138e9bf --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java @@ -0,0 +1,145 @@ +/** + * 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.org.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 机关单位信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2020-04-20 + */ +@Data +public class CustomerAgencyDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * 上级组织机构ID + */ + private String pid; + + /** + * 所有上级组织机构ID(以英文:隔开) + */ + private String pids; + + /** + * 所有上级名称,以-连接 + */ + private String allParentName; + + /** + * 组织名称 + */ + private String organizationName; + + /** + * 机关级别(社区级:community, +乡(镇、街道)级:street, +区县级: district, +市级: city +省级:province) 机关级别(社区级:community,乡(镇、街道)级:street,区县级: district,市级: city省级:province) + */ + private String level; + + /** + * 地区编码 + */ + private String areaCode; + + /** + * 删除标识 + */ + private String delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 总人数 + */ + private Integer totalUser; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 区县 + */ + private String district; + + /** + * 当前组织的上级行政地区编码add0204;举例平阴县对应的是济南市3701 + */ + private String parentAreaCode; + + /** + * 街道 + */ + private String street; + + /** + * 社区 + */ + private String community; +} \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java new file mode 100644 index 0000000000..bcff1ea7b0 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java @@ -0,0 +1,129 @@ +/** + * 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.org.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 客户网格表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2020-03-16 + */ +@Data +public class CustomerGridDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID 唯一标识 + */ + private String id; + + /** + * 客户ID + */ + private String customerId; + + /** + * 网格名称 + */ + private String gridName; + + /** 组织-网格 */ + private String gridNamePath; + + /** + * 中心位置经度 + */ + private String longitude; + + /** + * 中心位置纬度 + */ + private String latitude; + + /** + * 所属地区码(所属组织地区码) + */ + private String areaCode; + + /** + * 删除标识:0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 管辖区域 + */ + private String manageDistrict; + + /** + * 当前网格总人数 + */ + private Integer totalUser; + + /** + * 所属组织机构ID(customer_organization.id) + */ + private String pid; + + /** + * 所有上级组织ID + */ + private String pids; + + /** + * 所属组织机构名 + */ + private String agencyName; + + /** + * 所有上级组织名 + */ + private String allParentName; +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index 93d81104d5..e4a7e94dd6 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -3,17 +3,27 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.StatsFormDTO; -import com.epmet.dto.extract.form.*; +import com.epmet.dto.extract.form.BizDataFormDTO; +import com.epmet.dto.extract.form.ExtractIndexFormDTO; +import com.epmet.dto.extract.form.ExtractOriginFormDTO; +import com.epmet.dto.extract.form.ExtractScreenFormDTO; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; -import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBack; +import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.List; + /** * desc: 数据统计 对外feign client * @@ -274,4 +284,25 @@ public interface DataStatisticalOpenFeignClient { */ @PostMapping("/data/stats/statsgroup/groupandhottopic") Result groupAndHotTopicTask(@RequestBody GroupTotalFormDTO formDTO); + + /** + * @dscription 批量查询客户组织基础信息 + * @author sun + */ + @PostMapping("/data/stats/datareporting/agencybaseinfo") + Result> getAgencyBaseInfo(@RequestBody AgencyBaseInfoFormDTO formDTO); + + /** + * @dscription 批量查询客户组织基础信息 + * @author sun + */ + @PostMapping("/data/stats/datareporting/gridbaseinfo") + Result> getGridBaseInfo(@RequestBody GridBaseInfoFormDTO formDTO); + + /** + * @dscription 批量查询客户组织基础信息 + * @author sun + */ + @PostMapping("/data/stats/datareporting/staffbaseinfo") + Result> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java index 7bf37b9ce7..dd8e5ada80 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java @@ -7,11 +7,19 @@ import com.epmet.dto.StatsFormDTO; import com.epmet.dto.extract.form.*; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; +import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.feign.DataStatisticalOpenFeignClient; import org.springframework.stereotype.Component; +import java.util.List; + /** * desc: * @@ -265,4 +273,19 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp public Result groupAndHotTopicTask(GroupTotalFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "groupAndHotTopic", formDTO); } + + @Override + public Result> getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getAgencyBaseInfo", formDTO); + } + + @Override + public Result> getGridBaseInfo(GridBaseInfoFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getGridBaseInfo", formDTO); + } + + @Override + public Result> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getStaffBaseInfo", formDTO); + } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index 1632ef903a..129c44d2aa 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -2,12 +2,12 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.CustomerGridDTO; -import com.epmet.dto.CustomerStaffDTO; import com.epmet.dto.org.AgencyBaseInfoFormDTO; import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.service.DataReportingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index e1bb8f1c53..779b430eeb 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -1,11 +1,11 @@ package com.epmet.service; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.CustomerGridDTO; -import com.epmet.dto.CustomerStaffDTO; import com.epmet.dto.org.AgencyBaseInfoFormDTO; import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.result.CustomerStaffDTO; import java.util.List; @@ -17,19 +17,22 @@ public interface DataReportingService { /** * @Author sun * @Description 批量查询客户组织基础信息 - **/ + * + * @return*/ List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); /** * @Author sun * @Description 批量查询客户网格基础信息 - **/ + * + * @return*/ List getGridBaseInfo(GridBaseInfoFormDTO formDTO); /** * @Author sun * @Description 批量查询客户网格人员基础信息 - **/ + * + * @return*/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 528cc90542..8aa77bc4d4 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -1,11 +1,11 @@ package com.epmet.service.impl; -import com.epmet.dto.CustomerAgencyDTO; -import com.epmet.dto.CustomerGridDTO; -import com.epmet.dto.CustomerStaffDTO; import com.epmet.dto.org.AgencyBaseInfoFormDTO; import com.epmet.dto.org.GridBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.service.DataReportingService; import com.epmet.service.org.CustomerAgencyService; import com.epmet.service.org.CustomerGridService; @@ -30,7 +30,8 @@ public class DataReportingServiceImpl implements DataReportingService { /** * @Author sun * @Description 批量查询客户组织基础信息 - **/ + * + * @return*/ @Override public List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { //批量查询客户组织信息 @@ -40,7 +41,8 @@ public class DataReportingServiceImpl implements DataReportingService { /** * @Author sun * @Description 批量查询客户网格基础信息 - **/ + * + * @return*/ @Override public List getGridBaseInfo(GridBaseInfoFormDTO formDTO) { //批量查询客户网格信息 @@ -50,7 +52,8 @@ public class DataReportingServiceImpl implements DataReportingService { /** * @Author sun * @Description 批量查询客户网格人员基础信息 - **/ + * + * @return*/ @Override public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { //批量查询客户网格人员信息 From 782fff7245a4a85efdd6dcfc7ffdd127d15a1edc Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 14 Oct 2021 11:06:41 +0800 Subject: [PATCH 004/177] =?UTF-8?q?=E7=BB=84=E7=BB=87=E3=80=81=E7=BD=91?= =?UTF-8?q?=E6=A0=BC=E3=80=81=E4=BA=BA=E5=91=98=E5=9F=BA=E7=A1=80=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=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 --- .../epmet/dto/org/GridBaseInfoFormDTO.java | 2 +- .../com/epmet/dao/org/CustomerGridDao.java | 8 +++++++ .../epmet/dao/org/StatsCustomerAgencyDao.java | 8 +++++++ .../main/java/com/epmet/dao/user/UserDao.java | 7 +++++++ .../impl/DataReportingServiceImpl.java | 21 +++++++++++-------- .../service/org/CustomerAgencyService.java | 7 +++++++ .../service/org/CustomerGridService.java | 7 +++++++ .../org/impl/CustomerAgencyServiceImpl.java | 12 +++++++++++ .../org/impl/CustomerGridServiceImpl.java | 11 ++++++++++ .../com/epmet/service/user/UserService.java | 7 +++++++ .../service/user/impl/UserServiceImpl.java | 10 +++++++++ .../resources/mapper/org/CustomerGridDao.xml | 13 ++++++++++++ .../mapper/org/StatsCustomerAgencyDao.xml | 14 +++++++++++++ .../main/resources/mapper/user/UserDao.xml | 13 ++++++++++++ 14 files changed, 130 insertions(+), 10 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java index 583ac9cdf5..7aaaa77078 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java @@ -23,7 +23,7 @@ public class GridBaseInfoFormDTO implements Serializable { /** * 网格Id */ - private List GridIdList; + private List gridIdList; public interface Grid extends CustomerClientShowGroup {} } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java index a2123a127f..57f5119ad5 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java @@ -22,7 +22,9 @@ import com.epmet.dto.group.AgencyDTO; import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.GridInfoDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.entity.org.CustomerGridEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -95,4 +97,10 @@ public interface CustomerGridDao extends BaseDao { * @Description 查询客户已删除网格列表 **/ List selectDelGridList(@Param("customerId") String customerId); + + /** + * @Author sun + * @Description 批量查询客户网格基础信息 + **/ + List getGridBaseInfo(GridBaseInfoFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java index 5745ff7cca..f03cfc9cf4 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java @@ -2,6 +2,8 @@ package com.epmet.dao.org; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.AgencySubTreeDto; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.org.CustomerAgencyEntity; @@ -71,4 +73,10 @@ public interface StatsCustomerAgencyDao extends BaseDao { CustomerAgencyEntity selectByDeptId(String deptId); CustomerAgencyEntity selecByAreaCode(@Param("customerId")String customerId, @Param("areaCode")String areaCode); + + /** + * @Author sun + * @Description 批量查询客户组织基础信息 + **/ + List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java index 8e03a5abc2..8501780460 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java @@ -5,6 +5,7 @@ import com.epmet.dto.extract.form.StaffPatrolStatsFormDTO; import com.epmet.dto.extract.result.UserPartyResultDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; +import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; import org.apache.ibatis.annotations.Mapper; @@ -252,5 +253,11 @@ public interface UserDao { * @author sun */ int saveOrUpGmUploadEvent(@Param("list") List list); + + /** + * @Author sun + * @Description 批量查询客户网格人员基础信息 + **/ + List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 8aa77bc4d4..5e626d3304 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -9,6 +9,7 @@ import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.service.DataReportingService; import com.epmet.service.org.CustomerAgencyService; import com.epmet.service.org.CustomerGridService; +import com.epmet.service.user.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -26,38 +27,40 @@ public class DataReportingServiceImpl implements DataReportingService { private CustomerAgencyService customerAgencyService; @Autowired private CustomerGridService customerGridService; + @Autowired + private UserService userService; /** * @Author sun * @Description 批量查询客户组织基础信息 - * - * @return*/ + **/ @Override public List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { //批量查询客户组织信息 - return null; + List resultList = customerAgencyService.getAgencyBaseInfo(formDTO); + return resultList; } /** * @Author sun * @Description 批量查询客户网格基础信息 - * - * @return*/ + **/ @Override public List getGridBaseInfo(GridBaseInfoFormDTO formDTO) { //批量查询客户网格信息 - return null; + List resultList = customerGridService.getGridBaseInfo(formDTO); + return resultList; } /** * @Author sun * @Description 批量查询客户网格人员基础信息 - * - * @return*/ + **/ @Override public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { //批量查询客户网格人员信息 - return null; + List resultList = userService.getStaffBaseInfo(formDTO); + return resultList; } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java index 60991b69bf..0e0c4eb882 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java @@ -1,5 +1,7 @@ package com.epmet.service.org; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.org.CustomerAgencyEntity; @@ -58,4 +60,9 @@ public interface CustomerAgencyService { */ void sysAgencyInfo(String fromCustomerId, String toCustomerId); + /** + * @Author sun + * @Description 批量查询客户组织基础信息 + **/ + List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java index 2da4de7518..7078cc19da 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java @@ -5,7 +5,9 @@ import com.epmet.dto.group.AgencyDTO; import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.GridInfoDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.entity.org.CustomerGridEntity; import java.util.Date; @@ -77,4 +79,9 @@ public interface CustomerGridService extends BaseService { **/ List getdelGridProjectIdList(String customerId); + /** + * @Author sun + * @Description 批量查询客户网格基础信息 + **/ + List getGridBaseInfo(GridBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java index 66ea3b4b37..4a8bb0d3e8 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java @@ -5,6 +5,8 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.constant.DataSourceConstant; import com.epmet.dao.org.StatsCustomerAgencyDao; +import com.epmet.dto.org.AgencyBaseInfoFormDTO; +import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; @@ -271,4 +273,14 @@ public class CustomerAgencyServiceImpl implements CustomerAgencyService { } } } + + /** + * @Author sun + * @Description 批量查询客户组织基础信息 + **/ + @Override + public List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { + return customerAgencyDao.getAgencyBaseInfo(formDTO); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java index 4d4ab8bee0..063d1cca35 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java @@ -9,7 +9,9 @@ import com.epmet.dto.group.AgencyDTO; import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; +import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.GridInfoDTO; +import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.entity.org.CustomerGridEntity; import com.epmet.service.Issue.IssueService; import com.epmet.service.org.CustomerGridService; @@ -115,4 +117,13 @@ public class CustomerGridServiceImpl extends BaseServiceImpl getGridBaseInfo(GridBaseInfoFormDTO formDTO) { + return customerGridDao.getGridBaseInfo(formDTO); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java index f45809be94..ba909341dc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java @@ -7,6 +7,7 @@ import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.result.UserStatisticalData; +import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.StaffRoleInfoDTO; import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.dto.user.result.StaffPatrolRecordResult; @@ -137,4 +138,10 @@ public interface UserService { * @author sun */ void saveOrUpGmUploadEvent(List list); + + /** + * @Author sun + * @Description 批量查询客户网格人员基础信息 + **/ + List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java index 95c7c333ff..f6df5e128c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java @@ -17,6 +17,7 @@ import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.*; import com.epmet.dto.stats.user.result.UserStatisticalData; +import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; import com.epmet.service.user.UserService; @@ -1088,4 +1089,13 @@ public class UserServiceImpl implements UserService { userDao.saveOrUpGmUploadEvent(list); } + /** + * @Author sun + * @Description 批量查询客户网格人员基础信息 + **/ + @Override + public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { + return userDao.getStaffBaseInfo(formDTO); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml index d84d884cb3..b4935ce00c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml @@ -126,4 +126,17 @@ AND customer_id = #{customerId} + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml index f7fe07a1a8..85bcc8e4cf 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml @@ -203,4 +203,18 @@ AND ca.CUSTOMER_ID = #{customerId} AND ca.AREA_CODE = #{areaCode} + + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index f6ddac0fef..16e58d07fc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -991,4 +991,17 @@ updated_time = NOW() + + From b039cfae11b3162967352b5a347db42f99ff1a20 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 14 Oct 2021 14:02:15 +0800 Subject: [PATCH 005/177] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/DataStatisticalOpenFeignClient.java | 4 ++-- .../controller/DataReportingController.java | 2 +- .../main/java/com/epmet/dao/user/UserDao.java | 2 +- .../com/epmet/service/DataReportingService.java | 2 +- .../service/impl/DataReportingServiceImpl.java | 4 ++-- .../java/com/epmet/service/user/UserService.java | 2 +- .../epmet/service/user/impl/UserServiceImpl.java | 2 +- .../src/main/resources/mapper/user/UserDao.xml | 16 +++++++++++----- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index e4a7e94dd6..c74dcff61c 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -293,14 +293,14 @@ public interface DataStatisticalOpenFeignClient { Result> getAgencyBaseInfo(@RequestBody AgencyBaseInfoFormDTO formDTO); /** - * @dscription 批量查询客户组织基础信息 + * @dscription 批量查询客户网格基础信息 * @author sun */ @PostMapping("/data/stats/datareporting/gridbaseinfo") Result> getGridBaseInfo(@RequestBody GridBaseInfoFormDTO formDTO); /** - * @dscription 批量查询客户组织基础信息 + * @dscription 批量查询客户网格员基础信息 * @author sun */ @PostMapping("/data/stats/datareporting/staffbaseinfo") diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index 129c44d2aa..5775a22a2a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -49,7 +49,7 @@ public class DataReportingController { /** * @Author sun - * @Description 批量查询客户网格人员基础信息 + * @Description 批量查询客户网格员基础信息 **/ @PostMapping("staffbaseinfo") public Result> getStaffBaseInfo(@RequestBody(required = false) StaffBaseInfoFormDTO formDTO) { diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java index 8501780460..dac88a5fbf 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java @@ -256,7 +256,7 @@ public interface UserDao { /** * @Author sun - * @Description 批量查询客户网格人员基础信息 + * @Description 批量查询客户网格员基础信息 **/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index 779b430eeb..5d0c7538c5 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -30,7 +30,7 @@ public interface DataReportingService { /** * @Author sun - * @Description 批量查询客户网格人员基础信息 + * @Description 批量查询客户网格员基础信息 * * @return*/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 5e626d3304..211c4b5a7b 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -54,11 +54,11 @@ public class DataReportingServiceImpl implements DataReportingService { /** * @Author sun - * @Description 批量查询客户网格人员基础信息 + * @Description 批量查询客户网格员基础信息 **/ @Override public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { - //批量查询客户网格人员信息 + //批量查询客户网格员信息 List resultList = userService.getStaffBaseInfo(formDTO); return resultList; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java index ba909341dc..cc75f43258 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java @@ -141,7 +141,7 @@ public interface UserService { /** * @Author sun - * @Description 批量查询客户网格人员基础信息 + * @Description 批量查询客户网格员基础信息 **/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java index f6df5e128c..2c5e72333f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java @@ -1091,7 +1091,7 @@ public class UserServiceImpl implements UserService { /** * @Author sun - * @Description 批量查询客户网格人员基础信息 + * @Description 批量查询客户网格员基础信息 **/ @Override public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index 16e58d07fc..f71bb10cca 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -993,13 +993,19 @@ From 6303fc2162387b72bfb630189f60098951bb1b87 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 14 Oct 2021 14:51:18 +0800 Subject: [PATCH 006/177] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/org/CustomerGridDao.xml | 8 +++++--- .../main/resources/mapper/org/StatsCustomerAgencyDao.xml | 8 +++++--- .../src/main/resources/mapper/user/UserDao.xml | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml index b4935ce00c..52264cd938 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml @@ -134,9 +134,11 @@ WHERE del_flag = '0' AND customer_id = #{customerId} - - #{gridId} - + + + #{gridId} + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml index 85bcc8e4cf..68cab60dd6 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml @@ -212,9 +212,11 @@ WHERE del_flag = '0' AND customer_id = #{customerId} - - #{agencyId} - + + + #{agencyId} + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index f71bb10cca..e048aadd1d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -1005,9 +1005,11 @@ AND gsr.del_flag = '0' AND gsr.role_name = '网格员' AND cs.customer_id = #{customerId} - - #{staffId} - + + + #{staffId} + + From f9860426b9efeeb1e074c8e7e4bf02bc9f3111ba Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 14 Oct 2021 15:23:40 +0800 Subject: [PATCH 007/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=94=9F=E4=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserPatrolRecordController.java | 39 +++++++ .../opendata/dao/StaffPatrolDetailDao.java | 33 ++++++ .../opendata/dao/UserPatrolRecordDao.java | 33 ++++++ .../entity/StaffPatrolDetailEntity.java | 53 +++++++++ .../entity/UserPatrolRecordEntity.java | 106 ++++++++++++++++++ .../service/StaffPatrolDetailService.java | 32 ++++++ .../service/UserPatrolRecordService.java | 32 ++++++ .../impl/StaffPatrolDetailServiceImpl.java | 37 ++++++ .../impl/UserPatrolRecordServiceImpl.java | 38 +++++++ .../resources/mapper/StaffPatrolDetailDao.xml | 20 ++++ .../resources/mapper/UserPatrolRecordDao.xml | 30 +++++ 11 files changed, 453 insertions(+) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolRecordDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java new file mode 100644 index 0000000000..db95af4fe2 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java @@ -0,0 +1,39 @@ +/** + * 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.opendata.controller; + +import com.epmet.opendata.service.UserPatrolRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 用户巡查主记录 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +@RestController +@RequestMapping("userpatrolrecord") +public class UserPatrolRecordController { + + @Autowired + private UserPatrolRecordService userPatrolRecordService; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java new file mode 100644 index 0000000000..4e9616a59e --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.StaffPatrolDetailEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 工作人员巡查记录明细 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +@Mapper +public interface StaffPatrolDetailDao extends BaseDao { + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolRecordDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolRecordDao.java new file mode 100644 index 0000000000..7c40b093a3 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolRecordDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.UserPatrolRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户巡查主记录 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +@Mapper +public interface UserPatrolRecordDao extends BaseDao { + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java new file mode 100644 index 0000000000..83a7e684a5 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java @@ -0,0 +1,53 @@ +/** + * 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.opendata.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-14 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("staff_patrol_detail") +public class StaffPatrolDetailEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * staff_patrol_record.ID + */ + private String staffPatrolRecId; + + /** + * 路线 + */ + private String route; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java new file mode 100644 index 0000000000..21b02c6c98 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.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.opendata.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-14 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("user_patrol_record") +public class UserPatrolRecordEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * 网格id + */ + private String grid; + + /** + * 网格所有上级id + */ + private String gridPids; + + /** + * 用户id + */ + private String staffId; + + /** + * 工作人员所属组织id=网格所属的组织id + */ + private String agencyId; + + /** + * 巡查开始时间 + */ + private Date patrolStartTime; + + /** + * 巡查结束时间 + */ + private Date patrolEndTime; + + /** + * 实际结束时间 + */ + private Date actrualEndTime; + + /** + * 巡查开始地点 + */ + private String startLocation; + + /** + * 巡查结束地点 + */ + private String endLocation; + + /** + * 本次巡查总耗时,单位秒 + */ + private Integer totalTime; + + /** + * 巡查距离,单位米 + */ + private Integer distance; + + /** + * 正在巡查中:patrolling;结束:end + */ + private String status; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java new file mode 100644 index 0000000000..e37d8627b0 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java @@ -0,0 +1,32 @@ +/** + * 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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.entity.StaffPatrolDetailEntity; + +/** + * 工作人员巡查记录明细 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +public interface StaffPatrolDetailService extends BaseService { + + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java new file mode 100644 index 0000000000..82a95295a9 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java @@ -0,0 +1,32 @@ +/** + * 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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.entity.UserPatrolRecordEntity; + +/** + * 用户巡查主记录 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +public interface UserPatrolRecordService extends BaseService { + + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.java new file mode 100644 index 0000000000..bb9bbfc89d --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.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.opendata.service.impl; + +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.opendata.dao.StaffPatrolDetailDao; +import com.epmet.opendata.entity.StaffPatrolDetailEntity; +import com.epmet.opendata.service.StaffPatrolDetailService; +import org.springframework.stereotype.Service; + +/** + * 工作人员巡查记录明细 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +@Service +public class StaffPatrolDetailServiceImpl extends BaseServiceImpl implements StaffPatrolDetailService { + + + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java new file mode 100644 index 0000000000..746c8c0adf --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -0,0 +1,38 @@ +/** + * 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.opendata.service.impl; + +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.opendata.dao.UserPatrolRecordDao; +import com.epmet.opendata.entity.UserPatrolRecordEntity; +import com.epmet.opendata.service.UserPatrolRecordService; +import org.springframework.stereotype.Service; + + +/** + * 用户巡查主记录 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +@Service +public class UserPatrolRecordServiceImpl extends BaseServiceImpl implements UserPatrolRecordService { + + + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml new file mode 100644 index 0000000000..a486773599 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml new file mode 100644 index 0000000000..c7daa03b43 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 176cd44ef74d84604c96e6e6c11d01c3cbbfc5f8 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 14 Oct 2021 15:24:59 +0800 Subject: [PATCH 008/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=94=9F=E4=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/StaffPatrolDetailDao.xml | 6 +++--- .../src/main/resources/mapper/UserPatrolRecordDao.xml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml index a486773599..151eb902c0 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml @@ -1,9 +1,9 @@ - + - + @@ -17,4 +17,4 @@ - \ No newline at end of file + diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml index c7daa03b43..750e9f177b 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolRecordDao.xml @@ -1,9 +1,9 @@ - + - + @@ -27,4 +27,4 @@ - \ No newline at end of file + From 1f7f58198edc0c16d3c13fbd8a00010283ce15dd Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 14 Oct 2021 16:18:29 +0800 Subject: [PATCH 009/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=20=E5=88=B0mq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rocketmq/constants/TopicConstants.java | 9 +++-- .../rocketmq/messages/StaffPatrolMQMsg.java | 28 +++++++++++++++ .../com/epmet/constant/SystemMessageType.java | 10 ++++++ .../java/com/epmet/send/SendMqMsgUtil.java | 32 ++++++++++++++++- .../impl/SystemMessageServiceImpl.java | 5 ++- .../impl/StaffPatrolRecordServiceImpl.java | 36 +++++++++++++------ 6 files changed, 106 insertions(+), 14 deletions(-) create mode 100644 epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java 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 927fa19198..d28b19396d 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 @@ -30,12 +30,17 @@ public interface TopicConstants { String POINT = "point"; /** - * 组织信息变更 + * 组织信息 */ String ORG = "org"; /** - * 工作人员信息变更 + * 工作人员 */ String STAFF = "staff"; + + /** + * 巡查 + */ + String PATROL = "patrol"; } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java new file mode 100644 index 0000000000..f8221d7c76 --- /dev/null +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java @@ -0,0 +1,28 @@ +package com.epmet.commons.rocketmq.messages; + +import lombok.Data; + +/** + * 用户巡查消息体 + * @author liujianjun + */ +@Data +public class StaffPatrolMQMsg { + /** + * 客户Id + */ + private String customerId; + + /** + * 巡查记录id + */ + private String patrolId; + + /** + * 操作类型 + * SystemMessageType.USER_PATROL_START + * SystemMessageTypSTOP + */ + private String actionType; + +} 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 e1c59f003e..9e502bd6ca 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 @@ -65,4 +65,14 @@ public interface SystemMessageType { */ String STAFF_CHANGE = "staff_change"; + /** + * 用户开始巡查 + */ + String USER_PATROL_START = "user_patrol_start"; + + /** + * 用户结束巡查 + */ + String USER_PATROL_STOP = "user_patrol_stop"; + } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java index 4c7241decd..32674d49f6 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java @@ -1,9 +1,10 @@ package com.epmet.send; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; import com.epmet.commons.rocketmq.messages.PointRuleChangedMQMsg; import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg; -import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; +import com.epmet.commons.rocketmq.messages.StaffPatrolMQMsg; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.SystemMessageType; @@ -128,4 +129,33 @@ public class SendMqMsgUtil { } + /** + * @Description 发送巡查相关消息 + * @return + * @author wxz + * @date 2021.06.21 12:46 + */ + public boolean sendPatrolMqMsg(StaffPatrolMQMsg msg) { + try { + SystemMsgFormDTO msgForm = new SystemMsgFormDTO(); + msgForm.setMessageType(msg.getActionType()); + msgForm.setContent(msg); + Result sendMsgResult = null; + log.info("sendPatrolMqMsg param:{}",msgForm); + int retryTime = 0; + do { + sendMsgResult = epmetMessageOpenFeignClient.sendSystemMsgByMQ(msgForm); + } while ((sendMsgResult == null || !sendMsgResult.success()) && retryTime++ < NumConstant.TWO); + + if (sendMsgResult != null && sendMsgResult.success()) { + return true; + } + log.error("发送(巡查相关)系统消息到message服务失败:{},msg:{}", JSON.toJSONString(sendMsgResult), JSON.toJSONString(msgForm)); + } catch (Exception e) { + log.error("sendMqMsg exception", e); + } + return false; + + } + } 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 f7aacf297c..c85480be6d 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 @@ -2,7 +2,6 @@ package com.epmet.service.impl; import com.alibaba.fastjson.JSON; import com.epmet.auth.constants.AuthOperationConstants; -import com.epmet.auth.constants.AuthOperationEnum; import com.epmet.commons.rocketmq.constants.TopicConstants; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -91,6 +90,10 @@ public class SystemMessageServiceImpl implements SystemMessageService { case SystemMessageType.STAFF_CHANGE: topic = TopicConstants.STAFF; break; + case SystemMessageType.USER_PATROL_START: + case SystemMessageType.USER_PATROL_STOP: + topic = TopicConstants.PATROL; + break; } return topic; } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java index 12255c1153..b46f4a6eae 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java @@ -3,15 +3,16 @@ package com.epmet.service.impl; 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.StaffPatrolMQMsg; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; -import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.PatrolConstant; +import com.epmet.constant.SystemMessageType; import com.epmet.dao.CustomerStaffDao; import com.epmet.dao.StaffPatrolDetailDao; import com.epmet.dao.StaffPatrolRecordDao; @@ -23,9 +24,10 @@ import com.epmet.dto.result.*; import com.epmet.entity.StaffPatrolDetailEntity; import com.epmet.entity.StaffPatrolRecordEntity; import com.epmet.entity.StatsStaffPatrolRecordDailyEntity; -import com.epmet.feign.GovOrgFeignClient; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.feign.GovProjectOpenFeignClient; +import com.epmet.send.SendMqMsgUtil; import com.epmet.service.StaffPatrolDetailService; import com.epmet.service.StaffPatrolRecordService; import com.epmet.util.DimIdGenerator; @@ -40,7 +42,6 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; /** @@ -55,25 +56,20 @@ public class StaffPatrolRecordServiceImpl extends BaseServiceImplsendPatrolMsg(e, SystemMessageType.USER_PATROL_STOP)); + } /** From c10791e8f3041a91736c05b11b8ce3f21020af8f Mon Sep 17 00:00:00 2001 From: wxz Date: Thu, 14 Oct 2021 21:51:32 +0800 Subject: [PATCH 010/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=201.message?= =?UTF-8?q?/system/send-by-mq=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=88=86=E7=BB=84=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=EF=BC=9A=201.mq=E6=B6=88=E6=81=AFack=E5=BA=94=E7=AD=94?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 12 +++++ .../com/epmet/constant/MQUserPropertys.java | 13 ++++++ .../com/epmet/dto/form/SystemMsgFormDTO.java | 13 +++++- .../feign/EpmetMessageOpenFeignClient.java | 13 +++++- .../EpmetMessageOpenFeignClientFallback.java | 5 ++ .../controller/SystemMessageController.java | 25 +++++++++- .../epmet/service/SystemMessageService.java | 19 ++++++++ .../impl/SystemMessageServiceImpl.java | 39 ++++++++++++++++ .../open-data-worker-server/pom.xml | 8 +++- .../{opendata => }/OpenDataApplication.java | 4 +- .../opendata/mq/RocketMQConsumerRegister.java | 2 + .../OpenDataOrgChangeEventListener.java | 44 ++++++++++++++++++ .../OpenDataStaffChangeEventListener.java | 46 ++++++++++++++++++- 13 files changed, 235 insertions(+), 8 deletions(-) create mode 100644 epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java rename epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/{opendata => }/OpenDataApplication.java (90%) 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 6fe4130225..9d2497f24e 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 @@ -547,4 +547,16 @@ public class RedisKeys { public static String getQuestionnaireAccessKey(String userId, String qKey) { return rootPrefix.concat("questionnaire:accesskey:").concat(userId).concat(":").concat(qKey); } + + /** + * @description 检查message MQ滞留消息 + * + * @param pendingMsgLabel 滞留消息的label + * @return + * @author wxz + * @date 2021.10.14 14:33:53 + */ + public static String checkPendingMqMsgKey(String pendingMsgLabel) { + return rootPrefix.concat("message:mq:pending:").concat(pendingMsgLabel); + } } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java new file mode 100644 index 0000000000..593ab0cc57 --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java @@ -0,0 +1,13 @@ +package com.epmet.constant; + +/** + * @Description MQ用户自定义属性 + * @author wxz + * @date 2021.10.14 15:47:03 +*/ +public interface MQUserPropertys { + + //堆积消息label + String PENDING_MSG_LABEL = "pendingMsgLabel"; + +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/SystemMsgFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/SystemMsgFormDTO.java index c0fc9308b8..c0fb1400e9 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/SystemMsgFormDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/SystemMsgFormDTO.java @@ -7,9 +7,18 @@ import javax.validation.constraints.NotNull; @Data public class SystemMsgFormDTO { - @NotNull(message = "消息类型不能为空") + // 发送mq消息分组 + public interface SendMsgByMQ {} + + // 应答mq消息 + public interface AckMsgByMQ {} + + @NotNull(message = "消息类型不能为空", groups = { SendMsgByMQ.class }) private String messageType; - @NotNull(message = "消息内容不能为空") + @NotNull(message = "消息内容不能为空", groups = { SendMsgByMQ.class }) private Object content; + + @NotNull(message = "pendingMsgLabel不能为空", groups = { AckMsgByMQ.class }) + private String pendingMsgLabel; } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java index f375d75aaf..454fd5fd5d 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java @@ -27,7 +27,7 @@ import java.util.List; * @author yinzuomei@elink-cn.com * @date 2020/6/4 13:47 */ -//@FeignClient(name = ServiceConstant.EPMET_MESSAGE_SERVER, fallback = EpmetMessageOpenFeignClientFallback.class,url = "http://127.0.0.1:8085") +//@FeignClient(name = ServiceConstant.EPMET_MESSAGE_SERVER, fallbackFactory = EpmetMessageOpenFeignClientFallbackFactory.class, url = "http://127.0.0.1:8085") @FeignClient(name = ServiceConstant.EPMET_MESSAGE_SERVER, fallbackFactory = EpmetMessageOpenFeignClientFallbackFactory.class) public interface EpmetMessageOpenFeignClient { /** @@ -107,4 +107,15 @@ public interface EpmetMessageOpenFeignClient { */ @PostMapping("/message/system/send-by-mq") Result sendSystemMsgByMQ(@RequestBody SystemMsgFormDTO form); + + /** + * @description 应答mq消息 + * + * @param form + * @return + * @author wxz + * @date 2021.10.14 16:07:17 + */ + @PostMapping("/message/system/ack-mq-msg") + Result ackSystemMsgByMQ(@RequestBody SystemMsgFormDTO form); } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java index 069d76c795..998b890814 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java @@ -69,4 +69,9 @@ public class EpmetMessageOpenFeignClientFallback implements EpmetMessageOpenFeig public Result sendSystemMsgByMQ(SystemMsgFormDTO form) { return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "sendSystemMsgByMQ", form); } + + @Override + public Result ackSystemMsgByMQ(SystemMsgFormDTO form) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "ackSystemMsgByMQ", form); + } } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java index 7a31e91785..002d9ea424 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java @@ -17,11 +17,34 @@ public class SystemMessageController { @Autowired private SystemMessageService systemMessageService; + /** + * @description 发送mq消息 + * + * @param form + * @return + * @author wxz + * @date 2021.10.14 16:07:07 + */ @PostMapping("send-by-mq") public Result sendSystemMsgByMQ(@RequestBody SystemMsgFormDTO form) { - ValidatorUtils.validateEntity(form); + ValidatorUtils.validateEntity(form, SystemMsgFormDTO.SendMsgByMQ.class); systemMessageService.sendMQMessage(form.getMessageType(), form.getContent()); return new Result(); } + /** + * @description 应答mq消息 + * + * @param form + * @return + * @author wxz + * @date 2021.10.14 16:07:17 + */ + @PostMapping("ack-mq-msg") + public Result ackSystemMsgByMQ(@RequestBody SystemMsgFormDTO form) { + ValidatorUtils.validateEntity(form, SystemMsgFormDTO.AckMsgByMQ.class); + systemMessageService.ackMqMessage(form.getPendingMsgLabel()); + return new Result(); + } + } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java index 2985b550c9..25189683f0 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java @@ -2,6 +2,25 @@ package com.epmet.service; public interface SystemMessageService { + /** + * @description 发送mq消息 + * + * @param messageType + * @param content + * @return + * @author wxz + * @date 2021.10.14 15:07:02 + */ void sendMQMessage(String messageType, Object content); + /** + * @description 消息应答 + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 15:07:09 + */ + void ackMqMessage(String pendingMsgLabel); + } 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 f7aacf297c..2c66aff492 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 @@ -7,11 +7,17 @@ import com.epmet.commons.rocketmq.constants.TopicConstants; 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.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.constant.MQUserPropertys; import com.epmet.constant.SystemMessageSendApproach; import com.epmet.constant.SystemMessageType; import com.epmet.dao.SystemMessageDao; import com.epmet.entity.SystemMessageEntity; import com.epmet.service.SystemMessageService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.common.RemotingHelper; import org.apache.rocketmq.spring.core.RocketMQTemplate; @@ -21,6 +27,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.UUID; + @Service public class SystemMessageServiceImpl implements SystemMessageService { @@ -32,6 +41,9 @@ public class SystemMessageServiceImpl implements SystemMessageService { @Autowired private RocketMQTemplate rocketMQTemplate; + @Autowired + private RedisUtils redisUtils; + @Transactional(rollbackFor = Exception.class) @Override public void sendMQMessage(String messageType, Object content) { @@ -43,13 +55,24 @@ public class SystemMessageServiceImpl implements SystemMessageService { systemMessageEntity.setContent(contentStr); systemMessageDao.insert(systemMessageEntity); + // 缓存下来,供滞留消息扫描。TTL -1,永不过期 + MessageCacheBean mcb = new MessageCacheBean(new Date(), messageType, contentStr); + String pendingMsgLabel = UUID.randomUUID().toString().replace("-", ""); + String pendingMsgKey = RedisKeys.checkPendingMqMsgKey(pendingMsgLabel); + redisUtils.set(pendingMsgKey, mcb, -1); + //发送mq消息 try { Message meMessage = new Message(getTopicByMsgType(messageType), messageType, contentStr.getBytes(RemotingHelper.DEFAULT_CHARSET)); + meMessage.putUserProperty(MQUserPropertys.PENDING_MSG_LABEL, pendingMsgLabel); rocketMQTemplate.getProducer().send(meMessage); } catch (Exception e) { String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); logger.error("发送系统消息失败,堆栈信息:{}", errorStackTrace); + + // 清理消息缓存 + redisUtils.delete(pendingMsgKey); + throw new RenException(EpmetErrorCode.SYSTEM_MQ_MSG_SEND_FAIL.getCode()); } } @@ -94,4 +117,20 @@ public class SystemMessageServiceImpl implements SystemMessageService { } return topic; } + + @Override + public void ackMqMessage(String pendingMsgLabel) { + String key = RedisKeys.checkPendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【MQ消息应答】pendingMsgLabel{}", pendingMsgLabel); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + class MessageCacheBean { + private Date createTime; + private String messageType; + private Object content; + } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml index 289b030dc7..f8a6389e73 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -60,6 +60,12 @@ epmet-commons-rocketmq 2.0.0 + + + com.epmet + epmet-message-client + 2.0.0 + @@ -166,7 +172,7 @@ SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd - false + true 192.168.1.140:9876;192.168.1.141:9876 diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java similarity index 90% rename from epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java rename to epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java index bb8ff976ac..532877cf4b 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/OpenDataApplication.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java @@ -1,4 +1,4 @@ -package com.epmet.opendata; +package com.epmet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -18,7 +18,7 @@ import org.springframework.context.annotation.ComponentScan; @EnableDiscoveryClient @EnableFeignClients @ServletComponentScan -@ComponentScan(value = { "com.epmet.opendata", "com.epmet.commons" }) +//@ComponentScan(value = { "com.epmet" }) public class OpenDataApplication { public static void main(String[] args) { SpringApplication.run(OpenDataApplication.class, args); diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java index ede4eeb83a..775e166fe0 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java @@ -4,9 +4,11 @@ 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.feign.EpmetMessageOpenFeignClient; import com.epmet.opendata.mq.listener.OpenDataOrgChangeEventListener; import com.epmet.opendata.mq.listener.OpenDataStaffChangeEventListener; import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index 17cc9eca72..467f690259 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -3,6 +3,12 @@ package com.epmet.opendata.mq.listener; 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.utils.Result; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.constant.MQUserPropertys; +import com.epmet.dto.form.SystemMsgFormDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; +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; @@ -22,8 +28,19 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent private Logger logger = LoggerFactory.getLogger(getClass()); + private EpmetMessageOpenFeignClient messageOpenFeignClient; + @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + + if (messageOpenFeignClient == null) { + try { + messageOpenFeignClient = SpringContextUtils.getBean(EpmetMessageOpenFeignClient.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { msgs.forEach(msg -> consumeMessage(msg)); } catch (Exception e) { @@ -38,6 +55,7 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent // tags为SystemMessageType.java中的项,为具体的操作,此处拿到tags,判断是创建还是变更,来做响应的后续操作即可 String msg = new String(messageExt.getBody()); String tags = messageExt.getTags(); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("【开放数据事件监听器】-组织信息变更-收到消息内容:{},操作:{}", msg, tags); @@ -57,5 +75,31 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent } finally { //distributedLock.unLock(lock); } + + // 应答mq消息(调用message服务的应答api) + if (StringUtils.isNotBlank(pendingMsgLabel)) { + try { + ackMqMsg(pendingMsgLabel); + } catch (Exception e) { + logger.error("【开放数据事件监听器】-应答mq消息失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } + } + + /** + * @description 应答mq消息 + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void ackMqMsg(String pendingMsgLabel) { + SystemMsgFormDTO form = new SystemMsgFormDTO(); + form.setPendingMsgLabel(pendingMsgLabel); + Result result = messageOpenFeignClient.ackSystemMsgByMQ(form); + if (!result.success()) { + logger.error("调用Message服务应答MQ消息失败:{}", result.getMsg()); + } } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java index b8f0be40bd..320b78f7ae 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java @@ -3,6 +3,12 @@ package com.epmet.opendata.mq.listener; 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.utils.Result; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.constant.MQUserPropertys; +import com.epmet.dto.form.SystemMsgFormDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; +import org.apache.commons.lang3.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; @@ -11,6 +17,7 @@ import org.redisson.api.RLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.PostConstruct; import java.util.List; /** @@ -22,8 +29,15 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre private Logger logger = LoggerFactory.getLogger(getClass()); + private EpmetMessageOpenFeignClient messageOpenFeignClient; + @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + + if (messageOpenFeignClient == null) { + messageOpenFeignClient = SpringContextUtils.getBean(EpmetMessageOpenFeignClient.class); + } + try { msgs.forEach(msg -> consumeMessage(msg)); } catch (Exception e) { @@ -38,8 +52,11 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre // tags为SystemMessageType.java中的项,为具体的操作,此处拿到tags,判断是创建还是变更,来做响应的后续操作即可 String msg = new String(messageExt.getBody()); String tags = messageExt.getTags(); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + + //messageExt.propert - logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}", msg, tags); + logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}, pendingMsgLabel:{}", msg, tags, pendingMsgLabel); DistributedLock distributedLock = null; RLock lock = null; @@ -47,6 +64,7 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre //distributedLock = SpringContextUtils.getBean(DistributedLock.class); //lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", staffId), // 30L, 30L, TimeUnit.SECONDS); + } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-工作人员信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); @@ -57,5 +75,31 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre } finally { //distributedLock.unLock(lock); } + + // 应答mq消息(调用message服务的应答api) + if (StringUtils.isNotBlank(pendingMsgLabel)) { + try { + ackMqMsg(pendingMsgLabel); + } catch (Exception e) { + logger.error("【开放数据事件监听器】-应答mq消息失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } + } + + /** + * @description 应答mq消息 + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void ackMqMsg(String pendingMsgLabel) { + SystemMsgFormDTO form = new SystemMsgFormDTO(); + form.setPendingMsgLabel(pendingMsgLabel); + Result result = messageOpenFeignClient.ackSystemMsgByMQ(form); + if (!result.success()) { + logger.error("调用Message服务应答MQ消息失败:{}", result.getMsg()); + } } } From 7ff3a07027a0005d4a2fc05dab889e00acd83a96 Mon Sep 17 00:00:00 2001 From: wxz Date: Thu, 14 Oct 2021 21:53:47 +0800 Subject: [PATCH 011/177] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-module/open-data-worker/open-data-worker-server/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml index f8a6389e73..211bef65a3 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -172,7 +172,7 @@ SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd - true + local 192.168.1.140:9876;192.168.1.141:9876 From e977206c5e6bbd23dbbf53305159514ec87efbc8 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 08:58:17 +0800 Subject: [PATCH 012/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=20=E5=88=B0mq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/ConsomerGroupConstants.java | 5 ++ .../rocketmq/constants/TopicConstants.java | 2 +- .../opendata/mq/RocketMQConsumerRegister.java | 10 ++- .../OpenDataPatrolChangeEventListener.java | 61 +++++++++++++++++++ 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.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 b4dba548b7..a1c61abf6b 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 @@ -55,4 +55,9 @@ public interface ConsomerGroupConstants { */ String OPEN_DATA_STAFF_CHANGE_EVENT_LISTENER_GROUP = "open_data_staff_change_event_listener_group"; + /** + * 开放的对接数据(中间库) 巡查记录变更事件监听器分组 + */ + String OPEN_DATA_PATROL_CHANGE_EVENT_LISTENER_GROUP = "open_data_patrol_change_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 d28b19396d..4dfeaa3500 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 @@ -40,7 +40,7 @@ public interface TopicConstants { String STAFF = "staff"; /** - * 巡查 + * 巡查记录 */ String PATROL = "patrol"; } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java index 775e166fe0..0a966910bd 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java @@ -4,11 +4,10 @@ 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.feign.EpmetMessageOpenFeignClient; import com.epmet.opendata.mq.listener.OpenDataOrgChangeEventListener; +import com.epmet.opendata.mq.listener.OpenDataPatrolChangeEventListener; import com.epmet.opendata.mq.listener.OpenDataStaffChangeEventListener; import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -36,6 +35,13 @@ public class RocketMQConsumerRegister extends MQAbstractRegister { "*", new OpenDataStaffChangeEventListener()); + register(consumerProperties, + ConsomerGroupConstants.OPEN_DATA_PATROL_CHANGE_EVENT_LISTENER_GROUP, + MessageModel.CLUSTERING, + TopicConstants.PATROL, + "*", + new OpenDataPatrolChangeEventListener()); + // ...其他监听器类似 } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java new file mode 100644 index 0000000000..c8251c80fa --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java @@ -0,0 +1,61 @@ +package com.epmet.opendata.mq.listener; + +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +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; + +/** + * @Description 系统对接中间库,巡查信息变更监听器 + * @author wxz + * @date 2021.10.13 15:21:48 +*/ +public class OpenDataPatrolChangeEventListener implements MessageListenerConcurrently { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + 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 tags = messageExt.getTags(); + + logger.info("【开放数据事件监听器】-巡查记录信息变更-收到消息内容:{}, 操作:{}", msg, tags); + + DistributedLock distributedLock = null; + RLock lock = null; + try { + //distributedLock = SpringContextUtils.getBean(DistributedLock.class); + //lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", staffId), + // 30L, 30L, TimeUnit.SECONDS); + } catch (RenException e) { + // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 + logger.error("【开放数据事件监听器】-巡查记录信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + } catch (Exception e) { + // 不是我们自己抛出的异常,可以让MQ重试 + logger.error("【开放数据事件监听器】-巡查记录信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + throw e; + } finally { + //distributedLock.unLock(lock); + } + } +} From 330920931dbd380296db94f6f76579bacebed97a Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 09:27:48 +0800 Subject: [PATCH 013/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=B6=88=E8=B4=B9=E6=B6=88=E6=81=AF=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open-data-worker-client/pom.xml | 10 ++++-- .../dto/form/UpsertPatrolRecordForm.java | 28 ++++++++++++++++ .../open-data-worker-server/pom.xml | 8 ++++- .../opendata/dao/StaffPatrolDetailDao.java | 4 +-- ...ntity.java => UserPatrolDetailEntity.java} | 4 +-- .../OpenDataPatrolChangeEventListener.java | 32 +++++++++++++++---- ...vice.java => UserPatrolDetailService.java} | 4 +-- .../service/UserPatrolRecordService.java | 8 ++++- ....java => UserPatrolDetailServiceImpl.java} | 6 ++-- .../impl/UserPatrolRecordServiceImpl.java | 6 +++- .../resources/mapper/StaffPatrolDetailDao.xml | 2 +- 11 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java rename epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/{StaffPatrolDetailEntity.java => UserPatrolDetailEntity.java} (93%) rename epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/{StaffPatrolDetailService.java => UserPatrolDetailService.java} (86%) rename epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/{StaffPatrolDetailServiceImpl.java => UserPatrolDetailServiceImpl.java} (79%) diff --git a/epmet-module/open-data-worker/open-data-worker-client/pom.xml b/epmet-module/open-data-worker/open-data-worker-client/pom.xml index 14be115052..ca20343976 100644 --- a/epmet-module/open-data-worker/open-data-worker-client/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-client/pom.xml @@ -11,5 +11,11 @@ open-data-worker-client - - \ No newline at end of file + + + com.epmet + epmet-commons-tools + 2.0.0 + + + diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java new file mode 100644 index 0000000000..ecd3fee58d --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java @@ -0,0 +1,28 @@ +package com.epmet.opendata.dto.form; + +import lombok.Data; + +/** + * 插入或更新巡查记录主表 + * @author liujianjun + */ +@Data +public class UpsertPatrolRecordForm { + /** + * 客户Id + */ + private String customerId; + + /** + * 巡查记录id + */ + private String patrolId; + + /** + * 操作类型 + * SystemMessageType.USER_PATROL_START + * SystemMessageTypSTOP + */ + private String actionType; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml index 211bef65a3..1c0da40f63 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -66,6 +66,12 @@ epmet-message-client 2.0.0 + + com.epmet + open-data-worker-client + 2.0.0 + compile + @@ -261,4 +267,4 @@ - \ No newline at end of file + diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java index 4e9616a59e..ecae380d72 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java @@ -18,7 +18,7 @@ package com.epmet.opendata.dao; import com.epmet.commons.mybatis.dao.BaseDao; -import com.epmet.opendata.entity.StaffPatrolDetailEntity; +import com.epmet.opendata.entity.UserPatrolDetailEntity; import org.apache.ibatis.annotations.Mapper; /** @@ -28,6 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since v1.0.0 2021-10-14 */ @Mapper -public interface StaffPatrolDetailDao extends BaseDao { +public interface StaffPatrolDetailDao extends BaseDao { } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java similarity index 93% rename from epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java rename to epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java index 83a7e684a5..bfea8b7749 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/StaffPatrolDetailEntity.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java @@ -30,8 +30,8 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper=false) -@TableName("staff_patrol_detail") -public class StaffPatrolDetailEntity extends BaseEpmetEntity { +@TableName("user_patrol_detail") +public class UserPatrolDetailEntity extends BaseEpmetEntity { private static final long serialVersionUID = 1L; diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java index c8251c80fa..a1598adfc6 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java @@ -1,8 +1,14 @@ package com.epmet.opendata.mq.listener; +import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.messages.StaffPatrolMQMsg; 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.utils.SpringContextUtils; +import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; +import com.epmet.opendata.service.UserPatrolRecordService; +import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; @@ -12,12 +18,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; +import java.util.concurrent.TimeUnit; /** - * @Description 系统对接中间库,巡查信息变更监听器 * @author wxz + * @Description 系统对接中间库,巡查信息变更监听器 * @date 2021.10.13 15:21:48 -*/ + */ +@Slf4j public class OpenDataPatrolChangeEventListener implements MessageListenerConcurrently { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -40,13 +48,23 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr String tags = messageExt.getTags(); logger.info("【开放数据事件监听器】-巡查记录信息变更-收到消息内容:{}, 操作:{}", msg, tags); - + StaffPatrolMQMsg msgObj = JSON.parseObject(msg, StaffPatrolMQMsg.class); + if (msgObj == null) { + log.warn("consumeMessage msg body is blank"); + return; + } DistributedLock distributedLock = null; RLock lock = null; try { - //distributedLock = SpringContextUtils.getBean(DistributedLock.class); - //lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", staffId), - // 30L, 30L, TimeUnit.SECONDS); + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + lock = distributedLock.getLock(String.format("lock:open_data_patrol:%s", msgObj.getPatrolId()), + 30L, 30L, TimeUnit.SECONDS); + UpsertPatrolRecordForm patrolRecordForm = new UpsertPatrolRecordForm(); + patrolRecordForm.setCustomerId(msgObj.getCustomerId()); + patrolRecordForm.setPatrolId(msgObj.getPatrolId()); + patrolRecordForm.setActionType(msgObj.getActionType()); + + Boolean aBoolean = SpringContextUtils.getBean(UserPatrolRecordService.class).upsertPatrolRecord(patrolRecordForm); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-巡查记录信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); @@ -55,7 +73,7 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr logger.error("【开放数据事件监听器】-巡查记录信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); throw e; } finally { - //distributedLock.unLock(lock); + distributedLock.unLock(lock); } } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java similarity index 86% rename from epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java rename to epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java index e37d8627b0..b6ca5b2c47 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/StaffPatrolDetailService.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java @@ -18,7 +18,7 @@ package com.epmet.opendata.service; import com.epmet.commons.mybatis.service.BaseService; -import com.epmet.opendata.entity.StaffPatrolDetailEntity; +import com.epmet.opendata.entity.UserPatrolDetailEntity; /** * 工作人员巡查记录明细 @@ -26,7 +26,7 @@ import com.epmet.opendata.entity.StaffPatrolDetailEntity; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-14 */ -public interface StaffPatrolDetailService extends BaseService { +public interface UserPatrolDetailService extends BaseService { } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java index 82a95295a9..f3d12add5a 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java @@ -18,6 +18,7 @@ package com.epmet.opendata.service; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; import com.epmet.opendata.entity.UserPatrolRecordEntity; /** @@ -28,5 +29,10 @@ import com.epmet.opendata.entity.UserPatrolRecordEntity; */ public interface UserPatrolRecordService extends BaseService { - + /** + * desc:根据条件更新或者插入巡查记录 + * @param patrolRecordForm + * @return + */ + Boolean upsertPatrolRecord(UpsertPatrolRecordForm patrolRecordForm); } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java similarity index 79% rename from epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.java rename to epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java index bb9bbfc89d..508c8f7859 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/StaffPatrolDetailServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java @@ -19,8 +19,8 @@ package com.epmet.opendata.service.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.opendata.dao.StaffPatrolDetailDao; -import com.epmet.opendata.entity.StaffPatrolDetailEntity; -import com.epmet.opendata.service.StaffPatrolDetailService; +import com.epmet.opendata.entity.UserPatrolDetailEntity; +import com.epmet.opendata.service.UserPatrolDetailService; import org.springframework.stereotype.Service; /** @@ -30,7 +30,7 @@ import org.springframework.stereotype.Service; * @since v1.0.0 2021-10-14 */ @Service -public class StaffPatrolDetailServiceImpl extends BaseServiceImpl implements StaffPatrolDetailService { +public class UserPatrolDetailServiceImpl extends BaseServiceImpl implements UserPatrolDetailService { diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index 746c8c0adf..ee6ebed979 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -19,6 +19,7 @@ package com.epmet.opendata.service.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.opendata.dao.UserPatrolRecordDao; +import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; import com.epmet.opendata.entity.UserPatrolRecordEntity; import com.epmet.opendata.service.UserPatrolRecordService; import org.springframework.stereotype.Service; @@ -34,5 +35,8 @@ import org.springframework.stereotype.Service; public class UserPatrolRecordServiceImpl extends BaseServiceImpl implements UserPatrolRecordService { - + @Override + public Boolean upsertPatrolRecord(UpsertPatrolRecordForm patrolRecordForm) { + return null; + } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml index 151eb902c0..bc66036982 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml @@ -3,7 +3,7 @@ - + From 57b3679f36b8201cf3b824ea9ab2f13c18cb1459 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 15 Oct 2021 14:15:39 +0800 Subject: [PATCH 014/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=201.?= =?UTF-8?q?=E6=89=80=E6=9C=89mq=20listener=E5=A2=9E=E5=8A=A0redis=20?= =?UTF-8?q?=E6=BB=9E=E7=95=99=E6=B6=88=E6=81=AF=E5=88=97=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/AuthOperationLogListener.java | 41 +++++-- .../listener/PointOperationLogListener.java | 33 ++++++ .../listener/ProjectOperationLogListener.java | 33 ++++++ .../rocketmq/constants}/MQUserPropertys.java | 2 +- .../epmet/commons/tools/redis/RedisKeys.java | 2 +- .../mq/ProjectChangedCustomListener.java | 41 ++++++- .../controller/SystemMessageController.java | 15 +-- .../epmet/service/SystemMessageService.java | 9 +- .../impl/SystemMessageServiceImpl.java | 100 +++++++++++++++--- .../IssueProjectCategoryTagInitListener.java | 35 ++++++ .../InitCustomerOrgRolesListener.java | 34 ++++++ .../open-data-worker-server/pom.xml | 2 +- .../OpenDataOrgChangeEventListener.java | 36 +++---- .../OpenDataPatrolChangeEventListener.java | 35 ++++++ .../OpenDataStaffChangeEventListener.java | 31 +++--- .../InitCustomerComponentsListener.java | 35 +++++- .../mq/GroupAchievementCustomListener.java | 34 +++++- 17 files changed, 429 insertions(+), 89 deletions(-) rename {epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant => epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants}/MQUserPropertys.java (81%) diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java index 4f9e361fc5..ee243d88dd 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java @@ -2,22 +2,19 @@ package com.epmet.mq.listener.listener; import com.alibaba.fastjson.JSON; import com.epmet.auth.constants.AuthOperationEnum; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.LoginMQMsg; -import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.distributedlock.DistributedLock; -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.utils.IpUtils; -import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.utils.SpringContextUtils; -import com.epmet.dto.CustomerStaffDTO; import com.epmet.entity.LogOperationEntity; -import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.mq.listener.bean.log.LogOperationHelper; import com.epmet.mq.listener.bean.log.OperatorInfo; import com.epmet.service.LogOperationService; +import org.apache.commons.lang3.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; @@ -40,8 +37,15 @@ public class AuthOperationLogListener 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) { @@ -54,6 +58,7 @@ public class AuthOperationLogListener implements MessageListenerConcurrently { private void consumeMessage(MessageExt messageExt) { String tags = messageExt.getTags(); String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("认证操作日志监听器-收到消息内容:{}", msg); LoginMQMsg msgObj = JSON.parseObject(msg, LoginMQMsg.class); @@ -91,5 +96,27 @@ public class AuthOperationLogListener implements MessageListenerConcurrently { } 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.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【登录操作事件监听器】删除pendingMsgLabel成功:{}", pendingMsgLabel); } } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java index f953c35edc..d883b7b1f6 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java @@ -1,10 +1,13 @@ package com.epmet.mq.listener.listener; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.PointRuleChangedMQMsg; 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 com.epmet.entity.LogOperationEntity; import com.epmet.enums.SystemMessageTypeEnum; @@ -34,8 +37,15 @@ public class PointOperationLogListener 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) { @@ -48,6 +58,7 @@ public class PointOperationLogListener implements MessageListenerConcurrently { private void consumeMessage(MessageExt messageExt) { String opeType = messageExt.getTags(); String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("积分操作日志监听器-收到消息内容:{}", msg); PointRuleChangedMQMsg msgObj = JSON.parseObject(msg, PointRuleChangedMQMsg.class); @@ -87,5 +98,27 @@ public class PointOperationLogListener implements MessageListenerConcurrently { } 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.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【积分操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel); } } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java index 13384ea62e..d968d95448 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java @@ -1,11 +1,14 @@ package com.epmet.mq.listener.listener; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.LoginMQMsg; import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg; 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 com.epmet.entity.LogOperationEntity; import com.epmet.mq.listener.bean.log.LogOperationHelper; @@ -34,8 +37,15 @@ public class ProjectOperationLogListener 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) { @@ -48,6 +58,7 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently private void consumeMessage(MessageExt messageExt) { //String tags = messageExt.getTags(); String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("项目变动操作日志监听器-收到消息内容:{}", msg); ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class); @@ -87,6 +98,14 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently } finally { distributedLock.unLock(lock); } + + if (StringUtils.isNotBlank(pendingMsgLabel)) { + try { + removePendingMqMsgCache(pendingMsgLabel); + } catch (Exception e) { + logger.error("【项目操作事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } } private String getOperationTypeDisplay(String type) { @@ -107,4 +126,18 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently return null; } } + + /** + * @description + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【项目操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel); + } } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java similarity index 81% rename from epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java rename to epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java index 593ab0cc57..a69de64cca 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/MQUserPropertys.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java @@ -1,4 +1,4 @@ -package com.epmet.constant; +package com.epmet.commons.rocketmq.constants; /** * @Description MQ用户自定义属性 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 9d2497f24e..ad66110c51 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 @@ -556,7 +556,7 @@ public class RedisKeys { * @author wxz * @date 2021.10.14 14:33:53 */ - public static String checkPendingMqMsgKey(String pendingMsgLabel) { + public static String pendingMqMsgKey(String pendingMsgLabel) { return rootPrefix.concat("message:mq:pending:").concat(pendingMsgLabel); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java index f62cfe09f8..932ce9e28f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java @@ -1,8 +1,10 @@ package com.epmet.mq; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg; 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; @@ -45,12 +47,18 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + long start = System.currentTimeMillis(); try { - List msgStrs = msgs.stream().map(messageExt -> new String(messageExt.getBody())).distinct().collect(Collectors.toList()); - for (String msgStr : msgStrs) { - consumeMessage(msgStr); + //List msgStrs = msgs.stream().map(messageExt -> new String(messageExt.getBody())).distinct().collect(Collectors.toList()); + //for (String msgStr : msgStrs) { + // consumeMessage(msgStr); + //} + + for (MessageExt msgExt : msgs) { + consumeMessage(msgExt); } + } catch (Exception e) { //失败不重发 logger.error("consumeMessage fail,msg:{}",e.getMessage()); @@ -60,7 +68,10 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } - private void consumeMessage(String msg) { + private void consumeMessage(MessageExt msgExt) { + String msg = new String(msgExt.getBody()); + String pendingMsgLabel = msgExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + logger.info("receive customerId:{}", JSON.toJSONString(msg)); ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class); if (msgObj == null){ @@ -87,6 +98,14 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently } else { log.info("该客户的项目变动消息刚刚消费,请等待30秒,customer id:{}", msgObj.getCustomerId()); } + + if (org.apache.commons.lang.StringUtils.isNotBlank(pendingMsgLabel)) { + try { + removePendingMqMsgCache(pendingMsgLabel); + } catch (Exception e) { + logger.error("【项目变动事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } } public void consumeMessage(ProjectChangedMQMsg msgObj) { @@ -151,6 +170,20 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently } + /** + * @description + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【项目变动事件监听器】删除mq滞留消息缓存失败:{}", pendingMsgLabel); + } + /*@Override public ConsumerConfigProperties getConsumerProperty() { ConsumerConfigProperties configProperties = new ConsumerConfigProperties(); diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java index 002d9ea424..cc353dd449 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java @@ -32,18 +32,9 @@ public class SystemMessageController { return new Result(); } - /** - * @description 应答mq消息 - * - * @param form - * @return - * @author wxz - * @date 2021.10.14 16:07:17 - */ - @PostMapping("ack-mq-msg") - public Result ackSystemMsgByMQ(@RequestBody SystemMsgFormDTO form) { - ValidatorUtils.validateEntity(form, SystemMsgFormDTO.AckMsgByMQ.class); - systemMessageService.ackMqMessage(form.getPendingMsgLabel()); + @PostMapping("pendding-mq-msg-scan") + public Result penddingMqMsgScan() { + systemMessageService.penddingMqMsgScan(); return new Result(); } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java index 25189683f0..f48e56cf9f 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java @@ -14,13 +14,12 @@ public interface SystemMessageService { void sendMQMessage(String messageType, Object content); /** - * @description 消息应答 + * @description 扫描滞留消息 * - * @param pendingMsgLabel + * @param * @return * @author wxz - * @date 2021.10.14 15:07:09 + * @date 2021.10.15 10:13:37 */ - void ackMqMessage(String pendingMsgLabel); - + void penddingMqMsgScan(); } 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 a0add17a03..7bbc426d9e 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 @@ -2,13 +2,13 @@ package com.epmet.service.impl; import com.alibaba.fastjson.JSON; import com.epmet.auth.constants.AuthOperationConstants; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.constants.TopicConstants; 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.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; -import com.epmet.constant.MQUserPropertys; import com.epmet.constant.SystemMessageSendApproach; import com.epmet.constant.SystemMessageType; import com.epmet.dao.SystemMessageDao; @@ -26,7 +26,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; +import java.time.LocalDateTime; +import java.util.Set; import java.util.UUID; @Service @@ -34,6 +35,21 @@ public class SystemMessageServiceImpl implements SystemMessageService { private Logger logger = LoggerFactory.getLogger(getClass()); + // 消息堆积时间阈值,单位s + private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L1 = 1 * 60; + private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L2 = 2 * 60; + private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L3 = 5 * 60; + private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L4 = 10 * 60; + private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L5 = 30 * 60; + private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L6 = 60 * 60; + + // 堆积消息告警间隔时长,单位s + public static final long PENDDING_MQ_MSG_ALERT_SECONDS_DELTA = 60 * 60; + + // 各个级别上次告警时间 + private LocalDateTime l1LastAlertTime; + private LocalDateTime l6LastAlertTime; + @Autowired private SystemMessageDao systemMessageDao; @@ -47,27 +63,35 @@ public class SystemMessageServiceImpl implements SystemMessageService { @Override public void sendMQMessage(String messageType, Object content) { String contentStr = JSON.toJSONString(content); - //存储消息到表 + // 1.存储消息到表 SystemMessageEntity systemMessageEntity = new SystemMessageEntity(); systemMessageEntity.setMsgType(messageType); systemMessageEntity.setSendApproach(SystemMessageSendApproach.MQ); systemMessageEntity.setContent(contentStr); systemMessageDao.insert(systemMessageEntity); - // 缓存下来,供滞留消息扫描。TTL -1,永不过期 - MessageCacheBean mcb = new MessageCacheBean(new Date(), messageType, contentStr); - String pendingMsgLabel = UUID.randomUUID().toString().replace("-", ""); - String pendingMsgKey = RedisKeys.checkPendingMqMsgKey(pendingMsgLabel); - redisUtils.set(pendingMsgKey, mcb, -1); + String topic = getTopicByMsgType(messageType); + + // 2.缓存下来,供滞留消息扫描。TTL -1,永不过期 + String pendingMsgLabel = null; + String pendingMsgKey = null; + try { + MessageCacheBean mcb = new MessageCacheBean(LocalDateTime.now(), messageType, topic, contentStr); + pendingMsgLabel = UUID.randomUUID().toString().replace("-", ""); + pendingMsgKey = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.set(pendingMsgKey, mcb, -1); + } catch (Exception e) { + logger.error("将系统MQ消息存储到Redis滞留列表失败,业务继续执行,{}", ExceptionUtils.getThrowableErrorStackTrace(e)); + } - //发送mq消息 + // 3.发送mq消息 try { - Message meMessage = new Message(getTopicByMsgType(messageType), messageType, contentStr.getBytes(RemotingHelper.DEFAULT_CHARSET)); + Message meMessage = new Message(topic, messageType, contentStr.getBytes(RemotingHelper.DEFAULT_CHARSET)); meMessage.putUserProperty(MQUserPropertys.PENDING_MSG_LABEL, pendingMsgLabel); rocketMQTemplate.getProducer().send(meMessage); } catch (Exception e) { String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); - logger.error("发送系统消息失败,堆栈信息:{}", errorStackTrace); + logger.error("发送系统MQ消息失败,堆栈信息:{}", errorStackTrace); // 清理消息缓存 redisUtils.delete(pendingMsgKey); @@ -122,18 +146,60 @@ public class SystemMessageServiceImpl implements SystemMessageService { } @Override - public void ackMqMessage(String pendingMsgLabel) { - String key = RedisKeys.checkPendingMqMsgKey(pendingMsgLabel); - redisUtils.delete(key); - logger.info("【MQ消息应答】pendingMsgLabel{}", pendingMsgLabel); + public void penddingMqMsgScan() { + String scanKey = RedisKeys.pendingMqMsgKey("*"); + Set keys = redisUtils.keys(scanKey); + //System.out.println(keys); + for (String key : keys) { + MessageCacheBean mcb = (MessageCacheBean) redisUtils.get(key); + + LocalDateTime createTime = mcb.getCreateTime(); + LocalDateTime now = LocalDateTime.now(); + //long deltaSeconds = ChronoUnit.SECONDS.between(createTime, now); + + // 此处暂时使用粗粒度的Topic判断,耕细粒度的应该使用SystemMessageType + switch (mcb.getTopic()) { + case TopicConstants.AUTH: + case TopicConstants.GROUP_ACHIEVEMENT: + case TopicConstants.INIT_CUSTOMER: + case TopicConstants.ORG: + case TopicConstants.PATROL: + case TopicConstants.POINT: + case TopicConstants.STAFF: + + // 耗时较短。一个小时最多发送一次告警 + if (l1LastAlertTime == null || ( + createTime.plusSeconds(PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L1).isBefore(now) + && l1LastAlertTime.plusSeconds(PENDDING_MQ_MSG_ALERT_SECONDS_DELTA).isBefore(now)) + ) { + + logger.error("【MQ堆积消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生堆积", mcb.topic, mcb.messageType, key, keys.size()); + l1LastAlertTime = now; + + } + break; + + case TopicConstants.PROJECT_CHANGED: + // 耗时较长,一个小时最多发送一次告警 + if (l1LastAlertTime == null || ( + createTime.plusSeconds(PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L6).isBefore(now) + && l6LastAlertTime.plusSeconds(PENDDING_MQ_MSG_ALERT_SECONDS_DELTA).isBefore(now)) + ) { + logger.error("【MQ堆积消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生堆积", mcb.topic, mcb.messageType, key, keys.size()); + l1LastAlertTime = now; + } + break; + } + } } @Data @NoArgsConstructor @AllArgsConstructor - class MessageCacheBean { - private Date createTime; + static class MessageCacheBean { + private LocalDateTime createTime; private String messageType; + private String topic; private Object content; } } diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java index 19ca52066c..3554e961da 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java @@ -1,12 +1,17 @@ package com.epmet.mq.listener; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg; 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 com.epmet.dto.form.CategoryTagInitFormDTO; import com.epmet.service.IssueProjectCategoryDictService; +import org.apache.commons.lang3.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; @@ -32,8 +37,15 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu @Autowired private DistributedLock distributedLock; + 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) { @@ -45,6 +57,7 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu public void consumeMessage(MessageExt messageExt) { String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("初始化客户-初始化议题、项目的分类、标签数据-收到消息内容:{}", msg); InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); @@ -66,5 +79,27 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu } 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.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【议题/项目分类标签初始化事件监听器】删除mq滞留消息缓存失败:{}", pendingMsgLabel); } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java index 7224ea757a..e554e36f74 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java @@ -1,16 +1,20 @@ package com.epmet.mq.listener; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg; 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 com.epmet.constant.UserWorkType; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.form.AddAgencyAndStaffFormDTO; import com.epmet.dto.form.AdminStaffFromDTO; import com.epmet.service.AgencyService; +import org.apache.commons.lang3.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; @@ -32,8 +36,15 @@ public class InitCustomerOrgRolesListener 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) { @@ -45,6 +56,7 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently private void consumeMessage(MessageExt messageExt) { String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("初始化客户-初始化组织信息-收到消息内容:{}", msg); InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); @@ -65,6 +77,14 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently } finally { distributedLock.unLock(lock); } + + if (StringUtils.isNotBlank(pendingMsgLabel)) { + try { + removePendingMqMsgCache(pendingMsgLabel); + } catch (Exception e) { + logger.error("【客户初始化事件监听器】-orgRole-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } } /** @@ -100,6 +120,20 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently return agencyAndStaff; } + /** + * @description + * + * @param pendingMsgLabel + * @return + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【客户初始化事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); + } + /* @Override public ConsumerConfigProperties getConsumerProperty() { ConsumerConfigProperties configProperties = new ConsumerConfigProperties(); diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml index 211bef65a3..321234a904 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -172,7 +172,7 @@ SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd - local + false 192.168.1.140:9876;192.168.1.141:9876 diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index 467f690259..8365eaa9ba 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -1,13 +1,12 @@ package com.epmet.opendata.mq.listener; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; 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.utils.Result; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.utils.SpringContextUtils; -import com.epmet.constant.MQUserPropertys; -import com.epmet.dto.form.SystemMsgFormDTO; -import com.epmet.feign.EpmetMessageOpenFeignClient; import org.apache.commons.lang.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; @@ -28,17 +27,13 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent private Logger logger = LoggerFactory.getLogger(getClass()); - private EpmetMessageOpenFeignClient messageOpenFeignClient; + private RedisUtils redisUtils; @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - if (messageOpenFeignClient == null) { - try { - messageOpenFeignClient = SpringContextUtils.getBean(EpmetMessageOpenFeignClient.class); - } catch (Exception e) { - e.printStackTrace(); - } + if (redisUtils == null) { + redisUtils = SpringContextUtils.getBean(RedisUtils.class); } try { @@ -54,6 +49,7 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent // msg即为消息体 // tags为SystemMessageType.java中的项,为具体的操作,此处拿到tags,判断是创建还是变更,来做响应的后续操作即可 String msg = new String(messageExt.getBody()); + String topic = messageExt.getTopic(); String tags = messageExt.getTags(); String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); @@ -76,30 +72,26 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent //distributedLock.unLock(lock); } - // 应答mq消息(调用message服务的应答api) if (StringUtils.isNotBlank(pendingMsgLabel)) { try { - ackMqMsg(pendingMsgLabel); + removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【开放数据事件监听器】-应答mq消息失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【开放数据事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } /** - * @description 应答mq消息 + * @description * * @param pendingMsgLabel * @return * @author wxz * @date 2021.10.14 16:32:32 */ - private void ackMqMsg(String pendingMsgLabel) { - SystemMsgFormDTO form = new SystemMsgFormDTO(); - form.setPendingMsgLabel(pendingMsgLabel); - Result result = messageOpenFeignClient.ackSystemMsgByMQ(form); - if (!result.success()) { - logger.error("调用Message服务应答MQ消息失败:{}", result.getMsg()); - } + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【开放数据事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java index c8251c80fa..9fe2e34eed 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java @@ -1,8 +1,13 @@ package com.epmet.opendata.mq.listener; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; 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.lang3.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; @@ -22,8 +27,15 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr 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) { @@ -37,7 +49,9 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr // msg即为消息体 // tags为SystemMessageType.java中的项,为具体的操作,此处拿到tags,判断是创建还是变更,来做响应的后续操作即可 String msg = new String(messageExt.getBody()); + String topic = messageExt.getTopic(); String tags = messageExt.getTags(); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("【开放数据事件监听器】-巡查记录信息变更-收到消息内容:{}, 操作:{}", msg, tags); @@ -57,5 +71,26 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr } 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.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java index 320b78f7ae..a6e853ba0f 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java @@ -1,12 +1,12 @@ package com.epmet.opendata.mq.listener; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; 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.utils.Result; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.utils.SpringContextUtils; -import com.epmet.constant.MQUserPropertys; -import com.epmet.dto.form.SystemMsgFormDTO; import com.epmet.feign.EpmetMessageOpenFeignClient; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; @@ -17,7 +17,6 @@ import org.redisson.api.RLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; import java.util.List; /** @@ -31,11 +30,13 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre private EpmetMessageOpenFeignClient messageOpenFeignClient; + private RedisUtils redisUtils; + @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - if (messageOpenFeignClient == null) { - messageOpenFeignClient = SpringContextUtils.getBean(EpmetMessageOpenFeignClient.class); + if (redisUtils == null) { + redisUtils = SpringContextUtils.getBean(RedisUtils.class); } try { @@ -51,6 +52,7 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre // msg即为消息体 // tags为SystemMessageType.java中的项,为具体的操作,此处拿到tags,判断是创建还是变更,来做响应的后续操作即可 String msg = new String(messageExt.getBody()); + String topic = messageExt.getTopic(); String tags = messageExt.getTags(); String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); @@ -76,30 +78,25 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre //distributedLock.unLock(lock); } - // 应答mq消息(调用message服务的应答api) if (StringUtils.isNotBlank(pendingMsgLabel)) { try { - ackMqMsg(pendingMsgLabel); + removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【开放数据事件监听器】-应答mq消息失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【开放数据事件监听器】-staff-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } /** - * @description 应答mq消息 + * @description * * @param pendingMsgLabel * @return * @author wxz * @date 2021.10.14 16:32:32 */ - private void ackMqMsg(String pendingMsgLabel) { - SystemMsgFormDTO form = new SystemMsgFormDTO(); - form.setPendingMsgLabel(pendingMsgLabel); - Result result = messageOpenFeignClient.ackSystemMsgByMQ(form); - if (!result.success()) { - logger.error("调用Message服务应答MQ消息失败:{}", result.getMsg()); - } + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java index d21ea39357..b6c91d276d 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java @@ -1,13 +1,17 @@ package com.epmet.mq.listener; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg; 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 com.epmet.dto.CustomerHomeDTO; import com.epmet.service.CustomerHomeService; +import org.apache.commons.lang3.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; @@ -15,7 +19,6 @@ import org.apache.rocketmq.common.message.MessageExt; import org.redisson.api.RLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; import java.util.List; import java.util.concurrent.TimeUnit; @@ -28,8 +31,15 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent 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) { @@ -41,6 +51,7 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent private void consumeMessage(MessageExt messageExt) { String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("初始化客户-初始化客户自定义信息-收到消息内容:{}", msg); InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); @@ -66,6 +77,28 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent } 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.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【开放数据事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); } /* @Override diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java index 33c0ff7c63..8996de4f47 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java @@ -1,9 +1,13 @@ package com.epmet.mq; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; 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 com.epmet.modules.group.service.StatsAchievementService; import lombok.extern.slf4j.Slf4j; @@ -31,8 +35,15 @@ public class GroupAchievementCustomListener implements MessageListenerConcurren 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); + } + long start = System.currentTimeMillis(); try { msgs.forEach(this::consumeMessage); @@ -48,6 +59,7 @@ public class GroupAchievementCustomListener implements MessageListenerConcurren private void consumeMessage(MessageExt messageExt) { logger.info("receive msg:{}", JSON.toJSONString(messageExt)); String msg = new String(messageExt.getBody()); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); GroupAchievementMQMsg msgObj = JSON.parseObject(msg, GroupAchievementMQMsg.class); if (msgObj == null){ @@ -87,9 +99,29 @@ public class GroupAchievementCustomListener implements MessageListenerConcurren 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.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + logger.info("【小组成就事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); + } /*@Override public ConsumerConfigProperties getConsumerProperty() { From 5d25979c582c4e07c3c1ee72da42035a75df1772 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 14:36:42 +0800 Subject: [PATCH 015/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=B6=88=E8=B4=B9=E6=B6=88=E6=81=AF=E6=8F=92=E5=85=A5=E6=88=96?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/constant/StrConstant.java | 5 + .../commons/tools/dto/form/PageFormDTO.java | 13 +- .../dto/user/param/MidPatrolFormDTO.java | 29 ++++ .../user/result/MidPatrolDetailResult.java | 56 ++++++++ .../user/result/MidPatrolRecordResult.java | 132 ++++++++++++++++++ .../feign/DataStatisticalOpenFeignClient.java | 26 ++++ ...ataStatisticalOpenFeignClientFallBack.java | 35 ++++- .../controller/DataReportingController.java | 31 ++++ .../main/java/com/epmet/dao/user/UserDao.java | 5 + .../epmet/service/DataReportingService.java | 23 +++ .../impl/DataReportingServiceImpl.java | 16 +++ .../com/epmet/service/user/UserService.java | 10 +- .../service/user/impl/UserServiceImpl.java | 11 ++ .../main/resources/mapper/user/UserDao.xml | 27 ++++ .../user/impl/UserServiceImplTest.java | 46 ++++++ .../dto/form/UpsertPatrolRecordForm.java | 5 + .../open-data-worker-server/pom.xml | 12 ++ ...etailDao.java => UserPatrolDetailDao.java} | 2 +- .../impl/UserPatrolDetailServiceImpl.java | 4 +- .../impl/UserPatrolRecordServiceImpl.java | 123 +++++++++++++++- ...lDetailDao.xml => UserPatrolDetailDao.xml} | 2 +- 21 files changed, 600 insertions(+), 13 deletions(-) create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/param/MidPatrolFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolDetailResult.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java create mode 100644 epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java rename epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/{StaffPatrolDetailDao.java => UserPatrolDetailDao.java} (92%) rename epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/{StaffPatrolDetailDao.xml => UserPatrolDetailDao.xml} (92%) 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 c601d2fd71..fd4a97d11e 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 @@ -44,6 +44,11 @@ public interface StrConstant { */ String COLON = ":"; + /** + * 英文分号 + */ + String SEMICOLON = ";"; + /** * 中文顿号 */ diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java index 134124f512..4820f4d50b 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java @@ -20,8 +20,17 @@ public class PageFormDTO { } @NotNull(message = "页码不能为空", groups = AddUserInternalGroup.class) - private Integer pageNo; + private Integer pageNo = 1; @NotNull(message = "每页数量不能为空", groups = AddUserInternalGroup.class) - private Integer pageSize; + private Integer pageSize = 20; + + /** + * 偏移量 从多少条开始 + */ + private Integer offset; + + public Integer getOffset() { + return (pageNo-1)*pageSize; + } } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/param/MidPatrolFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/param/MidPatrolFormDTO.java new file mode 100644 index 0000000000..b0810e54cc --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/param/MidPatrolFormDTO.java @@ -0,0 +1,29 @@ +package com.epmet.dto.user.param; + +import com.epmet.commons.tools.dto.form.PageFormDTO; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * desc:查询巡查 参数 + * + * @author zhaoqifeng + * @dscription + * @date 2021/6/7 16:23 + */ +@NoArgsConstructor +@Data +public class MidPatrolFormDTO extends PageFormDTO implements Serializable { + private static final long serialVersionUID = 4411051728689886810L; + /** + * 客户Id + */ + private String customerId; + /** + * 巡查记录id 没有则查询全部 + */ + private String patrolId; + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolDetailResult.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolDetailResult.java new file mode 100644 index 0000000000..434d2c8740 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolDetailResult.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.dto.user.result; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * 工作人员巡查明细记录 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-06-07 + */ +@Data +public class MidPatrolDetailResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户Id + */ + private String customerId; + + /** + * 维度 + */ + private String latitude; + + /** + * 经度 + */ + private String longitude; + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java new file mode 100644 index 0000000000..a08d7cba17 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.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.user.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 工作人员巡查主记录 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-06-07 + */ +@Data +public class MidPatrolRecordResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户Id + */ + private String customerId; + + /** + * 网格id + */ + private String grid; + + /** + * 网格所有上级id + */ + private String gridPids; + + /** + * 工作人员用户id + */ + private String staffId; + + /** + * 工作人员所属组织id=网格所属的组织id + */ + private String agencyId; + + /** + * 巡查开始时间 + */ + private Date patrolStartTime; + + /** + * 巡查结束时间,前端传入 + */ + private Date patrolEndTime; + + /** + * 实际结束时间=操作结束巡查的时间 + */ + private Date actrualEndTime; + + /** + * 本次巡查总耗时,单位秒;结束巡查时写入 + */ + private Integer totalTime; + + /** + * 正在巡查中:patrolling;结束:end + */ + private String status; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 维度 + */ + private String latitude; + + /** + * 精度 + */ + private String longitude; + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index c74dcff61c..e2856a9af7 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -16,9 +16,13 @@ import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.MidPatrolDetailResult; +import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBackFactory; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -305,4 +309,26 @@ public interface DataStatisticalOpenFeignClient { */ @PostMapping("/data/stats/datareporting/staffbaseinfo") Result> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO); + + /** + * 根据巡查记录id 获取巡查主记录信息 + * + * @param midPatrolFormDTO + * @return + * @author yinzuomei + * @date 2021/9/10 8:56 上午 + */ + @GetMapping(value = "/data/stats/datareporting/getPatrolRecordList") + Result> getPatrolRecordList(@RequestBody MidPatrolFormDTO midPatrolFormDTO); + + /** + * 根据巡查记录id 获取巡查轨迹(明细)信息 + * + * @param midPatrolFormDTO + * @return + * @author yinzuomei + * @date 2021/9/10 8:56 上午 + */ + @GetMapping(value = "/data/stats/datarng/getPatrolDetailList") + Result> getPatrolDetailList(@RequestBody MidPatrolFormDTO midPatrolFormDTO); } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java index dd8e5ada80..069de2e0ad 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java @@ -4,7 +4,10 @@ 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.StatsFormDTO; -import com.epmet.dto.extract.form.*; +import com.epmet.dto.extract.form.BizDataFormDTO; +import com.epmet.dto.extract.form.ExtractIndexFormDTO; +import com.epmet.dto.extract.form.ExtractOriginFormDTO; +import com.epmet.dto.extract.form.ExtractScreenFormDTO; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; import com.epmet.dto.org.AgencyBaseInfoFormDTO; @@ -14,9 +17,11 @@ import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.MidPatrolDetailResult; +import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.DataStatisticalOpenFeignClient; -import org.springframework.stereotype.Component; import java.util.List; @@ -288,4 +293,30 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp public Result> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getStaffBaseInfo", formDTO); } + + /** + * 根据巡查记录id 获取巡查主记录信息 + * + * @param midPatrolFormDTO + * @return + * @author yinzuomei + * @date 2021/9/10 8:56 上午 + */ + @Override + public Result> getPatrolRecordList(MidPatrolFormDTO midPatrolFormDTO) { + return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getPatrolRecordList", midPatrolFormDTO); + } + + /** + * 根据巡查记录id 获取巡查轨迹(明细)信息 + * + * @param midPatrolFormDTO + * @return + * @author yinzuomei + * @date 2021/9/10 8:56 上午 + */ + @Override + public Result> getPatrolDetailList(MidPatrolFormDTO midPatrolFormDTO) { + return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getPatrolDetailList", midPatrolFormDTO); + } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index 5775a22a2a..8314f6e390 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -7,7 +7,10 @@ import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.MidPatrolDetailResult; +import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.service.DataReportingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -57,4 +60,32 @@ public class DataReportingController { return new Result>().ok(dataReportingService.getStaffBaseInfo(formDTO)); } + /** + * desc: 条件获取巡查主表信息 + * + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + * @author LiuJanJun + * @date 2021/10/15 12:01 下午 + */ + @PostMapping("getPatrolRecordList") + public Result> getPatrolRecordList(@RequestBody(required = false) MidPatrolFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class); + return new Result>().ok(dataReportingService.getPatrolRecordList(formDTO)); + } + + /** + * desc: 条件获取巡查明细信息 + * + * @param formDTO + * @return com.epmet.commons.tools.utils.Result> + * @author LiuJanJun + * @date 2021/10/15 12:01 下午 + */ + @PostMapping("getPatrolDetailList") + public Result> getPatrolDetailList(@RequestBody(required = false) MidPatrolFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class); + return new Result>().ok(dataReportingService.getPatrolDetailList(formDTO)); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java index dac88a5fbf..5f2d700755 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java @@ -6,6 +6,7 @@ import com.epmet.dto.extract.result.UserPartyResultDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; import org.apache.ibatis.annotations.Mapper; @@ -259,5 +260,9 @@ public interface UserDao { * @Description 批量查询客户网格员基础信息 **/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); + + List getPatrolRecordList(MidPatrolFormDTO formDTO); + + List getPatrolDetailList(MidPatrolFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index 5d0c7538c5..3164c5fc35 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -5,7 +5,10 @@ import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.MidPatrolDetailResult; +import com.epmet.dto.user.result.MidPatrolRecordResult; import java.util.List; @@ -35,4 +38,24 @@ public interface DataReportingService { * @return*/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); + /** + * desc: 获取巡查记录列表 + * + * @param formDTO + * @return java.util.List + * @author LiuJanJun + * @date 2021/10/15 1:21 下午 + */ + List getPatrolRecordList(MidPatrolFormDTO formDTO); + + /** + * desc: 获取巡查明细列表 + * + * @param formDTO + * @return java.util.List + * @author LiuJanJun + * @date 2021/10/15 1:22 下午 + */ + List getPatrolDetailList(MidPatrolFormDTO formDTO); + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 211c4b5a7b..f3d1215173 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -5,10 +5,14 @@ import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.MidPatrolDetailResult; +import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.service.DataReportingService; import com.epmet.service.org.CustomerAgencyService; import com.epmet.service.org.CustomerGridService; +import com.epmet.service.user.StatsStaffPatrolService; import com.epmet.service.user.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +33,8 @@ public class DataReportingServiceImpl implements DataReportingService { private CustomerGridService customerGridService; @Autowired private UserService userService; + @Autowired + private StatsStaffPatrolService statsStaffPatrolService; /** * @Author sun @@ -63,4 +69,14 @@ public class DataReportingServiceImpl implements DataReportingService { return resultList; } + @Override + public List getPatrolRecordList(MidPatrolFormDTO formDTO) { + return userService.getPatrolRecordList(formDTO); + } + + @Override + public List getPatrolDetailList(MidPatrolFormDTO formDTO) { + return userService.getPatrolDetailList(formDTO); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java index cc75f43258..729623f10e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java @@ -8,10 +8,8 @@ import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.result.UserStatisticalData; import com.epmet.dto.user.StaffBaseInfoFormDTO; -import com.epmet.dto.user.result.StaffRoleInfoDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; -import com.epmet.dto.user.result.StaffPatrolRecordResult; -import com.epmet.dto.user.result.StatsStaffPatrolRecordDailyDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; +import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; import com.epmet.util.DimIdGenerator; @@ -144,4 +142,8 @@ public interface UserService { * @Description 批量查询客户网格员基础信息 **/ List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); + + List getPatrolRecordList(MidPatrolFormDTO formDTO); + + List getPatrolDetailList(MidPatrolFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java index 2c5e72333f..cabe064d84 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java @@ -18,6 +18,7 @@ import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.*; import com.epmet.dto.stats.user.result.UserStatisticalData; import com.epmet.dto.user.StaffBaseInfoFormDTO; +import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; import com.epmet.service.user.UserService; @@ -1098,4 +1099,14 @@ public class UserServiceImpl implements UserService { return userDao.getStaffBaseInfo(formDTO); } + @Override + public List getPatrolRecordList(MidPatrolFormDTO formDTO) { + return userDao.getPatrolRecordList(formDTO); + } + + @Override + public List getPatrolDetailList(MidPatrolFormDTO formDTO) { + return userDao.getPatrolDetailList(formDTO); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index e048aadd1d..b2cb63b899 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -1011,5 +1011,32 @@ + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java new file mode 100644 index 0000000000..682f71efd1 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java @@ -0,0 +1,46 @@ +package com.epmet.service.user.impl; + +import com.alibaba.fastjson.JSON; +import com.epmet.dto.user.param.MidPatrolFormDTO; +import com.epmet.dto.user.result.MidPatrolRecordResult; +import com.epmet.service.user.UserService; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.Assert.*; + +@RunWith(Arquillian.class) +public class UserServiceImplTest { + @Deployment + public static JavaArchive createDeployment() { + return ShrinkWrap.create(JavaArchive.class) + .addClass(UserServiceImpl.class) + .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); + } + @Autowired + private UserService userService; + + @Test + public void getPatrolRecordList() { + MidPatrolFormDTO midPatrolFormDTO = new MidPatrolFormDTO(); + midPatrolFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); + midPatrolFormDTO.setPatrolId(""); + midPatrolFormDTO.setPageNo(1); + midPatrolFormDTO.setPageSize(110); + + List patrolRecordList = userService.getPatrolRecordList(midPatrolFormDTO); + System.out.println(JSON.toJSONString(patrolRecordList)); + } + + @Test + public void getPatrolDetailList() { + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java index ecd3fee58d..23d412318b 100644 --- a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java @@ -2,6 +2,8 @@ package com.epmet.opendata.dto.form; import lombok.Data; +import javax.validation.constraints.NotEmpty; + /** * 插入或更新巡查记录主表 * @author liujianjun @@ -11,11 +13,13 @@ public class UpsertPatrolRecordForm { /** * 客户Id */ + @NotEmpty(message = "customerId不能为空") private String customerId; /** * 巡查记录id */ + @NotEmpty(message = "customerId不能为空") private String patrolId; /** @@ -23,6 +27,7 @@ public class UpsertPatrolRecordForm { * SystemMessageType.USER_PATROL_START * SystemMessageTypSTOP */ + @NotEmpty(message = "actionType不能为空") private String actionType; } diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml index 1c0da40f63..6466dc8a2a 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -72,6 +72,18 @@ 2.0.0 compile + + com.epmet + epmet-user-client + 2.0.0 + compile + + + com.epmet + data-statistical-client + 2.0.0 + compile + diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolDetailDao.java similarity index 92% rename from epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java rename to epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolDetailDao.java index ecae380d72..57fb4edc6d 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/StaffPatrolDetailDao.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/UserPatrolDetailDao.java @@ -28,6 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since v1.0.0 2021-10-14 */ @Mapper -public interface StaffPatrolDetailDao extends BaseDao { +public interface UserPatrolDetailDao extends BaseDao { } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java index 508c8f7859..e5b0956b16 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolDetailServiceImpl.java @@ -18,7 +18,7 @@ package com.epmet.opendata.service.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; -import com.epmet.opendata.dao.StaffPatrolDetailDao; +import com.epmet.opendata.dao.UserPatrolDetailDao; import com.epmet.opendata.entity.UserPatrolDetailEntity; import com.epmet.opendata.service.UserPatrolDetailService; import org.springframework.stereotype.Service; @@ -30,7 +30,7 @@ import org.springframework.stereotype.Service; * @since v1.0.0 2021-10-14 */ @Service -public class UserPatrolDetailServiceImpl extends BaseServiceImpl implements UserPatrolDetailService { +public class UserPatrolDetailServiceImpl extends BaseServiceImpl implements UserPatrolDetailService { diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index ee6ebed979..ad2d5f04f7 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -17,12 +17,30 @@ package com.epmet.opendata.service.impl; +import com.alibaba.fastjson.JSON; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.constant.SystemMessageType; +import com.epmet.dto.user.param.MidPatrolFormDTO; +import com.epmet.dto.user.result.MidPatrolDetailResult; +import com.epmet.dto.user.result.MidPatrolRecordResult; +import com.epmet.feign.DataStatisticalOpenFeignClient; +import com.epmet.opendata.dao.UserPatrolDetailDao; import com.epmet.opendata.dao.UserPatrolRecordDao; import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; +import com.epmet.opendata.entity.UserPatrolDetailEntity; import com.epmet.opendata.entity.UserPatrolRecordEntity; import com.epmet.opendata.service.UserPatrolRecordService; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; /** @@ -31,12 +49,115 @@ import org.springframework.stereotype.Service; * @author generator generator@elink-cn.com * @since v1.0.0 2021-10-14 */ +@Slf4j @Service public class UserPatrolRecordServiceImpl extends BaseServiceImpl implements UserPatrolRecordService { + @Autowired + private DataStatisticalOpenFeignClient dataStatisticalOpenFeignClient; + @Autowired + private UserPatrolDetailDao userPatrolDetailDao; @Override public Boolean upsertPatrolRecord(UpsertPatrolRecordForm patrolRecordForm) { - return null; + ValidatorUtils.validateEntity(patrolRecordForm); + boolean delFlag = false; + MidPatrolFormDTO midPatrolFormDTO = buildParam(patrolRecordForm); + Result> record = dataStatisticalOpenFeignClient.getPatrolRecordList(midPatrolFormDTO); + if (record == null || !record.success()){ + log.error("获取巡查记录失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); + return false; + } + List data = record.getData(); + if (CollectionUtils.isEmpty(data)){ + //数据已被删除了 + delFlag = true; + //暂时设置error 用于排错 + log.error("获取巡查记录返回为空,param:{}", JSON.toJSONString(midPatrolFormDTO)); + int effectRow = baseDao.deleteById(patrolRecordForm.getPatrolId()); + log.warn("del effectRow:{}",effectRow); + return true; + } + MidPatrolRecordResult recordResult = data.get(NumConstant.ZERO); + switch (patrolRecordForm.getActionType()){ + case SystemMessageType.USER_PATROL_START: + //insert + baseDao.insert(buildEntity(recordResult)); + break; + case SystemMessageType.USER_PATROL_STOP: + //update + baseDao.updateById(buildEntity(recordResult)); + Result> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); + if (detailResult == null || !detailResult.success()){ + log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); + return false; + } + UserPatrolDetailEntity detailEntity = buildDetailEntity(recordResult, detailResult); + + userPatrolDetailDao.insert(detailEntity); + break; + default: + log.info("======"); + + } + return true; + } + + @NotNull + private UserPatrolDetailEntity buildDetailEntity(MidPatrolRecordResult recordResult, Result> detailResult) { + UserPatrolDetailEntity detailEntity = new UserPatrolDetailEntity(); + detailEntity.setCustomerId(recordResult.getCustomerId()); + detailEntity.setStaffPatrolRecId(recordResult.getId()); + StringBuilder sb =new StringBuilder(); + detailResult.getData().forEach(o->{ + sb.append(o.getLongitude()) + .append(StrConstant.COMMA) + .append(o.getLatitude()) + .append(StrConstant.SEMICOLON); + }); + detailEntity.setRoute(sb.toString()); + detailEntity.setId(recordResult.getId()); + detailEntity.setRevision(recordResult.getRevision()); + detailEntity.setCreatedBy(recordResult.getCreatedBy()); + detailEntity.setCreatedTime(recordResult.getCreatedTime()); + detailEntity.setUpdatedBy(recordResult.getUpdatedBy()); + detailEntity.setUpdatedTime(recordResult.getUpdatedTime()); + detailEntity.setDelFlag(String.valueOf(recordResult.getDelFlag())); + return detailEntity; + } + + private UserPatrolRecordEntity buildEntity(MidPatrolRecordResult recordResult) { + UserPatrolRecordEntity entity = new UserPatrolRecordEntity(); + entity.setCustomerId(recordResult.getCustomerId()); + entity.setGrid(recordResult.getGrid()); + entity.setGridPids(recordResult.getGridPids()); + entity.setStaffId(recordResult.getStaffId()); + entity.setAgencyId(recordResult.getAgencyId()); + entity.setPatrolStartTime(recordResult.getPatrolStartTime()); + entity.setPatrolEndTime(recordResult.getPatrolEndTime()); + entity.setActrualEndTime(recordResult.getActrualEndTime()); + entity.setStartLocation(""); + entity.setEndLocation(""); + entity.setTotalTime(recordResult.getTotalTime()); + entity.setDistance(0); + entity.setStatus(recordResult.getStatus()); + entity.setId(recordResult.getId()); + entity.setRevision(recordResult.getRevision()); + entity.setCreatedBy(recordResult.getCreatedBy()); + entity.setCreatedTime(recordResult.getCreatedTime()); + entity.setUpdatedBy(recordResult.getUpdatedBy()); + entity.setUpdatedTime(recordResult.getUpdatedTime()); + entity.setDelFlag(String.valueOf(recordResult.getDelFlag())); + return entity; + } + + @NotNull + private MidPatrolFormDTO buildParam(UpsertPatrolRecordForm patrolRecordForm) { + MidPatrolFormDTO midPatrolFormDTO = new MidPatrolFormDTO(); + midPatrolFormDTO.setCustomerId(patrolRecordForm.getCustomerId()); + midPatrolFormDTO.setPatrolId(patrolRecordForm.getPatrolId()); + midPatrolFormDTO.setPageNo(0); + midPatrolFormDTO.setPageSize(1); + return midPatrolFormDTO; } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolDetailDao.xml similarity index 92% rename from epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml rename to epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolDetailDao.xml index bc66036982..bd61a74027 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/StaffPatrolDetailDao.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/UserPatrolDetailDao.xml @@ -1,7 +1,7 @@ - + From a2039c8b1b041a5dafdebb4e223b458e708f05dc Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 15 Oct 2021 14:40:14 +0800 Subject: [PATCH 016/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20spring.ap?= =?UTF-8?q?p.name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open-data-worker-server/src/main/resources/bootstrap.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml index 59302e27eb..49db95eb6d 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/bootstrap.yml @@ -8,7 +8,7 @@ spring: main: allow-bean-definition-overriding: true application: - name: open-data-server + name: open-data-worker-server #环境 dev|test|prod profiles: active: @spring.profiles.active@ From 757b04676b1a69558ecf578f219738ece9bc2a69 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 15 Oct 2021 14:44:40 +0800 Subject: [PATCH 017/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=20open-data?= =?UTF-8?q?-worker=E7=9A=84=E9=83=A8=E7=BD=B2=E7=9B=B8=E5=85=B3=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open-data-worker-server/Dockerfile | 11 +++++++++++ .../deploy/docker-compose-dev.yml | 18 ++++++++++++++++++ .../deploy/docker-compose-prod.yml | 18 ++++++++++++++++++ .../deploy/docker-compose-test.yml | 18 ++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/Dockerfile create mode 100644 epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-dev.yml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-prod.yml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-test.yml diff --git a/epmet-module/open-data-worker/open-data-worker-server/Dockerfile b/epmet-module/open-data-worker/open-data-worker-server/Dockerfile new file mode 100644 index 0000000000..bdbf6243c4 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/Dockerfile @@ -0,0 +1,11 @@ +FROM java:8 + +RUN export LANG="zh_CN.UTF-8" +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo 'Asia/Shanghai' > /etc/timezone + +COPY ./target/*.jar ./open-data-worker.jar + +EXPOSE 8107 + +ENTRYPOINT ["sh", "-c", "exec $RUN_INSTRUCT"] \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-dev.yml b/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-dev.yml new file mode 100644 index 0000000000..5df8669717 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-dev.yml @@ -0,0 +1,18 @@ +version: "3.7" +services: + gov-voice-server: + container_name: open-data-worker-server-dev + image: 192.168.1.140:5000/epmet-cloud-dev/open-data-worker-server:version_placeholder + ports: + - "8107:8107" + network_mode: host # 使用现有网络 + volumes: + - "/opt/epmet-cloud-logs/dev:/logs" + environment: + RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./open-data-worker.jar" + restart: "unless-stopped" + deploy: + resources: + limits: + cpus: '0.1' + memory: 250M \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-prod.yml b/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-prod.yml new file mode 100644 index 0000000000..feedbad307 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-prod.yml @@ -0,0 +1,18 @@ +version: "3.7" +services: + gov-voice-server: + container_name: open-data-worker-server-prod + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/open-data-worker-server:0.3.69 + ports: + - "8107:8107" + network_mode: host # 使用现有网络 + volumes: + - "/opt/epmet-cloud-logs/prod:/logs" + environment: + RUN_INSTRUCT: "java -Xms256m -Xmx512m -jar ./open-data-worker.jar" + restart: "unless-stopped" + deploy: + resources: + limits: + cpus: '0.1' + memory: 600M \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-test.yml b/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-test.yml new file mode 100644 index 0000000000..faa41dfeed --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-test.yml @@ -0,0 +1,18 @@ +version: "3.7" +services: + gov-voice-server: + container_name: open-data-worker-server-test + image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/open-data-worker-server:version_placeholder + ports: + - "8107:8107" + network_mode: host # 使用现有网络 + volumes: + - "/opt/epmet-cloud-logs/test:/logs" + environment: + RUN_INSTRUCT: "java -Xms32m -Xmx300m -jar ./open-data-worker.jar" + restart: "unless-stopped" + deploy: + resources: + limits: + cpus: '0.1' + memory: 350M \ No newline at end of file From e3d53046f7231024d5d3fe5494e83019e93da2dc Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 14:48:58 +0800 Subject: [PATCH 018/177] =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/impl/UserServiceImplTest.java | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java deleted file mode 100644 index 682f71efd1..0000000000 --- a/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/service/user/impl/UserServiceImplTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.epmet.service.user.impl; - -import com.alibaba.fastjson.JSON; -import com.epmet.dto.user.param.MidPatrolFormDTO; -import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.service.user.UserService; -import org.jboss.arquillian.container.test.api.Deployment; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.asset.EmptyAsset; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; - -import static org.junit.Assert.*; - -@RunWith(Arquillian.class) -public class UserServiceImplTest { - @Deployment - public static JavaArchive createDeployment() { - return ShrinkWrap.create(JavaArchive.class) - .addClass(UserServiceImpl.class) - .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); - } - @Autowired - private UserService userService; - - @Test - public void getPatrolRecordList() { - MidPatrolFormDTO midPatrolFormDTO = new MidPatrolFormDTO(); - midPatrolFormDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); - midPatrolFormDTO.setPatrolId(""); - midPatrolFormDTO.setPageNo(1); - midPatrolFormDTO.setPageSize(110); - - List patrolRecordList = userService.getPatrolRecordList(midPatrolFormDTO); - System.out.println(JSON.toJSONString(patrolRecordList)); - } - - @Test - public void getPatrolDetailList() { - } -} From 96fb383c8833e219a364aa672e2902d63c17f221 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 15 Oct 2021 14:50:06 +0800 Subject: [PATCH 019/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=201.?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5=202.aop=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=88=87=E9=9D=A2=203.ModuleCOnfingIMpl.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendata/aspect/RequestLogAspect.java | 40 +++++++++++++++++++ .../opendata/config/ModuleConfigImpl.java | 26 ++++++++++++ .../healthcheck/HealthCheckController.java | 21 ++++++++++ 3 files changed, 87 insertions(+) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/aspect/RequestLogAspect.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/ModuleConfigImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/healthcheck/HealthCheckController.java diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/aspect/RequestLogAspect.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/aspect/RequestLogAspect.java new file mode 100644 index 0000000000..506c00da2d --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/aspect/RequestLogAspect.java @@ -0,0 +1,40 @@ +package com.epmet.opendata.aspect; + +import com.epmet.commons.tools.aspect.BaseRequestLogAspect; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * 日志/异常处理切面实现,调用父类方法完成日志记录和异常处理。 + */ +@Aspect +@Component +@Order(0) +public class RequestLogAspect extends BaseRequestLogAspect { + + @Override + @Around(value = "execution(* com.epmet.opendata.controller.*Controller*.*(..)) ") + public Object proceed(ProceedingJoinPoint point) throws Throwable { + return super.proceed(point, getRequest()); + } + + /** + * 获取Request对象 + * + * @return + */ + private HttpServletRequest getRequest() { + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes) ra; + return sra.getRequest(); + } + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/ModuleConfigImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/ModuleConfigImpl.java new file mode 100644 index 0000000000..802c020918 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/ModuleConfigImpl.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.epmet.opendata.config; + +import com.epmet.commons.tools.config.ModuleConfig; +import org.springframework.stereotype.Service; + +/** + * 模块配置信息 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Service +public class ModuleConfigImpl implements ModuleConfig { + @Override + public String getName() { + return "govvoice"; + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/healthcheck/HealthCheckController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/healthcheck/HealthCheckController.java new file mode 100644 index 0000000000..0a6b1d6264 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/healthcheck/HealthCheckController.java @@ -0,0 +1,21 @@ +package com.epmet.opendata.healthcheck; + +import com.epmet.commons.tools.utils.Result; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("healthcheck") +public class HealthCheckController { + + /** + * http健康检查 + * @return + */ + @PostMapping("http") + public Result httpHealthCheck() { + return new Result(); + } + +} From 7c44e890f79d7ed4e68249be2c30a5c5d8769e83 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 15:27:49 +0800 Subject: [PATCH 020/177] =?UTF-8?q?=E8=B0=83=E6=95=B4feign=20stats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/feign/DataStatisticalOpenFeignClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index e2856a9af7..2cf227e5a0 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -318,7 +318,7 @@ public interface DataStatisticalOpenFeignClient { * @author yinzuomei * @date 2021/9/10 8:56 上午 */ - @GetMapping(value = "/data/stats/datareporting/getPatrolRecordList") + @PostMapping(value = "/data/stats/datareporting/getPatrolRecordList") Result> getPatrolRecordList(@RequestBody MidPatrolFormDTO midPatrolFormDTO); /** @@ -329,6 +329,6 @@ public interface DataStatisticalOpenFeignClient { * @author yinzuomei * @date 2021/9/10 8:56 上午 */ - @GetMapping(value = "/data/stats/datarng/getPatrolDetailList") + @PostMapping(value = "/data/stats/datareporting/getPatrolDetailList") Result> getPatrolDetailList(@RequestBody MidPatrolFormDTO midPatrolFormDTO); } From eb445cbd0b501c595fe5454293eab8471401f140 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 15 Oct 2021 15:28:42 +0800 Subject: [PATCH 021/177] =?UTF-8?q?=E4=B8=AD=E9=97=B4=E5=BA=93=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=90=8C=E6=AD=A5=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-statistical-client/pom.xml | 12 ++ .../epmet/dto/org/AgencyBaseInfoFormDTO.java | 29 --- .../epmet/dto/org/result/GridBaseInfoDTO.java | 103 ++++++++++ .../dto/user/result/GridUserInfoDTO.java | 152 ++++++++++++++ .../feign/DataStatisticalOpenFeignClient.java | 11 +- ...ataStatisticalOpenFeignClientFallBack.java | 17 +- .../data-statistical-server/pom.xml | 6 + .../controller/DataReportingController.java | 16 +- .../com/epmet/dao/org/CustomerGridDao.java | 10 +- .../epmet/dao/org/StatsCustomerAgencyDao.java | 4 +- .../main/java/com/epmet/dao/user/UserDao.java | 2 +- .../epmet/service/DataReportingService.java | 11 +- .../impl/DataReportingServiceImpl.java | 52 ++++- .../service/org/CustomerAgencyService.java | 4 +- .../service/org/CustomerGridService.java | 10 +- .../org/impl/CustomerAgencyServiceImpl.java | 4 +- .../org/impl/CustomerGridServiceImpl.java | 13 +- .../com/epmet/service/user/UserService.java | 4 +- .../service/user/impl/UserServiceImpl.java | 2 +- .../resources/mapper/org/CustomerGridDao.xml | 32 ++- .../mapper/org/StatsCustomerAgencyDao.xml | 10 +- .../main/resources/mapper/user/UserDao.xml | 11 +- .../epmet/opendata/dto/BaseGridInfoDTO.java | 136 +++++++++++++ .../epmet/opendata/dto/BaseGridUserDTO.java | 191 ++++++++++++++++++ .../dto/form}/GridBaseInfoFormDTO.java | 13 +- .../dto/form}/StaffBaseInfoFormDTO.java | 6 +- .../open-data-worker-server/pom.xml | 6 + .../controller/BaseGridInfoController.java | 67 ++++++ .../controller/BaseGridUserController.java | 59 ++++++ .../epmet/opendata/dao/BaseGridInfoDao.java | 41 ++++ .../epmet/opendata/dao/BaseGridUserDao.java | 41 ++++ .../opendata/entity/BaseGridInfoEntity.java | 106 ++++++++++ .../opendata/entity/BaseGridUserEntity.java | 161 +++++++++++++++ .../OpenDataOrgChangeEventListener.java | 19 +- .../OpenDataStaffChangeEventListener.java | 23 ++- .../opendata/service/BaseGridInfoService.java | 44 ++++ .../opendata/service/BaseGridUserService.java | 38 ++++ .../service/impl/BaseGridInfoServiceImpl.java | 120 +++++++++++ .../service/impl/BaseGridUserServiceImpl.java | 73 +++++++ .../main/resources/mapper/BaseGridInfoDao.xml | 50 +++++ .../main/resources/mapper/BaseGridUserDao.xml | 58 ++++++ 41 files changed, 1654 insertions(+), 113 deletions(-) delete mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/GridBaseInfoDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridInfoDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridUserDTO.java rename epmet-module/{data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org => open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form}/GridBaseInfoFormDTO.java (71%) rename epmet-module/{data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user => open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form}/StaffBaseInfoFormDTO.java (84%) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridInfoController.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridUserController.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridInfoDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridUserDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridInfoEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridUserEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridInfoService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridUserService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridInfoDao.xml create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridUserDao.xml diff --git a/epmet-module/data-statistical/data-statistical-client/pom.xml b/epmet-module/data-statistical/data-statistical-client/pom.xml index 1e128a8adf..34fae622ba 100644 --- a/epmet-module/data-statistical/data-statistical-client/pom.xml +++ b/epmet-module/data-statistical/data-statistical-client/pom.xml @@ -17,6 +17,18 @@ epmet-commons-tools 2.0.0 + + com.epmet + open-data-worker-client + 2.0.0 + compile + + + com.epmet + open-data-worker-client + 2.0.0 + compile + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java deleted file mode 100644 index c3e98287ad..0000000000 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/AgencyBaseInfoFormDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.epmet.dto.org; - -import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; -import java.util.List; - -/** - * @dscription 插叙客户网格基础信息--接口入参 - * @author sun - */ -@Data -public class AgencyBaseInfoFormDTO implements Serializable { - - private static final long serialVersionUID = -3634745091993094743L; - /** - * 客户Id - */ - @NotBlank(message = "事件标识不能为空", groups = {Agency.class}) - private String customerId = ""; - /** - * 组织Id - */ - private List agencyIdList; - public interface Agency extends CustomerClientShowGroup {} - -} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/GridBaseInfoDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/GridBaseInfoDTO.java new file mode 100644 index 0000000000..5da47611a5 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/GridBaseInfoDTO.java @@ -0,0 +1,103 @@ +/** + * 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.org.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 网格员基础信息表 + */ +@Data +public class GridBaseInfoDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 网格Id + */ + private String gridId; + /** + * 工作人员Id + */ + private String staffId; + /** + * 客户Id + */ + private String customerId; + + /** + * 网格编码 + */ + private String code; + + /** + * 网格名称 + */ + private String gridName; + + /** + * 网格员姓名 + */ + private String GRID_LEVEL; + + /** + * 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区; + */ + private String GRID_TYPE; + + /** + * 网格内人口规模[01:500人以下(含500人); 02:500-1000人(含1000人); 03:1000-1500人(含1500人); 04:1500人以上] + */ + private String POPULATION_SIZE; + + /** + * 是否成立网格党支部或网格党小组[Y:是、N:否] + */ + private String IS_PARTY_BRANCH; + + /** + * 网格党组织类型[01:网格党支部; 02:网格党小组] + */ + private String PARTY_BRANCH_TYPE; + + /** + * 中心点(质心)经度 + */ + private String LNG; + + /** + * 中心点(质心)纬度 + */ + private String LAT; + + /** + * 网格颜色 + */ + private Date GRID_COLOR; + + /** + * 空间范围 + */ + private String SHAPE; + + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java new file mode 100644 index 0000000000..6978b50bf9 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java @@ -0,0 +1,152 @@ +/** + * 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.user.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 网格员基础信息表 + */ +@Data +public class GridUserInfoDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 网格Id + */ + private String gridId; + /** + * 工作人员Id + */ + private String staffId; + /** + * 客户Id + */ + private String customerId; + + /** + * 网格编码 + */ + private String code; + + /** + * 网格名称 + */ + private String gridName; + + /** + * 网格员姓名 + */ + private String nickName; + + /** + * 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区; + */ + private String cardNum; + + /** + * 网格员类型[01:专职网格员; 02:兼职网格员; 03:网格长; 04:综治机构人员; 05:职能部门人员] + */ + private String userType; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 性别[1:男性; 2:女性; 9:未说明的性别] + */ + private String sex; + + /** + * 民族[字典表主键] + */ + private String nation; + + /** + * 政治面貌[字典表主键] + */ + private String paerty; + + /** + * 出生日期[YYYY-MM-DD] + */ + private Date birthday; + + /** + * 学历[字典表主键] + */ + private String education; + + /** + * 入职时间 + */ + private Date entryDate; + + /** + * 是否离职 + */ + private String isLeave; + + /** + * 离职时间 + */ + private Date leaveDate; + + /** + * 网格员年收入 + */ + private String income; + + /** + * 是否社区(村)两委委员[Y:是、N:否] + */ + private String isCommittee; + + /** + * 是否社区工作者[Y:是、N:否] + */ + private String isCommunityWorkers; + + /** + * 是否社会工作者[Y:是、N:否] + */ + private String isSocialWorker; + + /** + * 是否村(居)民小组长[Y:是、N:否 + */ + private String isVillageLeader; + + /** + * 是否警务助理[Y:是、N:否] + */ + private String isPoliceAssistant; + + /** + * 是否人民调解员[Y:是、N:否] + */ + private String isMediator; + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index c74dcff61c..2edd4f663f 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -9,15 +9,14 @@ import com.epmet.dto.extract.form.ExtractOriginFormDTO; import com.epmet.dto.extract.form.ExtractScreenFormDTO; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; -import com.epmet.dto.user.StaffBaseInfoFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBackFactory; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -290,7 +289,7 @@ public interface DataStatisticalOpenFeignClient { * @author sun */ @PostMapping("/data/stats/datareporting/agencybaseinfo") - Result> getAgencyBaseInfo(@RequestBody AgencyBaseInfoFormDTO formDTO); + Result> getAgencyBaseInfo(@RequestBody GridBaseInfoFormDTO formDTO); /** * @dscription 批量查询客户网格基础信息 @@ -304,5 +303,5 @@ public interface DataStatisticalOpenFeignClient { * @author sun */ @PostMapping("/data/stats/datareporting/staffbaseinfo") - Result> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO); + Result> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java index dd8e5ada80..4bcd51dc62 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java @@ -4,19 +4,20 @@ 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.StatsFormDTO; -import com.epmet.dto.extract.form.*; +import com.epmet.dto.extract.form.BizDataFormDTO; +import com.epmet.dto.extract.form.ExtractIndexFormDTO; +import com.epmet.dto.extract.form.ExtractOriginFormDTO; +import com.epmet.dto.extract.form.ExtractScreenFormDTO; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; -import com.epmet.dto.user.StaffBaseInfoFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.feign.DataStatisticalOpenFeignClient; -import org.springframework.stereotype.Component; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import java.util.List; @@ -275,7 +276,7 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp } @Override - public Result> getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { + public Result> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getAgencyBaseInfo", formDTO); } @@ -285,7 +286,7 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp } @Override - public Result> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { + public Result> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getStaffBaseInfo", formDTO); } } diff --git a/epmet-module/data-statistical/data-statistical-server/pom.xml b/epmet-module/data-statistical/data-statistical-server/pom.xml index 714dfa2c01..4e19d8988d 100644 --- a/epmet-module/data-statistical/data-statistical-server/pom.xml +++ b/epmet-module/data-statistical/data-statistical-server/pom.xml @@ -116,6 +116,12 @@ 2.0.0 compile + + com.epmet + open-data-worker-client + 2.0.0 + compile + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index 5775a22a2a..394f5218a5 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -2,12 +2,11 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; -import com.epmet.dto.user.StaffBaseInfoFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -32,8 +31,8 @@ public class DataReportingController { * @Description 批量查询客户组织基础信息 **/ @PostMapping("agencybaseinfo") - public Result> getAgencyBaseInfo(@RequestBody(required = false) AgencyBaseInfoFormDTO formDTO) { - ValidatorUtils.validateEntity(formDTO, AgencyBaseInfoFormDTO.Agency.class); + public Result> getAgencyBaseInfo(@RequestBody(required = false) GridBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, GridBaseInfoFormDTO.Grid.class); return new Result>().ok(dataReportingService.getAgencyBaseInfo(formDTO)); } @@ -52,9 +51,10 @@ public class DataReportingController { * @Description 批量查询客户网格员基础信息 **/ @PostMapping("staffbaseinfo") - public Result> getStaffBaseInfo(@RequestBody(required = false) StaffBaseInfoFormDTO formDTO) { + public Result> getStaffBaseInfo(@RequestBody(required = false) StaffBaseInfoFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class); - return new Result>().ok(dataReportingService.getStaffBaseInfo(formDTO)); + return new Result>().ok(dataReportingService.getStaffBaseInfo(formDTO)); } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java index 57f5119ad5..84743c5a76 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java @@ -22,10 +22,12 @@ import com.epmet.dto.group.AgencyDTO; import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.GridInfoDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.entity.org.CustomerGridEntity; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -103,4 +105,10 @@ public interface CustomerGridDao extends BaseDao { * @Description 批量查询客户网格基础信息 **/ List getGridBaseInfo(GridBaseInfoFormDTO formDTO); + + /** + * @Author sun + * @Description 查询工作人员所属网格信息 + **/ + List getStaffGrid(StaffBaseInfoFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java index f03cfc9cf4..d091e81711 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java @@ -2,11 +2,11 @@ package com.epmet.dao.org; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.AgencySubTreeDto; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.org.CustomerAgencyEntity; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -78,5 +78,5 @@ public interface StatsCustomerAgencyDao extends BaseDao { * @Author sun * @Description 批量查询客户组织基础信息 **/ - List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); + List getAgencyBaseInfo(GridBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java index dac88a5fbf..73de31ec9f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java @@ -5,9 +5,9 @@ import com.epmet.dto.extract.form.StaffPatrolStatsFormDTO; import com.epmet.dto.extract.result.UserPartyResultDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; -import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index 5d0c7538c5..607a0ac83a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -1,11 +1,10 @@ package com.epmet.service; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; -import com.epmet.dto.user.StaffBaseInfoFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import java.util.List; @@ -19,7 +18,7 @@ public interface DataReportingService { * @Description 批量查询客户组织基础信息 * * @return*/ - List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); + List getAgencyBaseInfo(GridBaseInfoFormDTO formDTO); /** * @Author sun @@ -33,6 +32,6 @@ public interface DataReportingService { * @Description 批量查询客户网格员基础信息 * * @return*/ - List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); + List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 211c4b5a7b..7a7e8f0c29 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -1,11 +1,11 @@ package com.epmet.service.impl; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; -import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; import com.epmet.service.org.CustomerAgencyService; import com.epmet.service.org.CustomerGridService; @@ -13,8 +13,9 @@ import com.epmet.service.user.UserService; 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.List; +import java.util.*; /** * @dscription 省网格化平台数据上报--数据查询 @@ -35,7 +36,7 @@ public class DataReportingServiceImpl implements DataReportingService { * @Description 批量查询客户组织基础信息 **/ @Override - public List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { + public List getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) { //批量查询客户组织信息 List resultList = customerAgencyService.getAgencyBaseInfo(formDTO); return resultList; @@ -57,9 +58,44 @@ public class DataReportingServiceImpl implements DataReportingService { * @Description 批量查询客户网格员基础信息 **/ @Override - public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { - //批量查询客户网格员信息 - List resultList = userService.getStaffBaseInfo(formDTO); + public List getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { + //1.查询工作人员所属网格信息 + List resultList = customerGridService.getStaffGrid(formDTO); + + //2.查询工作人员基础信息 + List staffDTOList = userService.getStaffBaseInfo(formDTO); + if (CollectionUtils.isEmpty(staffDTOList)) { + return new ArrayList<>(); + } + Map staffMap = new HashMap<>(); + staffDTOList.forEach(staff -> staffMap.put(staff.getUserId(), staff)); + + //3.封装数据 + resultList.forEach(st -> { + if (staffMap.containsKey(st.getStaffId())) { + CustomerStaffDTO dto = staffMap.get(st.getStaffId()); + st.setNickName(dto.getRealName()); + st.setCardNum("01"); + st.setUserType(dto.getWorkType().equals("fulltime") ? "01" : "02"); + st.setPhonenumber(dto.getMobile()); + st.setSex(0 == dto.getGender() ? "9" : dto.getGender().toString()); + st.setNation("01"); + st.setPaerty("13"); + st.setBirthday(new Date()); + st.setEducation("20"); + st.setEntryDate(new Date()); + st.setIsLeave("N"); + //st.setLeaveDate(); + st.setIncome("05"); + st.setIsCommittee("Y"); + st.setIsCommunityWorkers("Y"); + st.setIsSocialWorker("Y"); + st.setIsVillageLeader("Y"); + st.setIsPoliceAssistant("N"); + st.setIsMediator("Y"); + } + }); + return resultList; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java index 0e0c4eb882..490e598aff 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java @@ -1,10 +1,10 @@ package com.epmet.service.org; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.org.CustomerAgencyEntity; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import java.util.Date; import java.util.List; @@ -64,5 +64,5 @@ public interface CustomerAgencyService { * @Author sun * @Description 批量查询客户组织基础信息 **/ - List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO); + List getAgencyBaseInfo(GridBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java index 7078cc19da..a0d6fb449d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java @@ -5,10 +5,12 @@ import com.epmet.dto.group.AgencyDTO; import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.GridInfoDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.entity.org.CustomerGridEntity; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import java.util.Date; import java.util.List; @@ -84,4 +86,10 @@ public interface CustomerGridService extends BaseService { * @Description 批量查询客户网格基础信息 **/ List getGridBaseInfo(GridBaseInfoFormDTO formDTO); + + /** + * @Author sun + * @Description 查询工作人员所属网格信息 + **/ + List getStaffGrid(StaffBaseInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java index 4a8bb0d3e8..86ef831a2f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java @@ -5,7 +5,6 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.constant.DataSourceConstant; import com.epmet.dao.org.StatsCustomerAgencyDao; -import com.epmet.dto.org.AgencyBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; @@ -13,6 +12,7 @@ import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity; import com.epmet.entity.org.CustomerAgencyEntity; import com.epmet.entity.org.CustomerGridEntity; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; import com.epmet.service.org.CustomerAgencyService; @@ -279,7 +279,7 @@ public class CustomerAgencyServiceImpl implements CustomerAgencyService { * @Description 批量查询客户组织基础信息 **/ @Override - public List getAgencyBaseInfo(AgencyBaseInfoFormDTO formDTO) { + public List getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) { return customerAgencyDao.getAgencyBaseInfo(formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java index 063d1cca35..3a74f81639 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java @@ -9,10 +9,12 @@ import com.epmet.dto.group.AgencyDTO; import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; -import com.epmet.dto.org.GridBaseInfoFormDTO; import com.epmet.dto.org.GridInfoDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.entity.org.CustomerGridEntity; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.Issue.IssueService; import com.epmet.service.org.CustomerGridService; import org.springframework.beans.factory.annotation.Autowired; @@ -126,4 +128,13 @@ public class CustomerGridServiceImpl extends BaseServiceImpl getStaffGrid(StaffBaseInfoFormDTO formDTO) { + return customerGridDao.getStaffGrid(formDTO); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java index cc75f43258..1ea5ad88bf 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java @@ -7,12 +7,12 @@ import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.result.UserStatisticalData; -import com.epmet.dto.user.StaffBaseInfoFormDTO; -import com.epmet.dto.user.result.StaffRoleInfoDTO; import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.dto.user.result.StaffPatrolRecordResult; +import com.epmet.dto.user.result.StaffRoleInfoDTO; import com.epmet.dto.user.result.StatsStaffPatrolRecordDailyDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.util.DimIdGenerator; import java.util.Date; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java index 2c5e72333f..eca7be700c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java @@ -17,9 +17,9 @@ import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.*; import com.epmet.dto.stats.user.result.UserStatisticalData; -import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.user.UserService; import com.epmet.util.DimIdGenerator; import com.epmet.util.ModuleConstant; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml index 52264cd938..5d637d31de 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml @@ -128,17 +128,39 @@ + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml index 68cab60dd6..e1e4d79131 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml @@ -209,11 +209,13 @@ * FROM customer_agency - WHERE - del_flag = '0' + WHERE 1=1 + + AND del_flag = '0' + AND customer_id = #{customerId} - - + + #{agencyId} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index e048aadd1d..ad8f9de530 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -996,17 +996,10 @@ cs.* FROM customer_staff cs - INNER JOIN staff_role sr ON cs.user_id = sr.staff_id - INNER JOIN gov_staff_role gsr ON sr.role_id = gsr.id - WHERE - cs.del_flag = '0' - AND cs.enable_flag = 'enable' - AND sr.del_flag = '0' - AND gsr.del_flag = '0' - AND gsr.role_name = '网格员' + WHERE 1=1 AND cs.customer_id = #{customerId} - + #{staffId} diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridInfoDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridInfoDTO.java new file mode 100644 index 0000000000..2b105cfe85 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridInfoDTO.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.opendata.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 网格基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Data +public class BaseGridInfoDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户Id + */ + private String customerId; + + /** + * 组织/网格Id + */ + private String orgId; + + /** + * 网格编码 + */ + private String code; + + /** + * 网格名称 + */ + private String gridName; + + /** + * 网格层级[07:网格] + */ + private String gridLevel; + + /** + * 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区; + */ + private String gridType; + + /** + * 网格内人口规模[01:500人以下(含500人); 02:500-1000人(含1000人); 03:1000-1500人(含1500人); 04:1500人以上] + */ + private String populationSize; + + /** + * 是否成立网格党支部或网格党小组[Y:是、N:否] + */ + private String isPartyBranch; + + /** + * 网格党组织类型[01:网格党支部; 02:网格党小组] + */ + private String partyBranchType; + + /** + * 中心点(质心)经度 + */ + private String lng; + + /** + * 中心点(质心)纬度 + */ + private String lat; + + /** + * 网格颜色 + */ + private String gridColor; + + /** + * 空间范围 + */ + private String shape; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Long 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/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridUserDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridUserDTO.java new file mode 100644 index 0000000000..fb5218cdf8 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridUserDTO.java @@ -0,0 +1,191 @@ +/** + * 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.opendata.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 网格员基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Data +public class BaseGridUserDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户Id + */ + private String customerId; + + /** + * 网格Id + */ + private String gridId; + + /** + * 人员Id + */ + private String staffId; + + /** + * 网格编码 + */ + private String code; + + /** + * 网格名称 + */ + private String gridName; + + /** + * 网格员姓名 + */ + private String nickName; + + /** + * 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区; + */ + private String cardNum; + + /** + * 网格员类型[01:专职网格员; 02:兼职网格员; 03:网格长; 04:综治机构人员; 05:职能部门人员] + */ + private String userType; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 性别[1:男性; 2:女性; 9:未说明的性别] + */ + private String sex; + + /** + * 民族[字典表主键] + */ + private String nation; + + /** + * 政治面貌[字典表主键] + */ + private String paerty; + + /** + * 出生日期[YYYY-MM-DD] + */ + private Date birthday; + + /** + * 学历[字典表主键] + */ + private String education; + + /** + * 入职时间 + */ + private Date entryDate; + + /** + * 是否离职 + */ + private String isLeave; + + /** + * 离职时间 + */ + private Date leaveDate; + + /** + * 网格员年收入 + */ + private String income; + + /** + * 是否社区(村)两委委员[Y:是、N:否] + */ + private String isCommittee; + + /** + * 是否社区工作者[Y:是、N:否] + */ + private String isCommunityWorkers; + + /** + * 是否社会工作者[Y:是、N:否] + */ + private String isSocialWorker; + + /** + * 是否村(居)民小组长[Y:是、N:否 + */ + private String isVillageLeader; + + /** + * 是否警务助理[Y:是、N:否] + */ + private String isPoliceAssistant; + + /** + * 是否人民调解员[Y:是、N:否] + */ + private String isMediator; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Long 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/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java similarity index 71% rename from epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java rename to epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java index 7aaaa77078..c14d4ee570 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/GridBaseInfoFormDTO.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java @@ -1,4 +1,4 @@ -package com.epmet.dto.org; +package com.epmet.opendata.dto.form; import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; import lombok.Data; @@ -23,7 +23,16 @@ public class GridBaseInfoFormDTO implements Serializable { /** * 网格Id */ - private List gridIdList; + private List orgIdList; + /** + * 数据类型【组织:agency 网格:grid】 + */ + private String orgType; + /** + * 操作类型【新增:add 修改删除:edit】 + */ + private String type; + public interface Grid extends CustomerClientShowGroup {} } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/StaffBaseInfoFormDTO.java similarity index 84% rename from epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java rename to epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/StaffBaseInfoFormDTO.java index fca748f654..d486c7f67a 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/StaffBaseInfoFormDTO.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/StaffBaseInfoFormDTO.java @@ -1,4 +1,4 @@ -package com.epmet.dto.user; +package com.epmet.opendata.dto.form; import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; import lombok.Data; @@ -24,6 +24,10 @@ public class StaffBaseInfoFormDTO implements Serializable { * 人员Id */ private List staffIdList; + /** + * 操作类型【新增:add 修改删除:edit】 + */ + private String type; public interface Staff extends CustomerClientShowGroup {} } diff --git a/epmet-module/open-data-worker/open-data-worker-server/pom.xml b/epmet-module/open-data-worker/open-data-worker-server/pom.xml index 1c0da40f63..544dd4bc94 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/pom.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/pom.xml @@ -72,6 +72,12 @@ 2.0.0 compile + + com.epmet + data-statistical-client + 2.0.0 + compile + diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridInfoController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridInfoController.java new file mode 100644 index 0000000000..531ecc8cde --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridInfoController.java @@ -0,0 +1,67 @@ +/** + * 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.opendata.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.service.BaseGridInfoService; +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; + + +/** + * 网格基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@RestController +@RequestMapping("basegridinfo") +public class BaseGridInfoController { + + @Autowired + private BaseGridInfoService baseGridInfoService; + + + /** + * @Author sun + * @Description 组织基础信息中介库同步 + **/ + @PostMapping("agencybaseinfo") + public Result getAgencyBaseInfo(@RequestBody(required = false) GridBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, GridBaseInfoFormDTO.Grid.class); + baseGridInfoService.getAgencyBaseInfo(formDTO); + return new Result(); + } + + /** + * @Author sun + * @Description 网格基础信息中介库同步 + **/ + @PostMapping("gridbaseinfo") + public Result getGridBaseInfo(@RequestBody(required = false) GridBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, GridBaseInfoFormDTO.Grid.class); + baseGridInfoService.getGridBaseInfo(formDTO); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridUserController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridUserController.java new file mode 100644 index 0000000000..dcf3146724 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseGridUserController.java @@ -0,0 +1,59 @@ +/** + * 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.opendata.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; +import com.epmet.opendata.service.BaseGridUserService; +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-15 + */ +@RestController +@RequestMapping("basegriduser") +public class BaseGridUserController { + + @Autowired + private BaseGridUserService baseGridUserService; + + /** + * @Author sun + * @Description 网格员信息中间库同步 + **/ + @PostMapping("staffbaseinfo") + public Result getStaffBaseInfo(@RequestBody(required = false) StaffBaseInfoFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class); + baseGridUserService.getStaffBaseInfo(formDTO); + return new Result(); + } + + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridInfoDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridInfoDao.java new file mode 100644 index 0000000000..40c5649d1b --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridInfoDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.BaseGridInfoEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网格基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Mapper +public interface BaseGridInfoDao extends BaseDao { + + /** + * @Author sun + * @Description 网格基础信息批量更新部分字段 + **/ + void updateBatch(@Param("list") List entityList); +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridUserDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridUserDao.java new file mode 100644 index 0000000000..c53eb48e1f --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseGridUserDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.BaseGridUserEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网格员基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Mapper +public interface BaseGridUserDao extends BaseDao { + + /** + * @Author sun + * @Description 网格员基础信息批量更新部分字段 + **/ + void updateBatch(@Param("list") List entityList); +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridInfoEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridInfoEntity.java new file mode 100644 index 0000000000..f74e8b2205 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridInfoEntity.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.opendata.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-15 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("base_grid_info") +public class BaseGridInfoEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * 组织/网格Id + */ + private String orgId; + + /** + * 网格编码 + */ + private String code; + + /** + * 网格名称 + */ + private String gridName; + + /** + * 网格层级[07:网格] + */ + private String gridLevel; + + /** + * 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区; + */ + private String gridType; + + /** + * 网格内人口规模[01:500人以下(含500人); 02:500-1000人(含1000人); 03:1000-1500人(含1500人); 04:1500人以上] + */ + private String populationSize; + + /** + * 是否成立网格党支部或网格党小组[Y:是、N:否] + */ + private String isPartyBranch; + + /** + * 网格党组织类型[01:网格党支部; 02:网格党小组] + */ + private String partyBranchType; + + /** + * 中心点(质心)经度 + */ + private String lng; + + /** + * 中心点(质心)纬度 + */ + private String lat; + + /** + * 网格颜色 + */ + private String gridColor; + + /** + * 空间范围 + */ + private String shape; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridUserEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridUserEntity.java new file mode 100644 index 0000000000..5d0b2f1de6 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseGridUserEntity.java @@ -0,0 +1,161 @@ +/** + * 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.opendata.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-15 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("base_grid_user") +public class BaseGridUserEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * 网格Id + */ + private String gridId; + + /** + * 人员Id + */ + private String staffId; + + /** + * 网格编码 + */ + private String code; + + /** + * 网格名称 + */ + private String gridName; + + /** + * 网格员姓名 + */ + private String nickName; + + /** + * 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区; + */ + private String cardNum; + + /** + * 网格员类型[01:专职网格员; 02:兼职网格员; 03:网格长; 04:综治机构人员; 05:职能部门人员] + */ + private String userType; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 性别[1:男性; 2:女性; 9:未说明的性别] + */ + private String sex; + + /** + * 民族[字典表主键] + */ + private String nation; + + /** + * 政治面貌[字典表主键] + */ + private String paerty; + + /** + * 出生日期[YYYY-MM-DD] + */ + private Date birthday; + + /** + * 学历[字典表主键] + */ + private String education; + + /** + * 入职时间 + */ + private Date entryDate; + + /** + * 是否离职 + */ + private String isLeave; + + /** + * 离职时间 + */ + private Date leaveDate; + + /** + * 网格员年收入 + */ + private String income; + + /** + * 是否社区(村)两委委员[Y:是、N:否] + */ + private String isCommittee; + + /** + * 是否社区工作者[Y:是、N:否] + */ + private String isCommunityWorkers; + + /** + * 是否社会工作者[Y:是、N:否] + */ + private String isSocialWorker; + + /** + * 是否村(居)民小组长[Y:是、N:否 + */ + private String isVillageLeader; + + /** + * 是否警务助理[Y:是、N:否] + */ + private String isPoliceAssistant; + + /** + * 是否人民调解员[Y:是、N:否] + */ + private String isMediator; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index 467f690259..be8849d216 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -1,5 +1,6 @@ package com.epmet.opendata.mq.listener; +import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -8,6 +9,8 @@ import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.constant.MQUserPropertys; import com.epmet.dto.form.SystemMsgFormDTO; import com.epmet.feign.EpmetMessageOpenFeignClient; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.service.BaseGridInfoService; import org.apache.commons.lang.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; @@ -18,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; +import java.util.concurrent.TimeUnit; /** * @Description 系统对接中间库,组织信息变更监听器 @@ -58,13 +62,20 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); logger.info("【开放数据事件监听器】-组织信息变更-收到消息内容:{},操作:{}", msg, tags); + GridBaseInfoFormDTO obj = JSON.parseObject(msg, GridBaseInfoFormDTO.class); DistributedLock distributedLock = null; RLock lock = null; try { - //distributedLock = SpringContextUtils.getBean(DistributedLock.class); - //lock = distributedLock.getLock(String.format("lock:open_data_org:%s", orgId), - // 30L, 30L, TimeUnit.SECONDS); + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + lock = distributedLock.getLock(String.format("lock:open_data_org:%s", obj.getOrgIdList()), + 30L, 30L, TimeUnit.SECONDS); + + if ("agency".equals(obj.getOrgType())) { + SpringContextUtils.getBean(BaseGridInfoService.class).getAgencyBaseInfo(obj); + } else { + SpringContextUtils.getBean(BaseGridInfoService.class).getGridBaseInfo(obj); + } } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-组织信息变更-同步信息到中间库失败:".concat(ExceptionUtils.getErrorStackTrace(e))); @@ -73,7 +84,7 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent logger.error("【开放数据事件监听器】-组织信息变更-同步信息到中间库失败:".concat(ExceptionUtils.getErrorStackTrace(e))); throw e; } finally { - //distributedLock.unLock(lock); + distributedLock.unLock(lock); } // 应答mq消息(调用message服务的应答api) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java index 320b78f7ae..2580364741 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java @@ -1,5 +1,6 @@ package com.epmet.opendata.mq.listener; +import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -8,6 +9,8 @@ import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.constant.MQUserPropertys; import com.epmet.dto.form.SystemMsgFormDTO; import com.epmet.feign.EpmetMessageOpenFeignClient; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; +import com.epmet.opendata.service.BaseGridUserService; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; @@ -17,14 +20,14 @@ import org.redisson.api.RLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; import java.util.List; +import java.util.concurrent.TimeUnit; /** - * @Description 系统对接中间库,工作人员信息变更监听器 * @author wxz + * @Description 系统对接中间库,工作人员信息变更监听器 * @date 2021.10.13 15:21:48 -*/ + */ public class OpenDataStaffChangeEventListener implements MessageListenerConcurrently { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -57,14 +60,15 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre //messageExt.propert logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}, pendingMsgLabel:{}", msg, tags, pendingMsgLabel); + StaffBaseInfoFormDTO obj = JSON.parseObject(msg, StaffBaseInfoFormDTO.class); DistributedLock distributedLock = null; RLock lock = null; try { - //distributedLock = SpringContextUtils.getBean(DistributedLock.class); - //lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", staffId), - // 30L, 30L, TimeUnit.SECONDS); - + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", obj.getStaffIdList()), + 30L, 30L, TimeUnit.SECONDS); + SpringContextUtils.getBean(BaseGridUserService.class).getStaffBaseInfo(obj); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-工作人员信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); @@ -73,7 +77,7 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre logger.error("【开放数据事件监听器】-工作人员信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); throw e; } finally { - //distributedLock.unLock(lock); + distributedLock.unLock(lock); } // 应答mq消息(调用message服务的应答api) @@ -87,10 +91,9 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre } /** - * @description 应答mq消息 - * * @param pendingMsgLabel * @return + * @description 应答mq消息 * @author wxz * @date 2021.10.14 16:32:32 */ diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridInfoService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridInfoService.java new file mode 100644 index 0000000000..f0fe03c28a --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridInfoService.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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.entity.BaseGridInfoEntity; + +/** + * 网格基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +public interface BaseGridInfoService extends BaseService { + + /** + * @Author sun + * @Description 组织基础信息中介库同步 + **/ + void getAgencyBaseInfo(GridBaseInfoFormDTO formDTO); + + /** + * @Author sun + * @Description 网格基础信息中介库同步 + **/ + void getGridBaseInfo(GridBaseInfoFormDTO formDTO); + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridUserService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridUserService.java new file mode 100644 index 0000000000..2cdda5d9c5 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseGridUserService.java @@ -0,0 +1,38 @@ +/** + * 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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; +import com.epmet.opendata.entity.BaseGridUserEntity; + +/** + * 网格员基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +public interface BaseGridUserService extends BaseService { + + /** + * @Author sun + * @Description 网格员信息中间库同步 + **/ + void getStaffBaseInfo(StaffBaseInfoFormDTO formDTO); + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java new file mode 100644 index 0000000000..a1b93cf4ed --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java @@ -0,0 +1,120 @@ +/** + * 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.opendata.service.impl; + +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.feign.DataStatisticalOpenFeignClient; +import com.epmet.opendata.dao.BaseGridInfoDao; +import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; +import com.epmet.opendata.entity.BaseGridInfoEntity; +import com.epmet.opendata.service.BaseGridInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 网格基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Service +public class BaseGridInfoServiceImpl extends BaseServiceImpl implements BaseGridInfoService { + @Autowired + private DataStatisticalOpenFeignClient dataStatisticalOpenFeignClient; + + /** + * @Author sun + * @Description 组织基础信息中介库同步 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) { + //1.查询网格基础信息 + Result> result = dataStatisticalOpenFeignClient.getAgencyBaseInfo(formDTO); + if (!result.success()) { + throw new RenException(result.getInternalMsg()); + } + //2.中间库新增/修改数据 + List entityList = new ArrayList<>(); + result.getData().forEach(ag->{ + BaseGridInfoEntity entity = new BaseGridInfoEntity(); + entity.setCustomerId(ag.getCustomerId()); + entity.setOrgId(ag.getId()); + entity.setCode(""); + entity.setGridName(ag.getOrganizationName()); + String level = "06"; + if("province".equals(ag.getLevel())){ level = "01"; } + else if("city".equals(ag.getLevel())){ level = "02"; } + else if("district".equals(ag.getLevel())){ level = "03"; } + else if("street".equals(ag.getLevel())){ level = "04"; } + entity.setGridLevel(level); + entity.setGridType("01"); + entityList.add(entity); + }); + if("add".equals(formDTO.getType())){ + insertBatch(entityList); + }else { + baseDao.updateBatch(entityList); + } + + } + + /** + * @Author sun + * @Description 网格基础信息中介库同步 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void getGridBaseInfo(GridBaseInfoFormDTO formDTO) { + //1.查询网格基础信息 + Result> result = dataStatisticalOpenFeignClient.getGridBaseInfo(formDTO); + if (!result.success()) { + throw new RenException(result.getInternalMsg()); + } + //2.中间库新增/修改数据 + List entityList = new ArrayList<>(); + result.getData().forEach(ag->{ + BaseGridInfoEntity entity = new BaseGridInfoEntity(); + entity.setCustomerId(ag.getCustomerId()); + entity.setOrgId(ag.getId()); + entity.setCode(""); + entity.setGridName(ag.getGridName()); + entity.setGridLevel("07"); + entity.setGridType("01"); + entity.setDelFlag(ag.getDelFlag().toString()); + entity.setUpdatedBy(ag.getUpdatedBy()); + entity.setUpdatedTime(ag.getUpdatedTime()); + entityList.add(entity); + }); + if("add".equals(formDTO.getType())){ + insertBatch(entityList); + }else { + baseDao.updateBatch(entityList); + } + + } + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java new file mode 100644 index 0000000000..c323a8e2c4 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.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.opendata.service.impl; + +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.org.result.CustomerAgencyDTO; +import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.feign.DataStatisticalOpenFeignClient; +import com.epmet.opendata.dao.BaseGridUserDao; +import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; +import com.epmet.opendata.entity.BaseGridInfoEntity; +import com.epmet.opendata.entity.BaseGridUserEntity; +import com.epmet.opendata.service.BaseGridUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 网格员基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Service +public class BaseGridUserServiceImpl extends BaseServiceImpl implements BaseGridUserService { + @Autowired + private DataStatisticalOpenFeignClient dataStatisticalOpenFeignClient; + + /** + * @Author sun + * @Description 网格员信息中间库同步 + **/ + @Override + @Transactional(rollbackFor = Exception.class) + public void getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) { + //1.查询网格基础信息 + Result> result = dataStatisticalOpenFeignClient.getStaffBaseInfo(formDTO); + if (!result.success()) { + throw new RenException(result.getInternalMsg()); + } + //2.中间库新增/修改数据 + List entityList = ConvertUtils.sourceToTarget(result.getData(), BaseGridUserEntity.class); + if("add".equals(formDTO.getType())){ + insertBatch(entityList); + }else { + baseDao.updateBatch(entityList); + } + + } + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridInfoDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridInfoDao.xml new file mode 100644 index 0000000000..4d823eac28 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridInfoDao.xml @@ -0,0 +1,50 @@ + + + + + + + UPDATE base_grid_info + + + + + + when org_id = #{item.orgId} then #{item.gridName} + + + + + + + + when org_id = #{item.orgId} then #{item.delFlag} + + + + + + + + when org_id = #{item.orgId} then #{item.updatedBy} + + + + + + + + when org_id = #{item.orgId} then #{item.updatedTime} + + + + + + WHERE + 1=1 + + org_id = #{item.orgId} + + + + \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridUserDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridUserDao.xml new file mode 100644 index 0000000000..f5a47aea3a --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseGridUserDao.xml @@ -0,0 +1,58 @@ + + + + + + + UPDATE base_grid_user + + + + + + when (grid_id = #{item.gridId} AND staff_id = #{item.staffId} ) then #{item.gridName} + + + + + + + + when (grid_id = #{item.gridId} AND staff_id = #{item.staffId} ) then #{item.nickName} + + + + + + + + when (grid_id = #{item.gridId} AND staff_id = #{item.staffId} ) then #{item.delFlag} + + + + + + + + when (grid_id = #{item.gridId} AND staff_id = #{item.staffId} ) then #{item.updatedBy} + + + + + + + + when (grid_id = #{item.gridId} AND staff_id = #{item.staffId} ) then #{item.updatedTime} + + + + + + WHERE + 1=1 + + (grid_id = #{item.gridId} AND staff_id = #{item.staffId} ) + + + + \ No newline at end of file From 89a8c0cb47500cc91be86bc72463510ea900bce6 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 15 Oct 2021 15:33:22 +0800 Subject: [PATCH 022/177] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=201.OpenDat?= =?UTF-8?q?aOrgChangeEventListener=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/mq/ProjectChangedCustomListener.java | 2 +- .../epmet/mq/listener/IssueProjectCategoryTagInitListener.java | 2 +- .../com/epmet/mq/listener/InitCustomerOrgRolesListener.java | 2 +- .../opendata/mq/listener/OpenDataOrgChangeEventListener.java | 2 +- .../com/epmet/mq/listener/InitCustomerComponentsListener.java | 2 +- .../main/java/com/epmet/mq/GroupAchievementCustomListener.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java index 932ce9e28f..dd23989ca7 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java @@ -181,7 +181,7 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently private void removePendingMqMsgCache(String pendingMsgLabel) { String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【项目变动事件监听器】删除mq滞留消息缓存失败:{}", pendingMsgLabel); + logger.info("【项目变动事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } /*@Override diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java index 3554e961da..cb7af65139 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java @@ -100,6 +100,6 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu private void removePendingMqMsgCache(String pendingMsgLabel) { String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【议题/项目分类标签初始化事件监听器】删除mq滞留消息缓存失败:{}", pendingMsgLabel); + logger.info("【议题/项目分类标签初始化事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java index e554e36f74..31346a2e8b 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java @@ -131,7 +131,7 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently private void removePendingMqMsgCache(String pendingMsgLabel) { String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【客户初始化事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); + logger.info("【客户初始化事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } /* @Override diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index 8365eaa9ba..0f9192f281 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -92,6 +92,6 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent private void removePendingMqMsgCache(String pendingMsgLabel) { String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【开放数据事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); + logger.info("【开放数据事件监听器】删除mq滞留消息缓存成功,pendingMsgLabel:{}", pendingMsgLabel); } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java index b6c91d276d..d560979694 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java @@ -98,7 +98,7 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent private void removePendingMqMsgCache(String pendingMsgLabel) { String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【开放数据事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); + logger.info("【开放数据事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } /* @Override diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java index 8996de4f47..0462c3fe60 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java @@ -120,7 +120,7 @@ public class GroupAchievementCustomListener implements MessageListenerConcurren private void removePendingMqMsgCache(String pendingMsgLabel) { String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【小组成就事件监听器】删除mq滞留消息缓存失败,pendingMsgLabel:{}", pendingMsgLabel); + logger.info("【小组成就事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } /*@Override From dd3676855bec2ccbb9ca678677badb680c2783cf Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 15 Oct 2021 15:48:10 +0800 Subject: [PATCH 023/177] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=BC=95=E8=B5=B7=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/feign/DataStatisticalOpenFeignClient.java | 1 - .../src/main/java/com/epmet/service/user/UserService.java | 5 ----- .../java/com/epmet/service/user/impl/UserServiceImpl.java | 1 - .../opendata/mq/listener/OpenDataOrgChangeEventListener.java | 5 +---- 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index 4c5e1f9025..e91c56ad39 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -309,7 +309,6 @@ public interface DataStatisticalOpenFeignClient { */ @PostMapping("/data/stats/datareporting/staffbaseinfo") Result> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO); - Result> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO); /** * 根据巡查记录id 获取巡查主记录信息 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java index e7ff857219..cf98bb6c18 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java @@ -7,13 +7,8 @@ import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.result.UserStatisticalData; -import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; -import com.epmet.dto.user.result.CustomerStaffDTO; -import com.epmet.dto.user.result.StaffPatrolRecordResult; -import com.epmet.dto.user.result.StaffRoleInfoDTO; -import com.epmet.dto.user.result.StatsStaffPatrolRecordDailyDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.util.DimIdGenerator; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java index 433b659b59..f6dc980302 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java @@ -17,7 +17,6 @@ import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.*; import com.epmet.dto.stats.user.result.UserStatisticalData; -import com.epmet.dto.user.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index e1b1960ba7..5a13adb637 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -1,16 +1,13 @@ package com.epmet.opendata.mq.listener; -import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; 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 com.epmet.constant.MQUserPropertys; -import com.epmet.dto.form.SystemMsgFormDTO; -import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.service.BaseGridInfoService; import org.apache.commons.lang.StringUtils; From c084905cfd7308c63ce28e8154daed9d70a5714c Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 15:59:33 +0800 Subject: [PATCH 024/177] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mq/listener/OpenDataPatrolChangeEventListener.java | 4 ++-- .../opendata/service/impl/UserPatrolRecordServiceImpl.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java index 99d35daac1..a9797b34d8 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java @@ -80,10 +80,10 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr Boolean aBoolean = SpringContextUtils.getBean(UserPatrolRecordService.class).upsertPatrolRecord(patrolRecordForm); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 - logger.error("【开放数据事件监听器】-巡查记录信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + logger.error("【开放数据事件监听器】-巡查记录信息变更-失败:".concat(ExceptionUtils.getErrorStackTrace(e))); } catch (Exception e) { // 不是我们自己抛出的异常,可以让MQ重试 - logger.error("【开放数据事件监听器】-巡查记录信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + logger.error("【开放数据事件监听器】-巡查记录信息变更-失败:".concat(ExceptionUtils.getErrorStackTrace(e))); throw e; } finally { distributedLock.unLock(lock); diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index ad2d5f04f7..35d626e2eb 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -60,6 +60,7 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl Date: Fri, 15 Oct 2021 16:05:36 +0800 Subject: [PATCH 025/177] =?UTF-8?q?=E5=8F=91=E6=88=90=E5=8A=9F=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/StaffPatrolRecordServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java index b46f4a6eae..180aed8835 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StaffPatrolRecordServiceImpl.java @@ -289,7 +289,7 @@ public class StaffPatrolRecordServiceImpl extends BaseServiceImpl Date: Fri, 15 Oct 2021 16:30:26 +0800 Subject: [PATCH 026/177] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rocketmq/messages/StaffPatrolMQMsg.java | 7 ------- .../main/java/com/epmet/send/SendMqMsgUtil.java | 4 ++-- .../controller/UserPatrolRecordController.java | 15 +++++++++++++++ .../OpenDataPatrolChangeEventListener.java | 3 +-- .../service/impl/UserPatrolRecordServiceImpl.java | 2 +- .../impl/StaffPatrolRecordServiceImpl.java | 7 +++---- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java index f8221d7c76..d8d68cac56 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java @@ -18,11 +18,4 @@ public class StaffPatrolMQMsg { */ private String patrolId; - /** - * 操作类型 - * SystemMessageType.USER_PATROL_START - * SystemMessageTypSTOP - */ - private String actionType; - } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java index 32674d49f6..32b56b8973 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java @@ -135,10 +135,10 @@ public class SendMqMsgUtil { * @author wxz * @date 2021.06.21 12:46 */ - public boolean sendPatrolMqMsg(StaffPatrolMQMsg msg) { + public boolean sendPatrolMqMsg(StaffPatrolMQMsg msg,String messageType) { try { SystemMsgFormDTO msgForm = new SystemMsgFormDTO(); - msgForm.setMessageType(msg.getActionType()); + msgForm.setMessageType(messageType); msgForm.setContent(msg); Result sendMsgResult = null; log.info("sendPatrolMqMsg param:{}",msgForm); diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java index db95af4fe2..3ee9ab1ccf 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java @@ -17,8 +17,13 @@ package com.epmet.opendata.controller; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; import com.epmet.opendata.service.UserPatrolRecordService; 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; @@ -36,4 +41,14 @@ public class UserPatrolRecordController { @Autowired private UserPatrolRecordService userPatrolRecordService; + /** + * @Author sun + * @Description 网格员信息中间库同步 + **/ + @PostMapping("patrol") + public Result getStaffBaseInfo(@RequestBody(required = false) UpsertPatrolRecordForm formDTO) { + ValidatorUtils.validateEntity(formDTO); + userPatrolRecordService.upsertPatrolRecord(formDTO); + return new Result(); + } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java index a9797b34d8..a399c6c511 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java @@ -75,8 +75,7 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr UpsertPatrolRecordForm patrolRecordForm = new UpsertPatrolRecordForm(); patrolRecordForm.setCustomerId(msgObj.getCustomerId()); patrolRecordForm.setPatrolId(msgObj.getPatrolId()); - patrolRecordForm.setActionType(msgObj.getActionType()); - + patrolRecordForm.setActionType(tags); Boolean aBoolean = SpringContextUtils.getBean(UserPatrolRecordService.class).upsertPatrolRecord(patrolRecordForm); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index 35d626e2eb..c0bc420f09 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -157,7 +157,7 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl Date: Fri, 15 Oct 2021 16:48:47 +0800 Subject: [PATCH 027/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/basereport/form/EventInfoFormDTO.java | 17 ++ .../basereport/result/EventInfoResultDTO.java | 143 ++++++++++++ .../dto/screen/ScreenCustomerGridDTO.java | 2 +- .../dto/screen/ScreenProjectDataDTO.java | 7 +- .../controller/DataReportingController.java | 17 +- .../screen/ScreenCustomerAgencyEntity.java | 2 +- .../screen/ScreenCustomerGridEntity.java | 1 + .../screen/ScreenProjectDataEntity.java | 12 +- .../epmet/service/DataReportingService.java | 16 +- .../screen/ScreenCustomerAgencyService.java | 19 +- .../screen/ScreenCustomerGridService.java | 18 ++ .../screen/ScreenProjectDataService.java | 11 + .../impl/ScreenCustomerAgencyServiceImpl.java | 33 ++- .../impl/ScreenCustomerGridServiceImpl.java | 41 +++- .../impl/ScreenProjectDataServiceImpl.java | 26 ++- .../impl/DataReportingServiceImpl.java | 115 +++++++++- .../impl/ProjectProcessServiceImpl.java | 9 +- .../CustomerProjectCategoryDictService.java | 10 + ...ustomerProjectCategoryDictServiceImpl.java | 19 ++ .../opendata/dto/BaseDisputeProcessDTO.java | 207 ++++++++++++++++++ .../opendata/dao/BaseDisputeProcessDao.java | 33 +++ .../entity/BaseDisputeProcessEntity.java | 177 +++++++++++++++ .../service/BaseDisputeProcessService.java | 95 ++++++++ .../impl/BaseDisputeProcessServiceImpl.java | 99 +++++++++ .../mapper/BaseDisputeProcessDao.xml | 42 ++++ 25 files changed, 1149 insertions(+), 22 deletions(-) create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseDisputeProcessDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseDisputeProcessDao.xml diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java new file mode 100644 index 0000000000..f901f58270 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java @@ -0,0 +1,17 @@ +package com.epmet.dto.basereport.form; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/15 10:55 + */ +@Data +public class EventInfoFormDTO implements Serializable { + private static final long serialVersionUID = 8479649048108914555L; + private String customerId; + private String projectId; +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java new file mode 100644 index 0000000000..faff5af737 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java @@ -0,0 +1,143 @@ +package com.epmet.dto.basereport.result; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/15 10:57 + */ +@Data +public class EventInfoResultDTO implements Serializable { + private static final long serialVersionUID = -6483163020737762044L; + /** + * 客户Id + */ + private String customerId; + + /** + * 网格编码 + */ + private String orgCode; + + /** + * 网格名称 + */ + private String orgName; + + /** + * 事件名称 + */ + private String eventName; + + /** + * 事件类别 + */ + private String eventCategory; + + /** + * 上报时间 YYYY-MM-DD HH:MM:SS + */ + private Date reportTime; + + /** + * 发生时间 格式为“YYYY-MM-DD” + */ + private Date happenDate; + + /** + * 发生地点 + */ + private String happenPlace; + + /** + * 事件简述 + */ + private String eventDescription; + + /** + * 办结方式 01自办;02上报 源于居民端的最终结案的项目为02;工作端立项的项目最终结案的01 + */ + private String waysOfResolving; + + /** + * 是否办结 Y:是、N:否 + */ + private String successfulOrNo; + + /** + * 办结层级01省、自治区、直辖市02地、市、州、盟03县、市、区、旗04乡镇、街道05片区06村、社区07网格 + */ + private String completeLevel; + + /** + * 基础信息主键 + */ + private String baseInfoId; + + /** + * 办结时间 + */ + private Date completeTime; + + /** + * 经度 + */ + private BigDecimal lng; + + /** + * 纬度 + */ + private BigDecimal lat; + + /** + * 主要当事人姓名 + */ + private String name; + + /** + * 涉及人数 + */ + private Integer numberInvolved; + + /** + * 涉及单位 + */ + private String relatedUnits; + + /** + * 重点场所类别 01九小场所, 02公共场所 + */ + private String keyAreaType; + + /** + * 宗教活动规模 01 0-50人,02 51-200人,03 201人以上 + + */ + private String religionScale; + + /** + * 宗教类别 01道教 02佛教 03基督教 04伊斯兰教 05其他 + + */ + private String religionType; + + /** + * 重点场所是否变动 Y:是、N:否 + */ + private String isKeyareaState; + + /** + * 重点人员是否在当地 Y:是、N:否 + */ + private String isKeypeopleLocate; + + /** + * 重点人员现状 + */ + private String keypeopleStatus; +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenCustomerGridDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenCustomerGridDTO.java index 2a707f9540..2dcdc32028 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenCustomerGridDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenCustomerGridDTO.java @@ -43,7 +43,7 @@ public class ScreenCustomerGridDTO implements Serializable { * 客户id */ private String customerId; - + private String code; /** * 网格id */ diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java index fe859bfac0..0264c67805 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java @@ -165,7 +165,7 @@ public class ScreenProjectDataDTO implements Serializable { /** * 结案日期 */ - private String closeCaseTime; + private Date closeCaseTime; /** * 数据更新至: yyyy|yyyMM|yyyyMMdd @@ -185,4 +185,9 @@ public class ScreenProjectDataDTO implements Serializable { */ private BigDecimal satisfactionScore; + /** + * 分类编码,存在多个,以英文逗号隔开,注意与all_cagtegory_name顺序一致; + */ + private String categoryCode; + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index 23ad509167..d9de9bc1e1 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -2,13 +2,14 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; @@ -89,4 +90,16 @@ public class DataReportingController { return new Result>().ok(dataReportingService.getPatrolDetailList(formDTO)); } + /** + * @Description 事件上报 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/15 14:09 + */ + @PostMapping("eventinfo") + public Result> getEventInfo(@RequestBody(required = false) EventInfoFormDTO formDTO) { + return new Result>().ok(dataReportingService.getEventInfo(formDTO)); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java index ba06221d17..6bf9ea9e6f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java @@ -92,7 +92,7 @@ public class ScreenCustomerAgencyEntity extends BaseEpmetEntity { * 行政地区编码 */ private String areaCode; - + private String code; private String sourceType; /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java index 4a0d8e53c8..9de3701b58 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java @@ -39,6 +39,7 @@ public class ScreenCustomerGridEntity extends BaseEpmetEntity { * 客户id */ private String customerId; + private String code; /** * 网格id diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java index 52c9a19ab3..fe852b8dfa 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java @@ -132,7 +132,7 @@ public class ScreenProjectDataEntity extends BaseEpmetEntity { /** * 结案日期 */ - private String closeCaseTime; + private Date closeCaseTime; /** * 数据更新至: yyyy|yyyMM|yyyyMMdd @@ -148,4 +148,14 @@ public class ScreenProjectDataEntity extends BaseEpmetEntity { * 满意度得分 */ private BigDecimal satisfactionScore; + + /** + * 来源:议题issue 项目立项:agency 事件:resi_event; + */ + private String origin; + + /** + * 分类编码,存在多个,以英文逗号隔开,注意与all_cagtegory_name顺序一致; + */ + private String categoryCode; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index d1f051f8c6..bbaf18aa3c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -1,12 +1,14 @@ package com.epmet.service; +import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.dto.basereport.result.EventInfoResultDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; @@ -58,4 +60,14 @@ public interface DataReportingService { */ List getPatrolDetailList(MidPatrolFormDTO formDTO); + + /** + * 事件上报 + * @Param formDTO + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/15 14:10 + */ + List getEventInfo(EventInfoFormDTO formDTO); + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java index 5ded177ae0..fcb81fc243 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java @@ -17,6 +17,7 @@ package com.epmet.service.evaluationindex.screen; +import com.epmet.commons.mybatis.service.BaseService; import com.epmet.dto.CustomerAgencyDTO; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO; @@ -35,7 +36,7 @@ import java.util.Map; * @author generator generator@elink-cn.com * @since v1.0.0 2020-09-22 */ -public interface ScreenCustomerAgencyService{ +public interface ScreenCustomerAgencyService extends BaseService { /** * @Description 根据agencyId,查询所有子级agencyId,【当机关的级别为 community时,所有子级为gridId】 @@ -137,5 +138,21 @@ public interface ScreenCustomerAgencyService{ * @author sun */ List getByCustomerId(String customerId); + /** + * @Description 根据ID获取组织 + * @Param agencyId + * @Return {@link ScreenCustomerAgencyEntity} + * @Author zhaoqifeng + * @Date 2021/10/15 15:44 + */ + ScreenCustomerAgencyEntity getAgencyById(String agencyId); + /** + * @Description 获取组织列表 + * @Param customerId + * @Return {@link Map< String, ScreenCustomerAgencyEntity>} + * @Author zhaoqifeng + * @Date 2021/10/15 15:44 + */ + Map getAgencyList(String customerId); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java index 1fb59aa3b5..bf701b81d3 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java @@ -28,6 +28,7 @@ import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity; import com.epmet.entity.org.CustomerGridEntity; import java.util.List; +import java.util.Map; /** * 网格(党支部)信息 @@ -111,4 +112,21 @@ public interface ScreenCustomerGridService extends BaseService selectGridInfoList(String customerId, String pids); List selectEntityByAgencyId(String customerId, String parentAgencyId); + + /** + * @Description 根据ID获取网格 + * @Param gridId + * @Return {@link ScreenCustomerGridDTO} + * @Author zhaoqifeng + * @Date 2021/10/15 15:50 + */ + ScreenCustomerGridDTO getGridById(String gridId); + /** + * @Description 获取网格列表 + * @Param customerId + * @Return {@link Map} + * @Author zhaoqifeng + * @Date 2021/10/15 15:50 + */ + Map getGridList(String customerId); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java index 7b82707c91..2cf68852db 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java @@ -127,4 +127,15 @@ public interface ScreenProjectDataService extends BaseService meta,List orient); int updateProjectSatisfactionScore(String projectId, BigDecimal calProjectSatisfactionScore); + + /** + * 获取项目 + * @Param customerId + * @Param projectId + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/15 14:22 + */ + List getProjectList(String customerId, String projectId); + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java index 16ba642e62..972d8ef961 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java @@ -17,7 +17,9 @@ package com.epmet.service.evaluationindex.screen.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.dynamic.datasource.annotation.DataSource; +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.constant.DataSourceConstant; @@ -36,13 +38,14 @@ import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; import com.epmet.entity.org.CustomerAgencyEntity; import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; 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.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -54,7 +57,7 @@ import java.util.stream.Collectors; @Service @Slf4j @DataSource(DataSourceConstant.EVALUATION_INDEX) -public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyService { +public class ScreenCustomerAgencyServiceImpl extends BaseServiceImpl implements ScreenCustomerAgencyService { @Autowired private ScreenCustomerAgencyDao screenCustomerAgencyDao; @@ -304,4 +307,30 @@ public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyServ return screenCustomerAgencyDao.selectByCustomerId(customerId); } + @Override + public ScreenCustomerAgencyEntity getAgencyById(String agencyId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ScreenCustomerAgencyEntity::getAgencyId, agencyId); + return baseDao.selectOne(wrapper); + } + + /** + * @param customerId + * @Description 获取组织列表 + * @Param customerId + * @Return {@link Map< String, ScreenCustomerAgencyEntity>} + * @Author zhaoqifeng + * @Date 2021/10/15 15:44 + */ + @Override + public Map getAgencyList(String customerId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerAgencyEntity::getAgencyId, customerId); + List list = baseDao.selectList(wrapper); + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyMap(); + } + return list.stream().collect(Collectors.toMap(ScreenCustomerAgencyEntity::getAgencyId, Function.identity())); + } + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java index 1ae24e2d25..c87c58f7fd 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.constant.DataSourceConstant; import com.epmet.constant.OrgSourceTypeConstant; @@ -34,15 +35,15 @@ import com.epmet.dto.screen.ScreenProjectGridDailyDTO; import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity; import com.epmet.entity.org.CustomerGridEntity; import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; +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 org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 网格(党支部)信息 @@ -215,4 +216,36 @@ public class ScreenCustomerGridServiceImpl extends BaseServiceImpl selectEntityByAgencyId(String customerId, String parentAgencyId) { return baseDao.selectEntityByAgencyId(customerId,parentAgencyId); } + + /** + * @param gridId + * @Description 根据ID获取网格 + * @Param gridId + * @Return {@link ScreenCustomerGridDTO} + * @Author zhaoqifeng + * @Date 2021/10/15 15:50 + */ + @Override + public ScreenCustomerGridDTO getGridById(String gridId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ScreenCustomerGridEntity::getGridId, gridId); + ScreenCustomerGridEntity entity = baseDao.selectOne(wrapper); + return ConvertUtils.sourceToTarget(entity, ScreenCustomerGridDTO.class); + } + + /** + * @param customerId + * @Description 获取网格列表 + * @Param customerId + * @Return {@link Map } + * @Author zhaoqifeng + * @Date 2021/10/15 15:50 + */ + @Override + public Map getGridList(String customerId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerGridEntity::getGridId, customerId); + List list = baseDao.selectList(wrapper); + return ConvertUtils.sourceToTarget(list, ScreenCustomerGridDTO.class).stream().collect(Collectors.toMap(ScreenCustomerGridDTO::getGridId, Function.identity())); + } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java index 5e14db736e..855e1a6a29 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java @@ -17,6 +17,7 @@ package com.epmet.service.evaluationindex.screen.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.dynamic.datasource.annotation.DataSource; @@ -26,7 +27,8 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.constant.DataSourceConstant; -import com.epmet.dao.evaluationindex.screen.*; +import com.epmet.dao.evaluationindex.screen.ScreenProjectDataDao; +import com.epmet.dao.evaluationindex.screen.ScreenProjectImgDataDao; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.screen.form.ScreenProjectDataInfoFormDTO; import com.epmet.dto.screencoll.ScreenCollFormDTO; @@ -275,4 +277,26 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl} + * @Author zhaoqifeng + * @Date 2021/10/15 14:22 + */ + @Override + public List getProjectList(String customerId, String projectId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(customerId), ScreenProjectDataEntity::getCustomerId, customerId); + wrapper.eq(StringUtils.isNotBlank(projectId), ScreenProjectDataEntity::getProjectId, projectId); + wrapper.ne(ScreenProjectDataEntity::getCategoryCode, null); + wrapper.ne(ScreenProjectDataEntity::getCategoryCode, ""); + List list = baseDao.selectList(wrapper); + return ConvertUtils.sourceToTarget(list, ScreenProjectDataDTO.class); + } + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 6e2396199d..c1895ff7c9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -1,25 +1,42 @@ package com.epmet.service.impl; +import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.utils.DateUtils; +import com.epmet.constant.OrgTypeConstant; +import com.epmet.constant.ProjectConstant; +import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.screen.ScreenCustomerGridDTO; +import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.dto.user.result.GridUserInfoDTO; +import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; +import com.epmet.entity.stats.CustomerProjectCategoryDictEntity; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; +import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; +import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; +import com.epmet.service.evaluationindex.screen.ScreenProjectDataService; import com.epmet.service.org.CustomerAgencyService; import com.epmet.service.org.CustomerGridService; +import com.epmet.service.stats.CustomerProjectCategoryDictService; import com.epmet.service.user.StatsStaffPatrolService; import com.epmet.service.user.UserService; 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.util.CollectionUtils; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @dscription 省网格化平台数据上报--数据查询 @@ -34,8 +51,16 @@ public class DataReportingServiceImpl implements DataReportingService { private CustomerGridService customerGridService; @Autowired private UserService userService; + @Resource + private ScreenProjectDataService screenProjectDataService; + @Resource + private ScreenCustomerAgencyService screenCustomerAgencyService; + @Resource + private ScreenCustomerGridService screenCustomerGridService; @Autowired private StatsStaffPatrolService statsStaffPatrolService; + @Resource + private CustomerProjectCategoryDictService customerProjectCategoryDictService; /** * @Author sun @@ -105,6 +130,92 @@ public class DataReportingServiceImpl implements DataReportingService { return resultList; } + /** + * 事件上报 + * + * @param formDTO + * @Param formDTO + * @Return {@link List} + * @Author zhaoqifeng + * @Date 2021/10/15 14:10 + */ + @Override + public List getEventInfo(EventInfoFormDTO formDTO) { + List list; + //根据入参,获取项目 + List projectList = screenProjectDataService.getProjectList(formDTO.getCustomerId(), formDTO.getProjectId()); + //项目列表为空,返回空数组 + if(CollectionUtils.isEmpty(projectList)) { + return Collections.emptyList(); + } + //项目ID不为空时,因为只有一条,可以直接处理 + if (StringUtils.isNotEmpty(formDTO.getProjectId())) { + list = projectList.stream().map(project -> { + BaseDisputeProcessDTO dto = getBaseDisputeProcessDTO(project); + if (OrgTypeConstant.AGENCY.equals(project.getOrgType())) { + ScreenCustomerAgencyEntity agency = screenCustomerAgencyService.getAgencyById(project.getOrgId()); + dto.setOrgCode(agency.getCode()); + dto.setOrgName(agency.getAgencyName()); + } else { + ScreenCustomerGridDTO grid = screenCustomerGridService.getGridById(project.getOrgId()); + dto.setOrgCode(grid.getCode()); + dto.setOrgName(grid.getGridName()); + } + return dto; + }).collect(Collectors.toList()); + } else { + //项目ID不为空时,提前取出客户下的组织和网格 + Map agencyMap = screenCustomerAgencyService.getAgencyList(formDTO.getCustomerId()); + Map gridMap = screenCustomerGridService.getGridList(formDTO.getCustomerId()); + list = projectList.stream().map(project -> { + BaseDisputeProcessDTO dto = getBaseDisputeProcessDTO(project); + if (OrgTypeConstant.AGENCY.equals(project.getOrgType())) { + ScreenCustomerAgencyEntity agency = agencyMap.get(project.getOrgId()); + dto.setOrgCode(agency.getCode()); + dto.setOrgName(agency.getAgencyName()); + } else { + ScreenCustomerGridDTO grid = gridMap.get(project.getOrgId()); + dto.setOrgCode(grid.getCode()); + dto.setOrgName(grid.getGridName()); + } + return dto; + }).collect(Collectors.toList()); + } + return list.stream().filter(item -> StringUtils.isNotBlank(item.getEventCategory())).collect(Collectors.toList()); + } + + private BaseDisputeProcessDTO getBaseDisputeProcessDTO(ScreenProjectDataDTO project) { + BaseDisputeProcessDTO dto = new BaseDisputeProcessDTO(); + dto.setCustomerId(project.getCustomerId()); + dto.setEventName(project.getProjectTitle()); + String categoryCode = project.getCategoryCode().split(StrConstant.COMMA)[0]; + //如果是孔村、榆山、锦水的项目需要关联分类字典表 + if("2fe0065f70ca0e23ce4c26fca5f1d933".equals(project.getCustomerId()) || + "44876154d10d7cb7affd92000f84f833".equals(project.getCustomerId()) || + "46c55cb862d6d5e6d05d2ab61a1cc07e".equals(project.getCustomerId())) { + CustomerProjectCategoryDictEntity categoryEntity = customerProjectCategoryDictService.getByCategoryCode(project.getCustomerId(), categoryCode); + if (null != categoryEntity) { + categoryCode = categoryEntity.getEpmetCategoryCode(); + } else { + categoryCode = null; + } + } + dto.setReportTime(project.getProjectCreateTime()); + dto.setHappenDate(DateUtils.parseDate(DateUtils.format(project.getProjectCreateTime()), DateUtils.DATE_PATTERN)); + dto.setEventDescription(project.getProjectContent()); + //TODO 办结方式 + dto.setWaysOfResolving("01"); + dto.setSuccessfulOrNo(ProjectConstant.CLOSED_CASE.equals(project.getProjectStatusCode())?"Y":"N"); + //TODO 办结层级 + dto.setCompleteLevel("01"); + dto.setCompleteTime(project.getCloseCaseTime()); + dto.setLat(project.getLatitude()); + dto.setLng(project.getLongitude()); + return dto; + } + + + @Override public List getPatrolRecordList(MidPatrolFormDTO formDTO) { return userService.getPatrolRecordList(formDTO); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java index d16db0530e..a71c61bfbd 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java @@ -20,7 +20,6 @@ package com.epmet.service.project.impl; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; -import com.epmet.commons.tools.utils.DateUtils; import com.epmet.constant.DataSourceConstant; import com.epmet.dao.project.ProjectProcessDao; import com.epmet.dto.ProjectProcessDTO; @@ -40,7 +39,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -144,7 +145,7 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl closedInfo.stream().filter(closedCase -> StringUtils.equals(closedCase.getProjectId(),target.getProjectId())).map( merge -> { target.setProjectStatusCode("closed_case"); - target.setCloseCaseTime(DateUtils.format(merge.getCreatedTime(),DateUtils.DATE_TIME_PATTERN)); + target.setCloseCaseTime(merge.getCreatedTime()); return target; } )).collect(Collectors.toList()); @@ -166,7 +167,7 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl closedInfo.stream().filter(closedCase -> StringUtils.equals(closedCase.getProjectId(),target.getProjectId())).map( merge -> { //target.setProjectStatusCode("closed_case"); - target.setCloseCaseTime(DateUtils.format(merge.getCreatedTime(),DateUtils.DATE_TIME_PATTERN)); + target.setCloseCaseTime(merge.getCreatedTime()); return target; } )).collect(Collectors.toList()); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/CustomerProjectCategoryDictService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/CustomerProjectCategoryDictService.java index ef8440c594..cc8633b08f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/CustomerProjectCategoryDictService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/CustomerProjectCategoryDictService.java @@ -55,4 +55,14 @@ public interface CustomerProjectCategoryDictService extends BaseService formDTO); + + /** + * @Description 获取分类信息 + * @Param customerId + * @Param categoryCode + * @Return {@link CustomerProjectCategoryDictEntity} + * @Author zhaoqifeng + * @Date 2021/10/15 16:33 + */ + CustomerProjectCategoryDictEntity getByCategoryCode(String customerId, String categoryCode); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/CustomerProjectCategoryDictServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/CustomerProjectCategoryDictServiceImpl.java index 97a8a560f5..d7c81c93ad 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/CustomerProjectCategoryDictServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/CustomerProjectCategoryDictServiceImpl.java @@ -17,6 +17,7 @@ package com.epmet.service.stats.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; @@ -116,4 +117,22 @@ public class CustomerProjectCategoryDictServiceImpl extends BaseServiceImpl wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CustomerProjectCategoryDictEntity::getCategoryCode, categoryCode); + wrapper.eq(CustomerProjectCategoryDictEntity::getCustomerId, customerId); + return baseDao.selectOne(wrapper); + } } diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java new file mode 100644 index 0000000000..38ab49fc12 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java @@ -0,0 +1,207 @@ +/** + * 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.opendata.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 事件信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Data +public class BaseDisputeProcessDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 客户Id + */ + private String customerId; + + /** + * 网格编码 + */ + private String orgCode; + + /** + * 网格名称 + */ + private String orgName; + + /** + * 事件名称 + */ + private String eventName; + + /** + * 事件类别 + */ + private String eventCategory; + + /** + * 上报时间 YYYY-MM-DD HH:MM:SS + */ + private Date reportTime; + + /** + * 发生时间 格式为“YYYY-MM-DD” + */ + private Date happenDate; + + /** + * 发生地点 + */ + private String happenPlace; + + /** + * 事件简述 + */ + private String eventDescription; + + /** + * 办结方式 01自办;02上报 源于居民端的最终结案的项目为02;工作端立项的项目最终结案的01 + */ + private String waysOfResolving; + + /** + * 是否办结 Y:是、N:否 + */ + private String successfulOrNo; + + /** + * 办结层级 +01省、自治区、直辖市 +02地、市、州、盟 +03县、市、区、旗 +04乡镇、街道 +05片区 +06村、社区 +07网格 + + */ + private String completeLevel; + + /** + * 基础信息主键 + */ + private String baseInfoId; + + /** + * 办结时间 + */ + private Date completeTime; + + /** + * 经度 + */ + private BigDecimal lng; + + /** + * 纬度 + */ + private BigDecimal lat; + + /** + * 主要当事人姓名 + */ + private String name; + + /** + * 涉及人数 + */ + private Integer numberInvolved; + + /** + * 涉及单位 + */ + private String relatedUnits; + + /** + * 重点场所类别 01九小场所, 02公共场所 + */ + private String keyAreaType; + + /** + * 宗教活动规模 01 0-50人,02 51-200人,03 201人以上 + + */ + private String religionScale; + + /** + * 宗教类别 01道教 02佛教 03基督教 04伊斯兰教 05其他 + + */ + private String religionType; + + /** + * 重点场所是否变动 Y:是、N:否 + */ + private String isKeyareaState; + + /** + * 重点人员是否在当地 Y:是、N:否 + */ + private String isKeypeopleLocate; + + /** + * 重点人员现状 + */ + private String keypeopleStatus; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Long 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/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseDisputeProcessDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseDisputeProcessDao.java new file mode 100644 index 0000000000..c7b8df45d9 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseDisputeProcessDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.BaseDisputeProcessEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 事件信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Mapper +public interface BaseDisputeProcessDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java new file mode 100644 index 0000000000..c7266558ed --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java @@ -0,0 +1,177 @@ +/** + * 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.opendata.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 事件信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("base_dispute_process") +public class BaseDisputeProcessEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 客户Id + */ + private String customerId; + + /** + * 网格编码 + */ + private String orgCode; + + /** + * 网格名称 + */ + private String orgName; + + /** + * 事件名称 + */ + private String eventName; + + /** + * 事件类别 + */ + private String eventCategory; + + /** + * 上报时间 YYYY-MM-DD HH:MM:SS + */ + private Date reportTime; + + /** + * 发生时间 格式为“YYYY-MM-DD” + */ + private Date happenDate; + + /** + * 发生地点 + */ + private String happenPlace; + + /** + * 事件简述 + */ + private String eventDescription; + + /** + * 办结方式 01自办;02上报 源于居民端的最终结案的项目为02;工作端立项的项目最终结案的01 + */ + private String waysOfResolving; + + /** + * 是否办结 Y:是、N:否 + */ + private String successfulOrNo; + + /** + * 办结层级 +01省、自治区、直辖市 +02地、市、州、盟 +03县、市、区、旗 +04乡镇、街道 +05片区 +06村、社区 +07网格 + + */ + private String completeLevel; + + /** + * 基础信息主键 + */ + private String baseInfoId; + + /** + * 办结时间 + */ + private Date completeTime; + + /** + * 经度 + */ + private BigDecimal lng; + + /** + * 纬度 + */ + private BigDecimal lat; + + /** + * 主要当事人姓名 + */ + private String name; + + /** + * 涉及人数 + */ + private Integer numberInvolved; + + /** + * 涉及单位 + */ + private String relatedUnits; + + /** + * 重点场所类别 01九小场所, 02公共场所 + */ + private String keyAreaType; + + /** + * 宗教活动规模 01 0-50人,02 51-200人,03 201人以上 + + */ + private String religionScale; + + /** + * 宗教类别 01道教 02佛教 03基督教 04伊斯兰教 05其他 + + */ + private String religionType; + + /** + * 重点场所是否变动 Y:是、N:否 + */ + private String isKeyareaState; + + /** + * 重点人员是否在当地 Y:是、N:否 + */ + private String isKeypeopleLocate; + + /** + * 重点人员现状 + */ + private String keypeopleStatus; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java new file mode 100644 index 0000000000..874996c00b --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; +import com.epmet.opendata.entity.BaseDisputeProcessEntity; + +import java.util.List; +import java.util.Map; + +/** + * 事件信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +public interface BaseDisputeProcessService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-15 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-15 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return BaseDisputeProcessDTO + * @author generator + * @date 2021-10-15 + */ + BaseDisputeProcessDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-15 + */ + void save(BaseDisputeProcessDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-15 + */ + void update(BaseDisputeProcessDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-15 + */ + void delete(String[] ids); +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java new file mode 100644 index 0000000000..ade833cb71 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.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.opendata.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.opendata.dao.BaseDisputeProcessDao; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; +import com.epmet.opendata.entity.BaseDisputeProcessEntity; +import com.epmet.opendata.service.BaseDisputeProcessService; +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-15 + */ +@Service +public class BaseDisputeProcessServiceImpl extends BaseServiceImpl implements BaseDisputeProcessService { + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, BaseDisputeProcessDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, BaseDisputeProcessDTO.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 BaseDisputeProcessDTO get(String id) { + BaseDisputeProcessEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, BaseDisputeProcessDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(BaseDisputeProcessDTO dto) { + BaseDisputeProcessEntity entity = ConvertUtils.sourceToTarget(dto, BaseDisputeProcessEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(BaseDisputeProcessDTO dto) { + BaseDisputeProcessEntity entity = ConvertUtils.sourceToTarget(dto, BaseDisputeProcessEntity.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/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseDisputeProcessDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseDisputeProcessDao.xml new file mode 100644 index 0000000000..6fbc4d42a5 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/BaseDisputeProcessDao.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 71d8b978f21f833e6908c6b5f643e7c444b380c5 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 15 Oct 2021 16:52:00 +0800 Subject: [PATCH 028/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/DataStatisticalOpenFeignClient.java | 16 +++++++++++++--- ...ataStatisticalOpenFeignClientFallBack.java | 19 +++++++++++++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index e91c56ad39..50b339b697 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.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.StatsFormDTO; +import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.extract.form.BizDataFormDTO; import com.epmet.dto.extract.form.ExtractIndexFormDTO; import com.epmet.dto.extract.form.ExtractOriginFormDTO; @@ -14,15 +15,14 @@ import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBackFactory; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -331,4 +331,14 @@ public interface DataStatisticalOpenFeignClient { */ @PostMapping(value = "/data/stats/datareporting/getPatrolDetailList") Result> getPatrolDetailList(@RequestBody MidPatrolFormDTO midPatrolFormDTO); + + /** + * 事件上报 + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/15 16:50 + */ + @PostMapping("/data/stats/datareporting/eventinfo") + Result> getEventInfo(@RequestBody EventInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java index fd66b4a73f..b36b9e9434 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.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.StatsFormDTO; +import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.extract.form.BizDataFormDTO; import com.epmet.dto.extract.form.ExtractIndexFormDTO; import com.epmet.dto.extract.form.ExtractOriginFormDTO; @@ -15,11 +16,11 @@ import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; -import com.epmet.dto.user.result.CustomerStaffDTO; +import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.feign.DataStatisticalOpenFeignClient; +import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; @@ -319,4 +320,18 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp public Result> getPatrolDetailList(MidPatrolFormDTO midPatrolFormDTO) { return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getPatrolDetailList", midPatrolFormDTO); } + + /** + * 事件上报 + * + * @param formDTO + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2021/10/15 16:50 + */ + @Override + public Result> getEventInfo(EventInfoFormDTO formDTO) { + return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getEventInfo", formDTO); + } } From d1812d28ba9689d7f02003c2e6a605f6e58e7c1b Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 16:54:18 +0800 Subject: [PATCH 029/177] =?UTF-8?q?mq=E7=9B=91=E5=90=AC=E8=80=85=20?= =?UTF-8?q?=E6=A0=B9=E6=8D=AEtag=20=E8=B0=83=E7=94=A8=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserPatrolRecordController.java | 2 +- .../OpenDataPatrolChangeEventListener.java | 18 ++++- .../service/UserPatrolRecordService.java | 11 ++- .../impl/UserPatrolRecordServiceImpl.java | 80 +++++++++++++------ 4 files changed, 79 insertions(+), 32 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java index 3ee9ab1ccf..fb2334e8df 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/UserPatrolRecordController.java @@ -48,7 +48,7 @@ public class UserPatrolRecordController { @PostMapping("patrol") public Result getStaffBaseInfo(@RequestBody(required = false) UpsertPatrolRecordForm formDTO) { ValidatorUtils.validateEntity(formDTO); - userPatrolRecordService.upsertPatrolRecord(formDTO); + userPatrolRecordService.insertPatrolRecord(formDTO); return new Result(); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java index a399c6c511..c09267411e 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.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.constant.SystemMessageType; import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; import com.epmet.opendata.service.UserPatrolRecordService; import lombok.extern.slf4j.Slf4j; @@ -76,7 +77,19 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr patrolRecordForm.setCustomerId(msgObj.getCustomerId()); patrolRecordForm.setPatrolId(msgObj.getPatrolId()); patrolRecordForm.setActionType(tags); - Boolean aBoolean = SpringContextUtils.getBean(UserPatrolRecordService.class).upsertPatrolRecord(patrolRecordForm); + Boolean aBoolean = false; + switch (tags) { + case SystemMessageType.USER_PATROL_START: + aBoolean = SpringContextUtils.getBean(UserPatrolRecordService.class).insertPatrolRecord(patrolRecordForm); + break; + case SystemMessageType.USER_PATROL_STOP: + aBoolean = SpringContextUtils.getBean(UserPatrolRecordService.class).updatePatrolRecord(patrolRecordForm); + break; + default: + log.error("错误的消息类型:{}", tags); + + } + } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-巡查记录信息变更-失败:".concat(ExceptionUtils.getErrorStackTrace(e))); @@ -98,10 +111,9 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr } /** - * @description - * * @param pendingMsgLabel * @return + * @description * @author wxz * @date 2021.10.14 16:32:32 */ diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java index f3d12add5a..45d894e531 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java @@ -30,9 +30,16 @@ import com.epmet.opendata.entity.UserPatrolRecordEntity; public interface UserPatrolRecordService extends BaseService { /** - * desc:根据条件更新或者插入巡查记录 + * desc:根据条件插入巡查记录 * @param patrolRecordForm * @return */ - Boolean upsertPatrolRecord(UpsertPatrolRecordForm patrolRecordForm); + Boolean insertPatrolRecord(UpsertPatrolRecordForm patrolRecordForm); + + /** + * desc:根据条件更新巡查记录及轨迹 + * @param patrolRecordForm + * @return + */ + Boolean updatePatrolRecord(UpsertPatrolRecordForm patrolRecordForm); } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index c0bc420f09..fdf0c2bc18 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -18,12 +18,12 @@ package com.epmet.opendata.service.impl; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; -import com.epmet.constant.SystemMessageType; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; @@ -59,48 +59,76 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl> record = dataStatisticalOpenFeignClient.getPatrolRecordList(midPatrolFormDTO); - if (record == null || !record.success()){ + if (record == null || !record.success()) { log.error("获取巡查记录失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); return false; } List data = record.getData(); - if (CollectionUtils.isEmpty(data)){ + if (CollectionUtils.isEmpty(data)) { //数据已被删除了 delFlag = true; //暂时设置error 用于排错 log.error("获取巡查记录返回为空,param:{}", JSON.toJSONString(midPatrolFormDTO)); int effectRow = baseDao.deleteById(patrolRecordForm.getPatrolId()); - log.warn("del effectRow:{}",effectRow); + log.warn("del effectRow:{}", effectRow); return true; } MidPatrolRecordResult recordResult = data.get(NumConstant.ZERO); - switch (patrolRecordForm.getActionType()){ - case SystemMessageType.USER_PATROL_START: - //insert - baseDao.insert(buildEntity(recordResult)); - break; - case SystemMessageType.USER_PATROL_STOP: - //update - baseDao.updateById(buildEntity(recordResult)); - Result> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); - if (detailResult == null || !detailResult.success()){ - log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); - return false; - } - UserPatrolDetailEntity detailEntity = buildDetailEntity(recordResult, detailResult); + UserPatrolRecordEntity recordEntity = buildEntity(recordResult); - userPatrolDetailDao.insert(detailEntity); - break; - default: - log.info("======"); + //insert + baseDao.insert(recordEntity); + + return true; + } + + @Override + public Boolean updatePatrolRecord(UpsertPatrolRecordForm patrolRecordForm) { + log.info("updatePatrolRecord param:{}", JSON.toJSONString(patrolRecordForm)); + ValidatorUtils.validateEntity(patrolRecordForm); + boolean delFlag = false; + MidPatrolFormDTO midPatrolFormDTO = buildParam(patrolRecordForm); + Result> record = dataStatisticalOpenFeignClient.getPatrolRecordList(midPatrolFormDTO); + if (record == null || !record.success()) { + log.error("获取巡查记录失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); + return false; + } + List data = record.getData(); + if (CollectionUtils.isEmpty(data)) { + //数据已被删除了 + delFlag = true; + //暂时设置error 用于排错 + log.error("获取巡查记录返回为空,param:{}", JSON.toJSONString(midPatrolFormDTO)); + int effectRow = baseDao.deleteById(patrolRecordForm.getPatrolId()); + log.warn("del effectRow:{}", effectRow); + return true; + } + MidPatrolRecordResult recordResult = data.get(NumConstant.ZERO); + UserPatrolRecordEntity recordEntity = buildEntity(recordResult); + + //update + int effectRow = baseDao.updateById(recordEntity); + if (effectRow == 0) { + baseDao.insert(recordEntity); + } + Result> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); + if (detailResult == null || !detailResult.success()) { + log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); + return false; } + UserPatrolDetailEntity detailEntity = buildDetailEntity(recordResult, detailResult); + //先删除再新增 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserPatrolDetailEntity::getStaffPatrolRecId, recordEntity.getId()); + userPatrolDetailDao.delete(wrapper); + int insert = userPatrolDetailDao.insert(detailEntity); return true; } @@ -109,8 +137,8 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl{ + StringBuilder sb = new StringBuilder(); + detailResult.getData().forEach(o -> { sb.append(o.getLongitude()) .append(StrConstant.COMMA) .append(o.getLatitude()) From 92c29b03af6e8e9451454119f430c0477de39022 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Fri, 15 Oct 2021 17:08:28 +0800 Subject: [PATCH 030/177] =?UTF-8?q?closeCaseTime=E6=94=B9=E4=B8=BADate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/ScreenProjectDataInfoFormDTO.java | 3 ++- .../impl/ScreenProjectDataServiceImpl.java | 27 ++++++++----------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java index f0f6422e94..b977e08472 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java @@ -104,7 +104,8 @@ public class ScreenProjectDataInfoFormDTO implements Serializable { /** * 结案日期 */ - private String closeCaseTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date closeCaseTime; /** * 所有上级ID,用英文逗号分开 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java index 855e1a6a29..10678a2fbc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java @@ -44,7 +44,6 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; @@ -136,22 +135,18 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl Date: Fri, 15 Oct 2021 17:44:18 +0800 Subject: [PATCH 031/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/basereport/form/EventInfoFormDTO.java | 4 + .../dto/screen/ScreenProjectDataDTO.java | 4 - .../screen/ScreenProjectDataEntity.java | 9 -- .../impl/DataReportingServiceImpl.java | 1 + .../BaseDisputeProcessController.java | 56 +++++++++ .../opendata/mq/RocketMQConsumerRegister.java | 7 ++ .../OpenDataProjectChangeEventListener.java | 108 ++++++++++++++++++ .../service/BaseDisputeProcessService.java | 69 ++--------- .../impl/BaseDisputeProcessServiceImpl.java | 87 +++++--------- 9 files changed, 214 insertions(+), 131 deletions(-) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseDisputeProcessController.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java index f901f58270..dbbbe4bbf0 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java @@ -14,4 +14,8 @@ public class EventInfoFormDTO implements Serializable { private static final long serialVersionUID = 8479649048108914555L; private String customerId; private String projectId; + /** + * 操作类型【新增:add 修改删除:edit】 + */ + private String type; } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java index cf8282a98b..180ac24fe5 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java @@ -196,9 +196,5 @@ public class ScreenProjectDataDTO implements Serializable { * fact_origin_project_main_daily.grid_id对应的网格名称 */ private String tempGridName; - /** - * 分类编码,存在多个,以英文逗号隔开,注意与all_cagtegory_name顺序一致; - */ - private String categoryCode; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java index 9625df2ef3..b53feaf6f6 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java @@ -160,13 +160,4 @@ public class ScreenProjectDataEntity extends BaseEpmetEntity { */ private BigDecimal satisfactionScore; - /** - * 来源:议题issue 项目立项:agency 事件:resi_event; - */ - private String origin; - - /** - * 分类编码,存在多个,以英文逗号隔开,注意与all_cagtegory_name顺序一致; - */ - private String categoryCode; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index c1895ff7c9..249eb11c81 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -186,6 +186,7 @@ public class DataReportingServiceImpl implements DataReportingService { private BaseDisputeProcessDTO getBaseDisputeProcessDTO(ScreenProjectDataDTO project) { BaseDisputeProcessDTO dto = new BaseDisputeProcessDTO(); + dto.setId(project.getProjectId()); dto.setCustomerId(project.getCustomerId()); dto.setEventName(project.getProjectTitle()); String categoryCode = project.getCategoryCode().split(StrConstant.COMMA)[0]; diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseDisputeProcessController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseDisputeProcessController.java new file mode 100644 index 0000000000..038756ea9c --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/BaseDisputeProcessController.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.opendata.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.opendata.service.BaseDisputeProcessService; +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; + + +/** + * 事件信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@RestController +@RequestMapping("basedisputeprocess") +public class BaseDisputeProcessController { + + @Autowired + private BaseDisputeProcessService baseDisputeProcessService; + + /** + * 获取上报事件 + * @Param formDTO + * @Return {@link Result} + * @Author zhaoqifeng + * @Date 2021/10/15 16:59 + */ + @PostMapping("eventinfo") + public Result getEventinfo(@RequestBody(required = false) EventInfoFormDTO formDTO) { + baseDisputeProcessService.getEventinfo(formDTO); + return new Result(); + } + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java index 0a966910bd..2ffed8c3dd 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java @@ -6,6 +6,7 @@ import com.epmet.commons.rocketmq.register.MQAbstractRegister; import com.epmet.commons.rocketmq.register.MQConsumerProperties; import com.epmet.opendata.mq.listener.OpenDataOrgChangeEventListener; import com.epmet.opendata.mq.listener.OpenDataPatrolChangeEventListener; +import com.epmet.opendata.mq.listener.OpenDataProjectChangeEventListener; import com.epmet.opendata.mq.listener.OpenDataStaffChangeEventListener; import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; import org.springframework.stereotype.Component; @@ -41,6 +42,12 @@ public class RocketMQConsumerRegister extends MQAbstractRegister { TopicConstants.PATROL, "*", new OpenDataPatrolChangeEventListener()); + register(consumerProperties, + ConsomerGroupConstants.PROJECT_CHANGED_COMPONENTS_GROUP, + MessageModel.CLUSTERING, + TopicConstants.PROJECT_CHANGED, + "*", + new OpenDataProjectChangeEventListener()); // ...其他监听器类似 } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java new file mode 100644 index 0000000000..819c1975ce --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java @@ -0,0 +1,108 @@ +package com.epmet.opendata.mq.listener; + +import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.constants.MQUserPropertys; +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 com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; +import com.epmet.opendata.service.BaseDisputeProcessService; +import org.apache.commons.lang3.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; + +/** + * @author wxz + * @Description 系统对接中间库,项目信息变更监听器 + * @date 2021.10.13 15:21:48 + */ +public class OpenDataProjectChangeEventListener implements MessageListenerConcurrently { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + private EpmetMessageOpenFeignClient messageOpenFeignClient; + + 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.PENDING_MSG_LABEL); + + //messageExt.propert + + logger.info("【开放数据事件监听器】-项目信息变更-收到消息内容:{}, 操作:{}, pendingMsgLabel:{}", msg, tags, pendingMsgLabel); + EventInfoFormDTO obj = JSON.parseObject(msg, EventInfoFormDTO.class); + + DistributedLock distributedLock = null; + RLock lock = null; + try { + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + lock = distributedLock.getLock(String.format("lock:open_data_project:%s", obj.getProjectId()), + 30L, 30L, TimeUnit.SECONDS); + SpringContextUtils.getBean(BaseDisputeProcessService.class).getEventinfo(obj); + } catch (RenException e) { + // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 + logger.error("【开放数据事件监听器】-项目信息变更-上报项目信息失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + } catch (Exception e) { + // 不是我们自己抛出的异常,可以让MQ重试 + logger.error("【开放数据事件监听器】-项目信息变更-上报项目信息失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + throw e; + } finally { + distributedLock.unLock(lock); + } + + if (StringUtils.isNotBlank(pendingMsgLabel)) { + try { + removePendingMqMsgCache(pendingMsgLabel); + } catch (Exception e) { + logger.error("【开放数据事件监听器】-project-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + } + } + } + + /** + * @description + * + * @param pendingMsgLabel + * @return + * @description 应答mq消息 + * @author wxz + * @date 2021.10.14 16:32:32 + */ + private void removePendingMqMsgCache(String pendingMsgLabel) { + String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + redisUtils.delete(key); + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java index 874996c00b..20d2516dab 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseDisputeProcessService.java @@ -18,13 +18,9 @@ package com.epmet.opendata.service; import com.epmet.commons.mybatis.service.BaseService; -import com.epmet.commons.tools.page.PageData; -import com.epmet.opendata.dto.BaseDisputeProcessDTO; +import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.opendata.entity.BaseDisputeProcessEntity; -import java.util.List; -import java.util.Map; - /** * 事件信息表 * @@ -34,62 +30,11 @@ import java.util.Map; public interface BaseDisputeProcessService extends BaseService { /** - * 默认分页 - * - * @param params - * @return PageData - * @author generator - * @date 2021-10-15 - */ - PageData page(Map params); - - /** - * 默认查询 - * - * @param params - * @return java.util.List - * @author generator - * @date 2021-10-15 - */ - List list(Map params); - - /** - * 单条查询 - * - * @param id - * @return BaseDisputeProcessDTO - * @author generator - * @date 2021-10-15 - */ - BaseDisputeProcessDTO get(String id); - - /** - * 默认保存 - * - * @param dto - * @return void - * @author generator - * @date 2021-10-15 - */ - void save(BaseDisputeProcessDTO dto); - - /** - * 默认更新 - * - * @param dto - * @return void - * @author generator - * @date 2021-10-15 - */ - void update(BaseDisputeProcessDTO dto); - - /** - * 批量删除 - * - * @param ids - * @return void - * @author generator - * @date 2021-10-15 + * 获取上报事件 + * @Param formDTO + * @Return + * @Author zhaoqifeng + * @Date 2021/10/15 16:59 */ - void delete(String[] ids); + void getEventinfo(EventInfoFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java index ade833cb71..0a0d18a9f0 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java @@ -17,23 +17,21 @@ package com.epmet.opendata.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.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.feign.DataStatisticalOpenFeignClient; import com.epmet.opendata.dao.BaseDisputeProcessDao; import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.entity.BaseDisputeProcessEntity; import com.epmet.opendata.service.BaseDisputeProcessService; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; +import javax.annotation.Resource; import java.util.List; -import java.util.Map; /** * 事件信息表 @@ -43,57 +41,34 @@ import java.util.Map; */ @Service public class BaseDisputeProcessServiceImpl extends BaseServiceImpl implements BaseDisputeProcessService { + @Resource + private DataStatisticalOpenFeignClient dataStatisticalOpenFeignClient; + /** + * 获取上报事件 + * + * @param formDTO + * @Param formDTO + * @Return + * @Author zhaoqifeng + * @Date 2021/10/15 16:59 + */ @Override - public PageData page(Map params) { - IPage page = baseDao.selectPage( - getPage(params, FieldConstant.CREATED_TIME, false), - getWrapper(params) - ); - return getPageData(page, BaseDisputeProcessDTO.class); - } - - @Override - public List list(Map params) { - List entityList = baseDao.selectList(getWrapper(params)); - - return ConvertUtils.sourceToTarget(entityList, BaseDisputeProcessDTO.class); - } + public void getEventinfo(EventInfoFormDTO formDTO) { + Result> result = dataStatisticalOpenFeignClient.getEventInfo(formDTO); + if (!result.success()) { + throw new RenException(result.getInternalMsg()); + } + List list = result.getData(); + if (CollectionUtils.isNotEmpty(list)) { + List entityList = ConvertUtils.sourceToTarget(list, BaseDisputeProcessEntity.class); + if("add".equals(formDTO.getType())){ + insertBatch(entityList); + }else { + updateBatchById(entityList); + } + } - 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 BaseDisputeProcessDTO get(String id) { - BaseDisputeProcessEntity entity = baseDao.selectById(id); - return ConvertUtils.sourceToTarget(entity, BaseDisputeProcessDTO.class); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void save(BaseDisputeProcessDTO dto) { - BaseDisputeProcessEntity entity = ConvertUtils.sourceToTarget(dto, BaseDisputeProcessEntity.class); - insert(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(BaseDisputeProcessDTO dto) { - BaseDisputeProcessEntity entity = ConvertUtils.sourceToTarget(dto, BaseDisputeProcessEntity.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 From a1e3fbbbf1624f5a7ef8b9997ff2f47915118ade Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 15 Oct 2021 17:51:04 +0800 Subject: [PATCH 032/177] =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rocketmq/messages/OrgOrStaffMQMsg.java | 28 ++++++++++++++++ .../java/com/epmet/send/SendMqMsgUtil.java | 32 ++++++++++++++++--- 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java new file mode 100644 index 0000000000..bbe4f551db --- /dev/null +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java @@ -0,0 +1,28 @@ +package com.epmet.commons.rocketmq.messages; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 组织、网格、人员中间库数据上报MQ + * @author sun + */ +@Data +@AllArgsConstructor +public class OrgOrStaffMQMsg implements Serializable { + + //客户Id + private String customerId; + //组织、网格、人员Id + private String orgId; + //数据类型【组织:agency 网格:grid 人员:staff】 + private String orgType; + //操作类型【新增:add 修改删除:edit】 + private String type; + + +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java index 32674d49f6..b7ce5cdd19 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java @@ -1,10 +1,7 @@ package com.epmet.send; import com.alibaba.fastjson.JSON; -import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; -import com.epmet.commons.rocketmq.messages.PointRuleChangedMQMsg; -import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg; -import com.epmet.commons.rocketmq.messages.StaffPatrolMQMsg; +import com.epmet.commons.rocketmq.messages.*; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.SystemMessageType; @@ -158,4 +155,31 @@ public class SendMqMsgUtil { } + /** + * @Description 组织、网格、人员中间库信息同步Mq + * @author sun + */ + public boolean sendOrgStaffMqMsg(OrgOrStaffMQMsg msg) { + try { + SystemMsgFormDTO msgForm = new SystemMsgFormDTO(); + msgForm.setMessageType(msg.getType()); + msgForm.setContent(msg); + Result sendMsgResult; + log.info("sendOrgStaffMqMsg param:{}",msgForm); + int retryTime = 0; + do { + sendMsgResult = epmetMessageOpenFeignClient.sendSystemMsgByMQ(msgForm); + } while ((sendMsgResult == null || !sendMsgResult.success()) && retryTime++ < NumConstant.TWO); + + if (sendMsgResult != null && sendMsgResult.success()) { + return true; + } + log.error("发送(组织、网格、人员同步中间库)系统消息到message服务失败:{},msg:{}", JSON.toJSONString(sendMsgResult), JSON.toJSONString(msgForm)); + } catch (Exception e) { + log.error("sendOrgStaffMqMsg exception", e); + } + return false; + + } + } From 5e9a88d9f624e5136879c4983f074cf5457ceee5 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 15 Oct 2021 18:35:07 +0800 Subject: [PATCH 033/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/dto/form/PageFormDTO.java | 5 ++++ .../main/resources/mapper/user/UserDao.xml | 24 ++++++++++++------- .../impl/UserPatrolRecordServiceImpl.java | 2 ++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java index 4820f4d50b..c699557bac 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java @@ -30,6 +30,11 @@ public class PageFormDTO { */ private Integer offset; + /** + * 是否分页 默认分页 + */ + private boolean isPage = true; + public Integer getOffset() { return (pageNo-1)*pageSize; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index 6778c0305c..30abc86c9c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -1011,12 +1011,15 @@ FROM staff_patrol_record WHERE 1=1 - - AND ID = #{patrolId} - + + AND ID = #{patrolId} + and CUSTOMER_ID = #{customerId} AND DEL_FLAG = '0' - LIMIT #{offset},#{pageSize} + + LIMIT #{offset},#{pageSize} + + order by created_time diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index fdf0c2bc18..3eaf06633c 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -118,6 +118,8 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); if (detailResult == null || !detailResult.success()) { log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); From d3f10217feaacc26d2b410e60ddff0f1d833dd6a Mon Sep 17 00:00:00 2001 From: wxz Date: Sat, 16 Oct 2021 22:24:04 +0800 Subject: [PATCH 034/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=201.epmet-m?= =?UTF-8?q?essage=E4=B8=AD=EF=BC=8C=E6=89=AB=E6=8F=8F"=E6=9C=AA=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=8F=91=E9=80=81=E5=88=B0mq=E7=9A=84=E6=BB=9E?= =?UTF-8?q?=E7=95=99=E6=B6=88=E6=81=AF"=E7=9A=84=E6=8E=A5=E5=8F=A3=202.?= =?UTF-8?q?=E8=B0=83=E6=95=B4mq=E9=98=BB=E5=A1=9E=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=9A=84key=203.=E5=85=B6=E4=BB=96=E9=80=BB=E8=BE=91=E5=BE=AE?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/AuthOperationLogListener.java | 8 +- .../listener/PointOperationLogListener.java | 8 +- .../listener/ProjectOperationLogListener.java | 8 +- .../rocketmq/constants/MQUserPropertys.java | 4 +- .../epmet/commons/tools/redis/RedisKeys.java | 8 +- .../mq/ProjectChangedCustomListener.java | 6 +- .../controller/SystemMessageController.java | 24 ++++- .../epmet/dao/SystemMessagePenddingDao.java | 35 +++++++ .../entity/SystemMessagePenddingEntity.java | 61 ++++++++++++ .../epmet/service/SystemMessageService.java | 16 ++- .../impl/SystemMessageServiceImpl.java | 97 +++++++++++++++---- .../mapper/SystemMessagePenddingDao.xml | 26 +++++ .../IssueProjectCategoryTagInitListener.java | 8 +- .../InitCustomerOrgRolesListener.java | 8 +- .../OpenDataOrgChangeEventListener.java | 8 +- .../OpenDataPatrolChangeEventListener.java | 7 +- .../OpenDataStaffChangeEventListener.java | 8 +- .../InitCustomerComponentsListener.java | 8 +- 18 files changed, 282 insertions(+), 66 deletions(-) create mode 100644 epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/SystemMessagePenddingDao.java create mode 100644 epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/entity/SystemMessagePenddingEntity.java create mode 100644 epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/SystemMessagePenddingDao.xml diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java index ee243d88dd..6f8afd1418 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java @@ -58,7 +58,7 @@ public class AuthOperationLogListener implements MessageListenerConcurrently { private void consumeMessage(MessageExt messageExt) { String tags = messageExt.getTags(); String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("认证操作日志监听器-收到消息内容:{}", msg); LoginMQMsg msgObj = JSON.parseObject(msg, LoginMQMsg.class); @@ -101,7 +101,7 @@ public class AuthOperationLogListener implements MessageListenerConcurrently { try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【登录操作事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【登录操作事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -115,8 +115,8 @@ public class AuthOperationLogListener implements MessageListenerConcurrently { * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【登录操作事件监听器】删除pendingMsgLabel成功:{}", pendingMsgLabel); + //logger.info("【登录操作事件监听器】删除pendingMsgLabel成功:{}", pendingMsgLabel); } } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java index d883b7b1f6..aa4f50a768 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java @@ -58,7 +58,7 @@ public class PointOperationLogListener implements MessageListenerConcurrently { private void consumeMessage(MessageExt messageExt) { String opeType = messageExt.getTags(); String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("积分操作日志监听器-收到消息内容:{}", msg); PointRuleChangedMQMsg msgObj = JSON.parseObject(msg, PointRuleChangedMQMsg.class); @@ -103,7 +103,7 @@ public class PointOperationLogListener implements MessageListenerConcurrently { try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【积分操作事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【积分操作事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -117,8 +117,8 @@ public class PointOperationLogListener implements MessageListenerConcurrently { * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【积分操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel); + //logger.info("【积分操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel); } } diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java index d968d95448..a47d55c2de 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java @@ -58,7 +58,7 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently private void consumeMessage(MessageExt messageExt) { //String tags = messageExt.getTags(); String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("项目变动操作日志监听器-收到消息内容:{}", msg); ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class); @@ -103,7 +103,7 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【项目操作事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【项目操作事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -136,8 +136,8 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【项目操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel); + //logger.info("【项目操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel); } } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java index a69de64cca..c1a53a29ba 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java @@ -7,7 +7,7 @@ package com.epmet.commons.rocketmq.constants; */ public interface MQUserPropertys { - //堆积消息label - String PENDING_MSG_LABEL = "pendingMsgLabel"; + //阻塞消息label + String BLOCKED_MSG_LABEL = "blockedMsgLabel"; } 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 ad66110c51..388927ce5a 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 @@ -549,14 +549,14 @@ public class RedisKeys { } /** - * @description 检查message MQ滞留消息 + * @description 检查message MQ阻塞消息 * - * @param pendingMsgLabel 滞留消息的label + * @param blockedMsgLabel 滞留消息的label * @return * @author wxz * @date 2021.10.14 14:33:53 */ - public static String pendingMqMsgKey(String pendingMsgLabel) { - return rootPrefix.concat("message:mq:pending:").concat(pendingMsgLabel); + public static String blockedMqMsgKey(String blockedMsgLabel) { + return rootPrefix.concat("message:mq:blocked:").concat(blockedMsgLabel); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java index dd23989ca7..1792654765 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java @@ -70,7 +70,7 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently private void consumeMessage(MessageExt msgExt) { String msg = new String(msgExt.getBody()); - String pendingMsgLabel = msgExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = msgExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("receive customerId:{}", JSON.toJSONString(msg)); ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class); @@ -179,9 +179,9 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【项目变动事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); + //logger.info("【项目变动事件监听器】删除mq阻塞消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } /*@Override diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java index cc353dd449..8c1ea726cd 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java @@ -28,10 +28,32 @@ public class SystemMessageController { @PostMapping("send-by-mq") public Result sendSystemMsgByMQ(@RequestBody SystemMsgFormDTO form) { ValidatorUtils.validateEntity(form, SystemMsgFormDTO.SendMsgByMQ.class); - systemMessageService.sendMQMessage(form.getMessageType(), form.getContent()); + systemMessageService.persistAndSendMQMessage(form.getMessageType(), form.getContent()); return new Result(); } + /** + * @description 检查MQ阻塞消息(MQ收到消息,但是往监听者发送消息或者监听者处理逻辑问题导致无法消费消息) + * + * @param + * @return + * @author wxz + * @date 2021.10.16 22:07:38 + */ + @PostMapping("blocked-mq-msg-scan") + public Result blockedMqMsgScan() { + systemMessageService.blockedMqMsgScan(); + return new Result(); + } + + /** + * @description 检查MQ滞留消息(往MQ发送消息失败,MQ未收到消息) + * + * @param + * @return + * @author wxz + * @date 2021.10.16 22:08:32 + */ @PostMapping("pendding-mq-msg-scan") public Result penddingMqMsgScan() { systemMessageService.penddingMqMsgScan(); diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/SystemMessagePenddingDao.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/SystemMessagePenddingDao.java new file mode 100644 index 0000000000..57ba0d3afb --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/SystemMessagePenddingDao.java @@ -0,0 +1,35 @@ +/** + * 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.SystemMessagePenddingEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 系统消息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-16 + */ +@Mapper +public interface SystemMessagePenddingDao extends BaseDao { + + void physicalDeleteById(@Param("penddingId") String penddingId); +} \ No newline at end of file diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/entity/SystemMessagePenddingEntity.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/entity/SystemMessagePenddingEntity.java new file mode 100644 index 0000000000..87a7956504 --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/entity/SystemMessagePenddingEntity.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-16 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("system_message_pendding") +public class SystemMessagePenddingEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 消息类型。init_customer:客户初始化,login登录,logout退出 + */ + private String msgType; + + /** + * 消息主表id + */ + private String msgId; + + /** + * 消息发送途径 + */ + private String sendApproach; + + /** + * 消息内容 + */ + private String content; + +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java index f48e56cf9f..64e34527d1 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java @@ -3,7 +3,7 @@ package com.epmet.service; public interface SystemMessageService { /** - * @description 发送mq消息 + * @description 持久化和发送mq消息 * * @param messageType * @param content @@ -11,15 +11,25 @@ public interface SystemMessageService { * @author wxz * @date 2021.10.14 15:07:02 */ - void sendMQMessage(String messageType, Object content); + void persistAndSendMQMessage(String messageType, Object content); /** - * @description 扫描滞留消息 + * @description 扫描阻塞的消息 * * @param * @return * @author wxz * @date 2021.10.15 10:13:37 */ + void blockedMqMsgScan(); + + /** + * @description 扫描待办的消息(因为发送到MQ失败而堆积) + * + * @param + * @return + * @author wxz + * @date 2021.10.16 12:11:39 + */ void penddingMqMsgScan(); } 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 7bbc426d9e..dfd6737b57 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 @@ -12,7 +12,9 @@ import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.constant.SystemMessageSendApproach; import com.epmet.constant.SystemMessageType; import com.epmet.dao.SystemMessageDao; +import com.epmet.dao.SystemMessagePenddingDao; import com.epmet.entity.SystemMessageEntity; +import com.epmet.entity.SystemMessagePenddingEntity; import com.epmet.service.SystemMessageService; import lombok.AllArgsConstructor; import lombok.Data; @@ -27,6 +29,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -53,51 +56,90 @@ public class SystemMessageServiceImpl implements SystemMessageService { @Autowired private SystemMessageDao systemMessageDao; + @Autowired + private SystemMessagePenddingDao systemMessagePenddingDao; + @Autowired private RocketMQTemplate rocketMQTemplate; @Autowired private RedisUtils redisUtils; - @Transactional(rollbackFor = Exception.class) @Override - public void sendMQMessage(String messageType, Object content) { + public void persistAndSendMQMessage(String messageType, Object content) { String contentStr = JSON.toJSONString(content); - // 1.存储消息到表 - SystemMessageEntity systemMessageEntity = new SystemMessageEntity(); - systemMessageEntity.setMsgType(messageType); - systemMessageEntity.setSendApproach(SystemMessageSendApproach.MQ); - systemMessageEntity.setContent(contentStr); - systemMessageDao.insert(systemMessageEntity); + logger.info("【发送MQ系统消息】-落盘并发送-messageType:{}, contentStr:{}", messageType, contentStr); + // 1.消息落盘 + String penddingMsgId = persistMessage(messageType, contentStr); + + // 2.发送消息 + sendMQMessage(messageType, contentStr, penddingMsgId); + } + + /** + * @description 消息落盘,有事务 + * + * @param messageType + * @param contentStr + * @return + * @author wxz + * @date 2021.10.16 11:04:53 + */ + @Transactional(rollbackFor = Exception.class) + public String persistMessage(String messageType, String contentStr) { + + SystemMessageEntity message = new SystemMessageEntity(); + message.setMsgType(messageType); + message.setSendApproach(SystemMessageSendApproach.MQ); + message.setContent(contentStr); + systemMessageDao.insert(message); + + SystemMessagePenddingEntity pendding = new SystemMessagePenddingEntity(); + pendding.setMsgType(messageType); + pendding.setSendApproach(SystemMessageSendApproach.MQ); + pendding.setContent(contentStr); + pendding.setMsgId(message.getId()); + systemMessagePenddingDao.insert(pendding); + + logger.info("【发送MQ系统消息】-落盘完成"); + return pendding.getId(); + } + + private void sendMQMessage(String messageType, String contentStr, String penddingId) { String topic = getTopicByMsgType(messageType); - // 2.缓存下来,供滞留消息扫描。TTL -1,永不过期 + // 缓存下来,供滞留消息扫描。TTL -1,永不过期 String pendingMsgLabel = null; String pendingMsgKey = null; try { MessageCacheBean mcb = new MessageCacheBean(LocalDateTime.now(), messageType, topic, contentStr); pendingMsgLabel = UUID.randomUUID().toString().replace("-", ""); - pendingMsgKey = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + pendingMsgKey = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.set(pendingMsgKey, mcb, -1); + //logger.info("【发送MQ系统消息】-存入redis堆积列表成功-{}-{}-{}", topic, messageType, pendingMsgLabel); } catch (Exception e) { - logger.error("将系统MQ消息存储到Redis滞留列表失败,业务继续执行,{}", ExceptionUtils.getThrowableErrorStackTrace(e)); + logger.error("【发送MQ系统消息】将系统MQ消息存储到Redis堆积列表失败,业务继续执行,{}", ExceptionUtils.getThrowableErrorStackTrace(e)); } // 3.发送mq消息 try { Message meMessage = new Message(topic, messageType, contentStr.getBytes(RemotingHelper.DEFAULT_CHARSET)); - meMessage.putUserProperty(MQUserPropertys.PENDING_MSG_LABEL, pendingMsgLabel); + meMessage.putUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL, pendingMsgLabel); rocketMQTemplate.getProducer().send(meMessage); + logger.info("【发送MQ系统消息】-发送到MQ成功"); } catch (Exception e) { String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); - logger.error("发送系统MQ消息失败,堆栈信息:{}", errorStackTrace); + logger.error("【发送MQ系统消息】发送系统MQ消息失败,堆栈信息:{}", errorStackTrace); - // 清理消息缓存 + // 清理阻塞中的消息缓存 redisUtils.delete(pendingMsgKey); throw new RenException(EpmetErrorCode.SYSTEM_MQ_MSG_SEND_FAIL.getCode()); } + + // 删除消息堆积 + systemMessagePenddingDao.physicalDeleteById(penddingId); } /** @@ -146,8 +188,8 @@ public class SystemMessageServiceImpl implements SystemMessageService { } @Override - public void penddingMqMsgScan() { - String scanKey = RedisKeys.pendingMqMsgKey("*"); + public void blockedMqMsgScan() { + String scanKey = RedisKeys.blockedMqMsgKey("*"); Set keys = redisUtils.keys(scanKey); //System.out.println(keys); for (String key : keys) { @@ -173,7 +215,7 @@ public class SystemMessageServiceImpl implements SystemMessageService { && l1LastAlertTime.plusSeconds(PENDDING_MQ_MSG_ALERT_SECONDS_DELTA).isBefore(now)) ) { - logger.error("【MQ堆积消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生堆积", mcb.topic, mcb.messageType, key, keys.size()); + logger.error("【MQ阻塞消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生阻塞", mcb.topic, mcb.messageType, key, keys.size()); l1LastAlertTime = now; } @@ -185,7 +227,7 @@ public class SystemMessageServiceImpl implements SystemMessageService { createTime.plusSeconds(PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L6).isBefore(now) && l6LastAlertTime.plusSeconds(PENDDING_MQ_MSG_ALERT_SECONDS_DELTA).isBefore(now)) ) { - logger.error("【MQ堆积消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生堆积", mcb.topic, mcb.messageType, key, keys.size()); + logger.error("【MQ阻塞消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生阻塞", mcb.topic, mcb.messageType, key, keys.size()); l1LastAlertTime = now; } break; @@ -193,6 +235,25 @@ public class SystemMessageServiceImpl implements SystemMessageService { } } + @Override + public void penddingMqMsgScan() { + Integer count = systemMessagePenddingDao.selectCount(null); + if (count == 0) { + return; + } + + // 扫描并且重新投递 + List penddingMsgs = systemMessagePenddingDao.selectList(null); + for (SystemMessagePenddingEntity penddingMsg : penddingMsgs) { + try { + sendMQMessage(penddingMsg.getMsgType(), penddingMsg.getContent(), penddingMsg.getId()); + } catch (Exception e) { + // 投递失败不应影响后续消息的投递 + logger.error("【重新投递MQ消息】失败, msgType:{}, penddingMsgId:{}, 错误:{}", penddingMsg.getMsgType(), penddingMsg.getId() , ExceptionUtils.getErrorStackTrace(e)); + } + } + } + @Data @NoArgsConstructor @AllArgsConstructor diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/SystemMessagePenddingDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/SystemMessagePenddingDao.xml new file mode 100644 index 0000000000..4a5ab00608 --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/SystemMessagePenddingDao.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + delete from system_message_pendding where ID = #{penddingId} + + + + \ No newline at end of file diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java index cb7af65139..a9eb9c436f 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java @@ -57,7 +57,7 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu public void consumeMessage(MessageExt messageExt) { String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("初始化客户-初始化议题、项目的分类、标签数据-收到消息内容:{}", msg); InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); @@ -84,7 +84,7 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【议题/项目分类标签初始化事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【议题/项目分类标签初始化事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -98,8 +98,8 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【议题/项目分类标签初始化事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); + //logger.info("【议题/项目分类标签初始化事件监听器】删除mq阻塞消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java index 31346a2e8b..11bcc80e38 100644 --- a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java @@ -56,7 +56,7 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently private void consumeMessage(MessageExt messageExt) { String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("初始化客户-初始化组织信息-收到消息内容:{}", msg); InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); @@ -82,7 +82,7 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【客户初始化事件监听器】-orgRole-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【客户初始化事件监听器】-orgRole-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -129,9 +129,9 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【客户初始化事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); + //logger.info("【客户初始化事件监听器】删除mq阻塞消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } /* @Override diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index 5a13adb637..df6278488e 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -55,7 +55,7 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent String msg = new String(messageExt.getBody()); String topic = messageExt.getTopic(); String tags = messageExt.getTags(); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("【开放数据事件监听器】-组织信息变更-收到消息内容:{},操作:{}", msg, tags); GridBaseInfoFormDTO obj = JSON.parseObject(msg, GridBaseInfoFormDTO.class); @@ -87,7 +87,7 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【开放数据事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【开放数据事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -101,8 +101,8 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【开放数据事件监听器】删除mq滞留消息缓存成功,pendingMsgLabel:{}", pendingMsgLabel); + //logger.info("【开放数据事件监听器】删除mq阻塞消息缓存成功,blockedMsgLabel:{}", pendingMsgLabel); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java index a9797b34d8..4e40f0974f 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataPatrolChangeEventListener.java @@ -58,7 +58,7 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr String msg = new String(messageExt.getBody()); String topic = messageExt.getTopic(); String tags = messageExt.getTags(); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("【开放数据事件监听器】-巡查记录信息变更-收到消息内容:{}, 操作:{}", msg, tags); StaffPatrolMQMsg msgObj = JSON.parseObject(msg, StaffPatrolMQMsg.class); @@ -93,7 +93,7 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【开放数据事件监听器】-巡查-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【开放数据事件监听器】-巡查-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -107,7 +107,8 @@ public class OpenDataPatrolChangeEventListener implements MessageListenerConcurr * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); + //logger.info("【开放数据事件监听器】删除mq阻塞消息缓存成功,blockedMsgLabel:{}", pendingMsgLabel); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java index 270c7ff3e3..313c036cb8 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java @@ -58,11 +58,11 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre String msg = new String(messageExt.getBody()); String topic = messageExt.getTopic(); String tags = messageExt.getTags(); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); //messageExt.propert - logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}, pendingMsgLabel:{}", msg, tags, pendingMsgLabel); + logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}, blockedMsgLabel:{}", msg, tags, pendingMsgLabel); StaffBaseInfoFormDTO obj = JSON.parseObject(msg, StaffBaseInfoFormDTO.class); DistributedLock distributedLock = null; @@ -87,7 +87,7 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【开放数据事件监听器】-staff-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【开放数据事件监听器】-staff-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -102,7 +102,7 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java index d560979694..5980ad0a2a 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/mq/listener/InitCustomerComponentsListener.java @@ -51,7 +51,7 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent private void consumeMessage(MessageExt messageExt) { String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("初始化客户-初始化客户自定义信息-收到消息内容:{}", msg); InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class); @@ -82,7 +82,7 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent try { removePendingMqMsgCache(pendingMsgLabel); } catch (Exception e) { - logger.error("【开放数据事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); + logger.error("【开放数据事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e)); } } } @@ -96,9 +96,9 @@ public class InitCustomerComponentsListener implements MessageListenerConcurrent * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); - logger.info("【开放数据事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); + //logger.info("【开放数据事件监听器】删除mq滞留消息缓存成功,blockedMsgLabel:{}", pendingMsgLabel); } /* @Override From 4b66a433d7db84e559452e7e368e5f0e39784db1 Mon Sep 17 00:00:00 2001 From: wxz Date: Sat, 16 Oct 2021 22:28:59 +0800 Subject: [PATCH 035/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=20system=5F?= =?UTF-8?q?message=5Fpendding=E7=9A=84sql=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migration/V0.3.18__create_sys_msg_pendding.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 epmet-module/epmet-message/epmet-message-server/src/main/resources/db/migration/V0.3.18__create_sys_msg_pendding.sql diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/db/migration/V0.3.18__create_sys_msg_pendding.sql b/epmet-module/epmet-message/epmet-message-server/src/main/resources/db/migration/V0.3.18__create_sys_msg_pendding.sql new file mode 100644 index 0000000000..78a45a9865 --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/db/migration/V0.3.18__create_sys_msg_pendding.sql @@ -0,0 +1,14 @@ +CREATE TABLE `system_message_pendding` ( + `ID` varchar(64) NOT NULL COMMENT '主键', + `MSG_ID` varchar(64) NOT NULL COMMENT '消息主表id', + `MSG_TYPE` varchar(32) NOT NULL COMMENT '消息类型。init_customer:客户初始化,login登录,logout退出', + `SEND_APPROACH` varchar(32) NOT NULL COMMENT '消息发送途径', + `CONTENT` varchar(1024) NOT NULL COMMENT '消息内容', + `REVISION` int(11) DEFAULT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人(发布消息的人)', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + `DEL_FLAG` varchar(1) NOT NULL COMMENT '删除标记 0:未删除,1:已删除', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='系统消息滞留表' \ No newline at end of file From a3e1d3d287bff4e8ec3d5ef7425bb8ed7ae2d351 Mon Sep 17 00:00:00 2001 From: wxz Date: Sat, 16 Oct 2021 22:38:31 +0800 Subject: [PATCH 036/177] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=BC=96=E8=AF=91=E7=9A=84=E4=BB=A3=E7=A0=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mq/listener/OpenDataProjectChangeEventListener.java | 4 ++-- .../java/com/epmet/mq/GroupAchievementCustomListener.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java index 819c1975ce..e82e2cd8c9 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java @@ -58,7 +58,7 @@ public class OpenDataProjectChangeEventListener implements MessageListenerConcur String msg = new String(messageExt.getBody()); String topic = messageExt.getTopic(); String tags = messageExt.getTags(); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); //messageExt.propert @@ -102,7 +102,7 @@ public class OpenDataProjectChangeEventListener implements MessageListenerConcur * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); } } diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java index 0462c3fe60..6644a29dc3 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/GroupAchievementCustomListener.java @@ -59,7 +59,7 @@ public class GroupAchievementCustomListener implements MessageListenerConcurren private void consumeMessage(MessageExt messageExt) { logger.info("receive msg:{}", JSON.toJSONString(messageExt)); String msg = new String(messageExt.getBody()); - String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.PENDING_MSG_LABEL); + String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); GroupAchievementMQMsg msgObj = JSON.parseObject(msg, GroupAchievementMQMsg.class); if (msgObj == null){ @@ -118,7 +118,7 @@ public class GroupAchievementCustomListener implements MessageListenerConcurren * @date 2021.10.14 16:32:32 */ private void removePendingMqMsgCache(String pendingMsgLabel) { - String key = RedisKeys.pendingMqMsgKey(pendingMsgLabel); + String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel); redisUtils.delete(key); logger.info("【小组成就事件监听器】删除mq滞留消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel); } From 92472ed994d7e8bd53457cb6b7f19cf450f50edc Mon Sep 17 00:00:00 2001 From: wxz Date: Sat, 16 Oct 2021 23:17:16 +0800 Subject: [PATCH 037/177] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=BC=96=E8=AF=91=E7=9A=84=E4=BB=A3=E7=A0=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evaluationindex/screen/ScreenCustomerAgencyEntity.java | 1 - .../entity/evaluationindex/screen/ScreenCustomerGridEntity.java | 1 - 2 files changed, 2 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java index 4fc6f6bee8..475e9907bd 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java @@ -94,7 +94,6 @@ public class ScreenCustomerAgencyEntity extends BaseEpmetEntity { * 行政地区编码 */ private String areaCode; - private String code; private String sourceType; /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java index 5a2b97896a..cbe1c62956 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java @@ -39,7 +39,6 @@ public class ScreenCustomerGridEntity extends BaseEpmetEntity { * 客户id */ private String customerId; - private String code; /** * 网格id From 19f0ad54bf71cf8ec8b26140b54db606d1c90eec Mon Sep 17 00:00:00 2001 From: wxz Date: Sat, 16 Oct 2021 23:33:05 +0800 Subject: [PATCH 038/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=20job?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E6=BB=9E=E7=95=99/=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet-job/epmet-job-server/pom.xml | 5 ++++ .../service/SystemMessageScannerService.java | 23 +++++++++++++++++ .../SystemMessageScannerServiceImpl.java | 22 ++++++++++++++++ .../task/BlockedMQSystemMessageScanner.java | 25 +++++++++++++++++++ .../task/PenddingMQSystemMessageScanner.java | 25 +++++++++++++++++++ .../feign/EpmetMessageOpenFeignClient.java | 21 ++++++++++++---- 6 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerService.java create mode 100644 epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerServiceImpl.java create mode 100644 epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/BlockedMQSystemMessageScanner.java create mode 100644 epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/PenddingMQSystemMessageScanner.java diff --git a/epmet-module/epmet-job/epmet-job-server/pom.xml b/epmet-module/epmet-job/epmet-job-server/pom.xml index e29f5759e5..769cfab32a 100644 --- a/epmet-module/epmet-job/epmet-job-server/pom.xml +++ b/epmet-module/epmet-job/epmet-job-server/pom.xml @@ -38,6 +38,11 @@ epmet-third-client 2.0.0 + + com.epmet + epmet-message-client + 2.0.0 + org.springframework.boot spring-boot-starter-web diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerService.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerService.java new file mode 100644 index 0000000000..3316aef52a --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerService.java @@ -0,0 +1,23 @@ +package com.epmet.service; + +public interface SystemMessageScannerService { + /** + * @description 扫描未成功发送到MQ的消息 + * + * @param + * @return + * @author wxz + * @date 2021.10.16 23:24:05 + */ + void scanPenddingSystemMQMessage(); + + /** + * @description 扫描发送成功但是未正常处理的MQ的消息 + * + * @param + * @return + * @author wxz + * @date 2021.10.16 23:24:27 + */ + void scanBlockedSystemMQMessage(); +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerServiceImpl.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerServiceImpl.java new file mode 100644 index 0000000000..f47ba3ec39 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerServiceImpl.java @@ -0,0 +1,22 @@ +package com.epmet.service; + +import com.epmet.feign.EpmetMessageOpenFeignClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SystemMessageScannerServiceImpl implements SystemMessageScannerService { + + @Autowired + private EpmetMessageOpenFeignClient messageOpenFeignClient; + + @Override + public void scanPenddingSystemMQMessage() { + messageOpenFeignClient.penddingMqMsgScan(); + } + + @Override + public void scanBlockedSystemMQMessage() { + messageOpenFeignClient.blockedMqMsgScan(); + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/BlockedMQSystemMessageScanner.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/BlockedMQSystemMessageScanner.java new file mode 100644 index 0000000000..6840b15eaa --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/BlockedMQSystemMessageScanner.java @@ -0,0 +1,25 @@ +package com.epmet.task; + +import com.epmet.service.SystemMessageScannerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("blockedMQSystemMessageScanner") +@Slf4j +public class BlockedMQSystemMessageScanner implements ITask { + + @Autowired + private SystemMessageScannerService systemMessageScannerService; + + @Override + public void run(String params) { + try { + //log.info("【blockedMQSystemMessageScanner】开始执行scanBlockedSystemMQMessage任务"); + systemMessageScannerService.scanBlockedSystemMQMessage(); + log.info("【blockedMQSystemMessageScanner】执行scanBlockedSystemMQMessage任务完成"); + } catch (Exception e) { + log.error("【blockedMQSystemMessageScanner】执行scanBlockedSystemMQMessage任务失败"); + } + } +} diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/PenddingMQSystemMessageScanner.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/PenddingMQSystemMessageScanner.java new file mode 100644 index 0000000000..f4b24f2cb6 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/PenddingMQSystemMessageScanner.java @@ -0,0 +1,25 @@ +package com.epmet.task; + +import com.epmet.service.SystemMessageScannerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("penddingMQSystemMessageScanner") +@Slf4j +public class PenddingMQSystemMessageScanner implements ITask { + + @Autowired + private SystemMessageScannerService systemMessageScannerService; + + @Override + public void run(String params) { + try { + //log.info("【blockedMQSystemMessageScanner】开始执行scanBlockedSystemMQMessage任务"); + systemMessageScannerService.scanPenddingSystemMQMessage(); + log.info("【blockedMQSystemMessageScanner】执行scanPenddingSystemMQMessage任务完成"); + } catch (Exception e) { + log.error("【blockedMQSystemMessageScanner】执行scanPenddingSystemMQMessage任务失败"); + } + } +} diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java index 454fd5fd5d..b3681a0b33 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java @@ -109,13 +109,24 @@ public interface EpmetMessageOpenFeignClient { Result sendSystemMsgByMQ(@RequestBody SystemMsgFormDTO form); /** - * @description 应答mq消息 + * @description 检查MQ阻塞消息(MQ收到消息,但是往监听者发送消息或者监听者处理逻辑问题导致无法消费消息) * - * @param form + * @param + * @return + * @author wxz + * @date 2021.10.16 22:07:38 + */ + @PostMapping("/message/system/blocked-mq-msg-scan") + Result blockedMqMsgScan(); + + /** + * @description 检查MQ滞留消息(往MQ发送消息失败,MQ未收到消息) + * + * @param * @return * @author wxz - * @date 2021.10.14 16:07:17 + * @date 2021.10.16 22:08:32 */ - @PostMapping("/message/system/ack-mq-msg") - Result ackSystemMsgByMQ(@RequestBody SystemMsgFormDTO form); + @PostMapping("/message/system/pendding-mq-msg-scan") + Result penddingMqMsgScan(); } From d874a4626dc659b66314d6c459602da4464894ef Mon Sep 17 00:00:00 2001 From: wxz Date: Sat, 16 Oct 2021 23:39:09 +0800 Subject: [PATCH 039/177] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=20job?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E6=BB=9E=E7=95=99/=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fallback/EpmetMessageOpenFeignClientFallback.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java index 998b890814..d9a044d73d 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java @@ -71,7 +71,12 @@ public class EpmetMessageOpenFeignClientFallback implements EpmetMessageOpenFeig } @Override - public Result ackSystemMsgByMQ(SystemMsgFormDTO form) { - return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "ackSystemMsgByMQ", form); + public Result blockedMqMsgScan() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "blockedMqMsgScan"); + } + + @Override + public Result penddingMqMsgScan() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "penddingMqMsgScan"); } } From e964b04213058321a3d8d6f57b6c3bec6229b036 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 18 Oct 2021 09:39:56 +0800 Subject: [PATCH 040/177] =?UTF-8?q?=E5=B7=A1=E6=9F=A5=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/form/UpsertPatrolRecordForm.java | 2 +- .../controller/InitDataController.java | 50 ++++++++++++++++ .../impl/UserPatrolRecordServiceImpl.java | 57 ++++++++++--------- 3 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java index 23d412318b..3fd1db81ac 100644 --- a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java @@ -19,7 +19,7 @@ public class UpsertPatrolRecordForm { /** * 巡查记录id */ - @NotEmpty(message = "customerId不能为空") + @NotEmpty(message = "patrolId不能为空") private String patrolId; /** diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java new file mode 100644 index 0000000000..e8da4e413e --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java @@ -0,0 +1,50 @@ +/** + * 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.opendata.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; +import com.epmet.opendata.service.UserPatrolRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +/** + * 中间库数据初始化controller + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-14 + */ +@RestController +@RequestMapping("init") +public class InitDataController { + + @Autowired + private UserPatrolRecordService userPatrolRecordService; + + /** + * @Author sun + * @Description 网格员信息中间库同步 + **/ + @PostMapping("patrol/{customerId}") + public Result getStaffBaseInfo(@PathVariable String customerId) { + UpsertPatrolRecordForm formDTO = new UpsertPatrolRecordForm(); + formDTO.setCustomerId(customerId); + return new Result().ok(userPatrolRecordService.insertPatrolRecord(formDTO)); + } +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index 3eaf06633c..105b170038 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -40,6 +40,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; @@ -79,13 +80,14 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl insertList = new ArrayList<>(); + data.forEach(o-> insertList.add(buildEntity(o))); //insert - baseDao.insert(recordEntity); - - + if (CollectionUtils.isEmpty(insertList)){ + log.error("构建要插入的数据为空,param:{}", JSON.toJSONString(midPatrolFormDTO)); + return false; + } + this.insertBatch(insertList, NumConstant.ONE_HUNDRED); return true; } @@ -93,7 +95,6 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl> record = dataStatisticalOpenFeignClient.getPatrolRecordList(midPatrolFormDTO); if (record == null || !record.success()) { @@ -103,34 +104,34 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl data = record.getData(); if (CollectionUtils.isEmpty(data)) { //数据已被删除了 - delFlag = true; //暂时设置error 用于排错 log.error("获取巡查记录返回为空,param:{}", JSON.toJSONString(midPatrolFormDTO)); int effectRow = baseDao.deleteById(patrolRecordForm.getPatrolId()); log.warn("del effectRow:{}", effectRow); return true; } - MidPatrolRecordResult recordResult = data.get(NumConstant.ZERO); - UserPatrolRecordEntity recordEntity = buildEntity(recordResult); + data.forEach(o->{ + UserPatrolRecordEntity recordEntity = buildEntity(o); + //update + int effectRow = baseDao.updateById(recordEntity); + if (effectRow == NumConstant.ZERO) { + baseDao.insert(recordEntity); + } + midPatrolFormDTO.setPage(false); + //todo 过滤掉巡查结束时间之后的轨迹 + Result> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); + if (detailResult == null || !detailResult.success()) { + log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); + return; + } + UserPatrolDetailEntity detailEntity = buildDetailEntity(o, detailResult); + //先删除再新增 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserPatrolDetailEntity::getStaffPatrolRecId, recordEntity.getId()); + userPatrolDetailDao.delete(wrapper); + int insert = userPatrolDetailDao.insert(detailEntity); + }); - //update - int effectRow = baseDao.updateById(recordEntity); - if (effectRow == 0) { - baseDao.insert(recordEntity); - } - midPatrolFormDTO.setPage(false); - //todo 过滤掉巡查结束时间之后的轨迹 - Result> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); - if (detailResult == null || !detailResult.success()) { - log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); - return false; - } - UserPatrolDetailEntity detailEntity = buildDetailEntity(recordResult, detailResult); - //先删除再新增 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(UserPatrolDetailEntity::getStaffPatrolRecId, recordEntity.getId()); - userPatrolDetailDao.delete(wrapper); - int insert = userPatrolDetailDao.insert(detailEntity); return true; } From a16da262e50c0c303a4d86e2af64586b424cbd54 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 18 Oct 2021 10:11:04 +0800 Subject: [PATCH 041/177] =?UTF-8?q?sql=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/user/UserDao.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index 30abc86c9c..78e124791c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -1016,10 +1016,10 @@ and CUSTOMER_ID = #{customerId} AND DEL_FLAG = '0' + order by created_time LIMIT #{offset},#{pageSize} - order by created_time From d8a75638d74ea116e8d80409efab5fa6e0def630 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Mon, 18 Oct 2021 11:11:36 +0800 Subject: [PATCH 042/177] =?UTF-8?q?=E7=BB=84=E7=BB=87=E3=80=81=E7=BD=91?= =?UTF-8?q?=E6=A0=BC=E3=80=81=E4=BA=BA=E5=91=98=E6=96=B0=E5=A2=9E=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=87=BA=E5=8F=91=E7=82=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8E=A8=E9=80=81MQ=E4=BA=8B=E4=BB=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rocketmq/messages/OrgOrStaffMQMsg.java | 3 +- epmet-gateway/pom.xml | 11 ++++ .../src/main/resources/bootstrap.yml | 10 ++++ .../dto/user/result/GridUserInfoDTO.java | 30 +++++++++++ .../impl/DataReportingServiceImpl.java | 5 ++ .../com/epmet/dto/form/DeleteGridFormDTO.java | 5 ++ .../com/epmet/dto/form/EditGridFormDTO.java | 3 ++ .../epmet/dto/form/RemoveAgencyFormDTO.java | 4 ++ epmet-module/gov-org/gov-org-server/pom.xml | 6 +++ .../epmet/controller/AgencyController.java | 1 + .../com/epmet/controller/GridController.java | 2 + .../epmet/service/impl/AgencyServiceImpl.java | 53 +++++++++++++++++++ .../service/impl/CustomerGridServiceImpl.java | 34 +++++++++++- .../dto/form/GridBaseInfoFormDTO.java | 4 -- .../OpenDataOrgChangeEventListener.java | 15 ++++-- .../OpenDataStaffChangeEventListener.java | 14 +++-- .../service/impl/BaseGridInfoServiceImpl.java | 3 ++ .../impl/CustomerStaffServiceImpl.java | 25 +++++++++ 18 files changed, 214 insertions(+), 14 deletions(-) diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java index bbe4f551db..650b9e9f90 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java @@ -12,7 +12,6 @@ import java.util.List; * @author sun */ @Data -@AllArgsConstructor public class OrgOrStaffMQMsg implements Serializable { //客户Id @@ -21,7 +20,7 @@ public class OrgOrStaffMQMsg implements Serializable { private String orgId; //数据类型【组织:agency 网格:grid 人员:staff】 private String orgType; - //操作类型【新增:add 修改删除:edit】 + //操作类型【组织新增:agency_create 组织变更:agency_change 网格新增:grid_create 网格变更:grid_change 人员新增:staff_create 人员变更:staff_change】 private String type; diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml index e09410668d..3d668a8b6f 100644 --- a/epmet-gateway/pom.xml +++ b/epmet-gateway/pom.xml @@ -223,6 +223,9 @@ lb://data-aggregator-server + + lb://open-data-worker-server + lb://epmet-openapi-adv-server @@ -361,6 +364,10 @@ lb://data-aggregator-server + + + http://127.0.0.1:8117 + lb://epmet-openapi-adv-server @@ -469,6 +476,8 @@ lb://data-aggregator-server lb://tduck-api + + lb://open-data-worker-server lb://epmet-openapi-adv-server @@ -570,6 +579,8 @@ lb://epmet-ext-server lb://data-aggregator-server + + lb://open-data-worker-server lb://epmet-openapi-adv-server diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index c0308758b9..69423d078f 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -350,6 +350,16 @@ spring: filters: - StripPrefix=1 - CpAuth=true + #政府工作端议题管理 + - id: open-data-worker-server + uri: @gateway.routes.gov-issue-server.uri@ + order: 38 + predicates: + - Path=${server.servlet.context-path}/opendata/** + filters: + - StripPrefix=1 + - CpAuth=true + nacos: discovery: server-addr: @nacos.server-addr@ diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java index 6978b50bf9..2fde3c3566 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java @@ -149,4 +149,34 @@ public class GridUserInfoDTO implements Serializable { */ private String isMediator; + /** + * 删除标识 0.未删除 1.已删除 + */ + private Integer delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 249eb11c81..26b125af39 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -124,6 +124,11 @@ public class DataReportingServiceImpl implements DataReportingService { st.setIsVillageLeader("Y"); st.setIsPoliceAssistant("N"); st.setIsMediator("Y"); + st.setDelFlag(dto.getDelFlag()); + st.setCreatedBy(dto.getCreatedBy()); + st.setCreatedTime(dto.getCreatedTime()); + st.setUpdatedBy(dto.getUpdatedBy()); + st.setUpdatedTime(dto.getUpdatedTime()); } }); diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/DeleteGridFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/DeleteGridFormDTO.java index ed266210ba..5bd8641413 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/DeleteGridFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/DeleteGridFormDTO.java @@ -27,4 +27,9 @@ public class DeleteGridFormDTO implements Serializable { * userId */ private String userId; + + /** + * 客户Id + */ + private String customerId; } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/EditGridFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/EditGridFormDTO.java index 0ad04c404d..ff48cd1972 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/EditGridFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/EditGridFormDTO.java @@ -40,4 +40,7 @@ public class EditGridFormDTO implements Serializable { */ private String manageDistrict; + //客户Id + private String customerId; + } diff --git a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RemoveAgencyFormDTO.java b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RemoveAgencyFormDTO.java index 5caaec7ea5..27bee4e64d 100644 --- a/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RemoveAgencyFormDTO.java +++ b/epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RemoveAgencyFormDTO.java @@ -38,5 +38,9 @@ public class RemoveAgencyFormDTO implements Serializable { */ @NotBlank(message = "机关组织ID不能为空") private String agencyId; + /** + * 客户Id + */ + private String customerId; } \ No newline at end of file diff --git a/epmet-module/gov-org/gov-org-server/pom.xml b/epmet-module/gov-org/gov-org-server/pom.xml index 2bc10abf21..13561a58a3 100644 --- a/epmet-module/gov-org/gov-org-server/pom.xml +++ b/epmet-module/gov-org/gov-org-server/pom.xml @@ -107,6 +107,12 @@ 2.0.0 compile + + com.epmet + epmet-message-client + 2.0.0 + compile + 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 a3695f6362..112d6b8e35 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 @@ -141,6 +141,7 @@ public class AgencyController { @RequirePermission(requirePermission = RequirePermissionEnum.ORG_SUBAGENCY_DELETE) public Result removeAgency(@LoginUser TokenDto tokenDTO, @RequestBody RemoveAgencyFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO); + formDTO.setCustomerId(tokenDTO.getCustomerId()); return agencyService.removeAgency(formDTO); } 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 ce24000220..f9cc5c1b54 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 @@ -58,6 +58,7 @@ public class GridController { @RequirePermission(requirePermission = RequirePermissionEnum.ORG_GRID_UPDATE) public Result editGrid(@LoginUser TokenDto tokenDto, @RequestBody EditGridFormDTO editGridFormDTO){ ValidatorUtils.validateEntity(editGridFormDTO, EditGridFormDTO.EditGrid.class); + editGridFormDTO.setCustomerId(tokenDto.getCustomerId()); return customerGridService.editGrid(tokenDto,editGridFormDTO); } @@ -68,6 +69,7 @@ public class GridController { @PostMapping("deletegrid") @RequirePermission(requirePermission = RequirePermissionEnum.ORG_GRID_DELETE) public Result deleteGrid(@LoginUser TokenDto tokenDto, @RequestBody DeleteGridFormDTO deleteGridFormDTO){ + deleteGridFormDTO.setCustomerId(tokenDto.getCustomerId()); return customerGridService.deleteGrid(tokenDto,deleteGridFormDTO); } 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 b60e0ff31c..aa070f2d90 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.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; @@ -35,8 +36,10 @@ import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.feign.EpmetCommonServiceOpenFeignClient; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.redis.CustomerAgencyRedis; +import com.epmet.send.SendMqMsgUtil; import com.epmet.service.AgencyService; import com.epmet.service.CustomerAgencyService; import com.epmet.service.CustomerOrgParameterService; @@ -80,6 +83,8 @@ public class AgencyServiceImpl implements AgencyService { private CustomerOrgParameterService customerOrgParameterService; @Autowired private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient; + @Autowired + private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; /** @@ -176,6 +181,16 @@ public class AgencyServiceImpl implements AgencyService { //5.redis缓存 customerAgencyRedis.delete(formDTO.getAgencyId()); + + //2021-10-18 推送mq,数据同步到中介库 start【中介库只放了组织的名称、级别,所以涉及批量修改pname的操作不涉及同步中间库】 + OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg(); + mq.setCustomerId(originalEntity.getCustomerId()); + mq.setOrgId(formDTO.getAgencyId()); + mq.setOrgType("agency"); + mq.setType("agency_change"); + SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq); + //2021-10-18 end + return result; } @@ -215,6 +230,16 @@ public class AgencyServiceImpl implements AgencyService { log.error(CustomerAgencyConstant.DEL_EXCEPTION); throw new RenException(CustomerAgencyConstant.DEL_EXCEPTION); } + + //2021-10-18 推送mq,数据同步到中介库 start + OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg(); + mq.setCustomerId(formDTO.getCustomerId()); + mq.setOrgId(formDTO.getAgencyId()); + mq.setOrgType("agency"); + mq.setType("agency_change"); + SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq); + //2021-10-18 end + return result; } @@ -370,6 +395,16 @@ public class AgencyServiceImpl implements AgencyService { entity.setTotalUser(0); entity.setCustomerId(form.getCustomerId()); customerAgencyDao.insert(entity); + + //2021-10-18 推送mq,数据同步到中介库 start + OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg(); + mq.setCustomerId(form.getCustomerId()); + mq.setOrgId(entity.getId()); + mq.setOrgType("agency"); + mq.setType("agency_create"); + SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq); + //2021-10-18 end + return entity.getId(); } @@ -430,6 +465,15 @@ public class AgencyServiceImpl implements AgencyService { throw new RenException(EpmetErrorCode.OPER_ADD_CUSTOMER_MANAGER_ERROR.getCode(), staffResult.getMsg()); } + //2021-10-18 推送mq,数据同步到中介库 start + OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg(); + mq.setCustomerId(agencyDTO.getCustomerId()); + mq.setOrgId(entity.getId()); + mq.setOrgType("agency"); + mq.setType("agency_create"); + SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq); + //2021-10-18 end + } /** @@ -474,6 +518,15 @@ public class AgencyServiceImpl implements AgencyService { //3:返回新组织Id resultDTO.setAgencyId(insertEntity.getId()); resultDTO.setAreaCode(insertEntity.getAreaCode()); + + //2021-10-18 推送mq,数据同步到中介库 start + OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg(); + mq.setCustomerId(parent.getCustomerId()); + mq.setOrgId(insertEntity.getId()); + mq.setOrgType("agency"); + mq.setType("agency_create"); + SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq); + //2021-10-18 end return resultDTO; } 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 58faa734ac..d5497b8a08 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 @@ -21,6 +21,7 @@ import cn.hutool.core.bean.BeanUtil; 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.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; @@ -41,8 +42,10 @@ import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.entity.CustomerAgencyEntity; import com.epmet.entity.CustomerGridEntity; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetUserFeignClient; import com.epmet.feign.OperCrmOpenFeignClient; +import com.epmet.send.SendMqMsgUtil; import com.epmet.service.CustomerAgencyService; import com.epmet.service.CustomerGridService; import com.epmet.util.ModuleConstant; @@ -79,9 +82,10 @@ public class CustomerGridServiceImpl extends BaseServiceImpl page(Map params) { @@ -270,6 +274,16 @@ public class CustomerGridServiceImpl extends BaseServiceImpl().ok(resultDTO); } @@ -291,6 +305,16 @@ public class CustomerGridServiceImpl extends BaseServiceImpl orgIdList; - /** - * 数据类型【组织:agency 网格:grid】 - */ - private String orgType; /** * 操作类型【新增:add 修改删除:edit】 */ diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java index df6278488e..04e95a893b 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataOrgChangeEventListener.java @@ -2,6 +2,7 @@ package com.epmet.opendata.mq.listener; import com.alibaba.fastjson.JSON; import com.epmet.commons.rocketmq.constants.MQUserPropertys; +import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -19,6 +20,7 @@ import org.redisson.api.RLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -58,19 +60,24 @@ public class OpenDataOrgChangeEventListener implements MessageListenerConcurrent String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL); logger.info("【开放数据事件监听器】-组织信息变更-收到消息内容:{},操作:{}", msg, tags); - GridBaseInfoFormDTO obj = JSON.parseObject(msg, GridBaseInfoFormDTO.class); + OrgOrStaffMQMsg obj = JSON.parseObject(msg, OrgOrStaffMQMsg.class); DistributedLock distributedLock = null; RLock lock = null; try { distributedLock = SpringContextUtils.getBean(DistributedLock.class); - lock = distributedLock.getLock(String.format("lock:open_data_org:%s", obj.getOrgIdList()), + lock = distributedLock.getLock(String.format("lock:open_data_org:%s", obj.getOrgId()), 30L, 30L, TimeUnit.SECONDS); + GridBaseInfoFormDTO dto = new GridBaseInfoFormDTO(); + dto.setCustomerId(obj.getCustomerId()); + dto.setType(obj.getType()); + List orgIdList = new ArrayList<>(); + orgIdList.add(obj.getOrgId()); if ("agency".equals(obj.getOrgType())) { - SpringContextUtils.getBean(BaseGridInfoService.class).getAgencyBaseInfo(obj); + SpringContextUtils.getBean(BaseGridInfoService.class).getAgencyBaseInfo(dto); } else { - SpringContextUtils.getBean(BaseGridInfoService.class).getGridBaseInfo(obj); + SpringContextUtils.getBean(BaseGridInfoService.class).getGridBaseInfo(dto); } } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java index 313c036cb8..48d0ece671 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataStaffChangeEventListener.java @@ -2,6 +2,7 @@ package com.epmet.opendata.mq.listener; import com.epmet.commons.rocketmq.constants.MQUserPropertys; import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg; import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; @@ -20,6 +21,7 @@ import org.redisson.api.RLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -63,15 +65,21 @@ public class OpenDataStaffChangeEventListener implements MessageListenerConcurre //messageExt.propert logger.info("【开放数据事件监听器】-工作人员信息变更-收到消息内容:{}, 操作:{}, blockedMsgLabel:{}", msg, tags, pendingMsgLabel); - StaffBaseInfoFormDTO obj = JSON.parseObject(msg, StaffBaseInfoFormDTO.class); + OrgOrStaffMQMsg obj = JSON.parseObject(msg, OrgOrStaffMQMsg.class); DistributedLock distributedLock = null; RLock lock = null; try { distributedLock = SpringContextUtils.getBean(DistributedLock.class); - lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", obj.getStaffIdList()), + lock = distributedLock.getLock(String.format("lock:open_data_staff:%s", obj.getOrgId()), 30L, 30L, TimeUnit.SECONDS); - SpringContextUtils.getBean(BaseGridUserService.class).getStaffBaseInfo(obj); + + StaffBaseInfoFormDTO dto = new StaffBaseInfoFormDTO(); + dto.setCustomerId(obj.getCustomerId()); + dto.setType(obj.getType()); + List staffIdList = new ArrayList<>(); + staffIdList.add(obj.getOrgId()); + SpringContextUtils.getBean(BaseGridUserService.class).getStaffBaseInfo(dto); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-工作人员信息变更-初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java index a1b93cf4ed..1d4f4a1e17 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java @@ -72,6 +72,9 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl page(Map params) { @@ -342,6 +347,16 @@ public class CustomerStaffServiceImpl extends BaseServiceImpl().ok(ConvertUtils.sourceToTarget(staffEntity, CustomerStaffDTO.class)); } @@ -415,6 +430,16 @@ public class CustomerStaffServiceImpl extends BaseServiceImpl Date: Mon, 18 Oct 2021 13:41:18 +0800 Subject: [PATCH 043/177] =?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/dto/form/PageFormDTO.java | 5 -- .../user/result/MidPatrolRecordResult.java | 5 ++ .../main/resources/mapper/user/UserDao.xml | 42 ++++++--- .../dto/form/UpsertPatrolRecordForm.java | 4 +- .../controller/InitDataController.java | 12 +-- .../service/UserPatrolDetailService.java | 3 + .../service/UserPatrolRecordService.java | 8 ++ .../impl/UserPatrolDetailServiceImpl.java | 13 +++ .../impl/UserPatrolRecordServiceImpl.java | 87 ++++++++++++++----- 9 files changed, 131 insertions(+), 48 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java index c699557bac..4820f4d50b 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java @@ -30,11 +30,6 @@ public class PageFormDTO { */ private Integer offset; - /** - * 是否分页 默认分页 - */ - private boolean isPage = true; - public Integer getOffset() { return (pageNo-1)*pageSize; } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java index a08d7cba17..12c18962d1 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java @@ -129,4 +129,9 @@ public class MidPatrolRecordResult implements Serializable { */ private String longitude; + /** + * 经纬度组合成的路线 经度,维度; + */ + private String route; + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index 78e124791c..bc20519148 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -1006,20 +1006,38 @@ diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java index 3fd1db81ac..d80157031e 100644 --- a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java @@ -1,5 +1,6 @@ package com.epmet.opendata.dto.form; +import com.epmet.commons.tools.dto.form.PageFormDTO; import lombok.Data; import javax.validation.constraints.NotEmpty; @@ -9,7 +10,7 @@ import javax.validation.constraints.NotEmpty; * @author liujianjun */ @Data -public class UpsertPatrolRecordForm { +public class UpsertPatrolRecordForm extends PageFormDTO { /** * 客户Id */ @@ -19,7 +20,6 @@ public class UpsertPatrolRecordForm { /** * 巡查记录id */ - @NotEmpty(message = "patrolId不能为空") private String patrolId; /** diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java index e8da4e413e..38fe35fd15 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/controller/InitDataController.java @@ -18,10 +18,14 @@ package com.epmet.opendata.controller; import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.SystemMessageType; import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; import com.epmet.opendata.service.UserPatrolRecordService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** @@ -42,9 +46,7 @@ public class InitDataController { * @Description 网格员信息中间库同步 **/ @PostMapping("patrol/{customerId}") - public Result getStaffBaseInfo(@PathVariable String customerId) { - UpsertPatrolRecordForm formDTO = new UpsertPatrolRecordForm(); - formDTO.setCustomerId(customerId); - return new Result().ok(userPatrolRecordService.insertPatrolRecord(formDTO)); + public Result reloadPatrolData(@PathVariable String customerId) { + return new Result().ok(userPatrolRecordService.reloadPatrolData(customerId)); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java index b6ca5b2c47..13cde46235 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolDetailService.java @@ -29,4 +29,7 @@ import com.epmet.opendata.entity.UserPatrolDetailEntity; public interface UserPatrolDetailService extends BaseService { + int deleteByPatrolId(String patrolId); + + int deleteByCustomerId(String customerId); } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java index 45d894e531..e6896f32b8 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/UserPatrolRecordService.java @@ -42,4 +42,12 @@ public interface UserPatrolRecordService extends BaseService implements UserPatrolDetailService { + @Override + public int deleteByPatrolId(String patrolId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserPatrolDetailEntity::getStaffPatrolRecId, patrolId); + return baseDao.delete(wrapper); + } + @Override + public int deleteByCustomerId(String customerId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserPatrolDetailEntity::getCustomerId, customerId); + return baseDao.delete(wrapper); + } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index 105b170038..cfa413dbe2 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -18,21 +18,19 @@ package com.epmet.opendata.service.impl; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; -import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.DataStatisticalOpenFeignClient; -import com.epmet.opendata.dao.UserPatrolDetailDao; import com.epmet.opendata.dao.UserPatrolRecordDao; import com.epmet.opendata.dto.form.UpsertPatrolRecordForm; import com.epmet.opendata.entity.UserPatrolDetailEntity; import com.epmet.opendata.entity.UserPatrolRecordEntity; +import com.epmet.opendata.service.UserPatrolDetailService; import com.epmet.opendata.service.UserPatrolRecordService; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -57,13 +55,12 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl> record = dataStatisticalOpenFeignClient.getPatrolRecordList(midPatrolFormDTO); if (record == null || !record.success()) { @@ -73,7 +70,6 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl data = record.getData(); if (CollectionUtils.isEmpty(data)) { //数据已被删除了 - delFlag = true; //暂时设置error 用于排错 log.error("获取巡查记录返回为空,param:{}", JSON.toJSONString(midPatrolFormDTO)); int effectRow = baseDao.deleteById(patrolRecordForm.getPatrolId()); @@ -117,37 +113,82 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); if (detailResult == null || !detailResult.success()) { log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); return; } - UserPatrolDetailEntity detailEntity = buildDetailEntity(o, detailResult); + UserPatrolDetailEntity detailEntity = buildDetailEntity(o); //先删除再新增 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(UserPatrolDetailEntity::getStaffPatrolRecId, recordEntity.getId()); - userPatrolDetailDao.delete(wrapper); - int insert = userPatrolDetailDao.insert(detailEntity); + userPatrolDetailService.deleteByPatrolId(recordEntity.getId()); + boolean insert = userPatrolDetailService.insert(detailEntity); }); return true; } + @Override + public Boolean reloadPatrolData(String customerId) { + int pageNo = 1; + int pageSize = 1000; + List resultList = null; + do { + MidPatrolFormDTO param = new MidPatrolFormDTO(); + param.setCustomerId(customerId); + param.setPageNo(pageNo++); + param.setPageSize(pageSize); + Result> record = dataStatisticalOpenFeignClient.getPatrolRecordList(param); + if (record == null || !record.success()) { + log.error("获取巡查记录失败,param:{}", JSON.toJSONString(param)); + return false; + } + resultList = record.getData(); + if (CollectionUtils.isEmpty(resultList)){ + log.warn("不存在巡查记录,param:{}", JSON.toJSONString(param)); + return false; + } + insertRecordBatch(resultList,true); + + + + }while (!CollectionUtils.isEmpty(resultList) && resultList.size()> pageSize ); + + return null; + } + private Boolean insertRecordBatch(List list,boolean isReload){ + List insertList = new ArrayList<>(); + list.forEach(o-> insertList.add(buildEntity(o))); + //insert + if (CollectionUtils.isEmpty(insertList)){ + log.error("构建要插入的数据为空,param:{}", JSON.toJSONString(list)); + return false; + } + if (isReload){ + userPatrolDetailService.deleteByCustomerId(list.get(0).getCustomerId()); + } + this.insertBatch(insertList, NumConstant.ONE_HUNDRED); + List insertDetailList = new ArrayList<>(); + list.forEach(o-> { + insertDetailList.add(buildDetailEntity(o)); + if (!isReload){ + //先删除再新增 + userPatrolDetailService.deleteByPatrolId(o.getId()); + } + }); + if (CollectionUtils.isEmpty(insertList)){ + log.warn("构建要插入的数据为空,param:{}", JSON.toJSONString(list)); + } + userPatrolDetailService.insertBatch(insertDetailList, NumConstant.ONE_HUNDRED); + return true; + } + @NotNull - private UserPatrolDetailEntity buildDetailEntity(MidPatrolRecordResult recordResult, Result> detailResult) { + private UserPatrolDetailEntity buildDetailEntity(MidPatrolRecordResult recordResult) { UserPatrolDetailEntity detailEntity = new UserPatrolDetailEntity(); detailEntity.setCustomerId(recordResult.getCustomerId()); detailEntity.setStaffPatrolRecId(recordResult.getId()); - StringBuilder sb = new StringBuilder(); - detailResult.getData().forEach(o -> { - sb.append(o.getLongitude()) - .append(StrConstant.COMMA) - .append(o.getLatitude()) - .append(StrConstant.SEMICOLON); - }); - detailEntity.setRoute(sb.toString()); + detailEntity.setRoute(recordResult.getRoute()); detailEntity.setId(recordResult.getId()); detailEntity.setRevision(recordResult.getRevision()); detailEntity.setCreatedBy(recordResult.getCreatedBy()); @@ -188,8 +229,8 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl Date: Mon, 18 Oct 2021 15:51:23 +0800 Subject: [PATCH 044/177] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E9=80=BB=E8=BE=91?= =?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/opendata/entity/UserPatrolDetailEntity.java | 8 ++++++++ .../epmet/opendata/entity/UserPatrolRecordEntity.java | 9 ++++++++- .../service/impl/UserPatrolRecordServiceImpl.java | 8 +++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java index bfea8b7749..470c316e53 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolDetailEntity.java @@ -17,6 +17,8 @@ package com.epmet.opendata.entity; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.epmet.commons.mybatis.entity.BaseEpmetEntity; import lombok.Data; @@ -50,4 +52,10 @@ public class UserPatrolDetailEntity extends BaseEpmetEntity { */ private String route; + /** + * 是否已删除(0-未删除,1-已删除) + */ + @TableField(fill = FieldFill.INSERT) + private String delFlag; + } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java index 21b02c6c98..e068a9d80a 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/UserPatrolRecordEntity.java @@ -17,8 +17,9 @@ package com.epmet.opendata.entity; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; - import com.epmet.commons.mybatis.entity.BaseEpmetEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -103,4 +104,10 @@ public class UserPatrolRecordEntity extends BaseEpmetEntity { */ private String status; + /** + * 是否已删除(0-未删除,1-已删除) + */ + @TableField(fill = FieldFill.INSERT) + private String delFlag; + } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index cfa413dbe2..446f1f89ca 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -18,6 +18,7 @@ package com.epmet.opendata.service.impl; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.Result; @@ -165,8 +166,13 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserPatrolRecordEntity::getCustomerId, list.get(0).getCustomerId()); + int delete = baseDao.delete(wrapper); + log.info("insertRecordBatch del patrol effectRow:{}",delete); this.insertBatch(insertList, NumConstant.ONE_HUNDRED); List insertDetailList = new ArrayList<>(); list.forEach(o-> { From 5112c82c8b4581dad45bcc7c98396224bd497abc Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 18 Oct 2021 15:57:14 +0800 Subject: [PATCH 045/177] =?UTF-8?q?sql=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/user/UserDao.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml index bc20519148..4715f23c2a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml @@ -1029,9 +1029,8 @@ LEFT JOIN staff_patrol_detail d ON m.ID = d.STAFF_PATROL_REC_ID WHERE 1 =1 - - AND ID = #{patrolId} + AND m.ID = #{patrolId} and m.CUSTOMER_ID = #{customerId} AND m.DEL_FLAG = '0' From 7ef6da082bc7f70ab5d68dc8c2e67584b6ffc740 Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 18 Oct 2021 15:58:31 +0800 Subject: [PATCH 046/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendata/service/impl/UserPatrolRecordServiceImpl.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java index 446f1f89ca..0a5312e602 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/UserPatrolRecordServiceImpl.java @@ -24,7 +24,6 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.user.param.MidPatrolFormDTO; -import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.DataStatisticalOpenFeignClient; import com.epmet.opendata.dao.UserPatrolRecordDao; @@ -114,12 +113,6 @@ public class UserPatrolRecordServiceImpl extends BaseServiceImpl> detailResult = dataStatisticalOpenFeignClient.getPatrolDetailList(midPatrolFormDTO); - if (detailResult == null || !detailResult.success()) { - log.error("获取巡查记录明细失败,param:{}", JSON.toJSONString(midPatrolFormDTO)); - return; - } UserPatrolDetailEntity detailEntity = buildDetailEntity(o); //先删除再新增 userPatrolDetailService.deleteByPatrolId(recordEntity.getId()); From eb0a132da279bb882b4fedd2d2ffb902f877d154 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 18 Oct 2021 16:54:19 +0800 Subject: [PATCH 047/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E5=8F=91=E9=80=81MQ=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/ConsomerGroupConstants.java | 5 +++ .../rocketmq/constants/TopicConstants.java | 5 +++ .../messages/DisputeProcessMQMsg.java | 22 +++++++++++++ .../dto/basereport/form/EventInfoFormDTO.java | 5 ++- .../dto/screen/ScreenProjectDataDTO.java | 4 +++ .../data-statistical-server/pom.xml | 6 ++++ .../mq/ProjectChangedCustomListener.java | 15 ++++++++- .../screen/ScreenProjectDataService.java | 12 ++++++- .../impl/ScreenProjectDataServiceImpl.java | 21 ++++++++++++- .../impl/DataReportingServiceImpl.java | 3 +- .../com/epmet/constant/SystemMessageType.java | 10 ++++++ .../java/com/epmet/send/SendMqMsgUtil.java | 31 +++++++++++++++++++ .../impl/SystemMessageServiceImpl.java | 4 +++ .../opendata/mq/RocketMQConsumerRegister.java | 4 +-- .../OpenDataProjectChangeEventListener.java | 7 +++-- .../impl/BaseDisputeProcessServiceImpl.java | 19 +++++++++++- 16 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/DisputeProcessMQMsg.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 a1c61abf6b..fb5ae07412 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 @@ -60,4 +60,9 @@ public interface ConsomerGroupConstants { */ String OPEN_DATA_PATROL_CHANGE_EVENT_LISTENER_GROUP = "open_data_patrol_change_event_listener_group"; + /** + * 开放的对接数据(中间库) 项目变更事件监听器分组 + */ + String OPEN_DATA_PROJECT_CHANGE_EVENT_LISTENER_GROUP = "open_data_project_change_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 4dfeaa3500..3f0c3066ec 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 @@ -43,4 +43,9 @@ public interface TopicConstants { * 巡查记录 */ String PATROL = "patrol"; + + /** + * 项目 + */ + String PROJECT = "project"; } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/DisputeProcessMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/DisputeProcessMQMsg.java new file mode 100644 index 0000000000..30a1700054 --- /dev/null +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/DisputeProcessMQMsg.java @@ -0,0 +1,22 @@ +package com.epmet.commons.rocketmq.messages; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description + * @Author zhaoqifeng + * @Date 2021/10/18 16:24 + */ +@Data +@AllArgsConstructor +public class DisputeProcessMQMsg implements Serializable { + private String customerId; + private String projectId; + /** + * 操作类型【新增:add 修改删除:edit】 + */ + private String type; +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java index dbbbe4bbf0..c8f9c78e71 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java @@ -1,5 +1,7 @@ package com.epmet.dto.basereport.form; +import com.epmet.commons.tools.dto.form.PageFormDTO; +import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; @@ -10,7 +12,8 @@ import java.io.Serializable; * @Date 2021/10/15 10:55 */ @Data -public class EventInfoFormDTO implements Serializable { +@AllArgsConstructor +public class EventInfoFormDTO extends PageFormDTO implements Serializable { private static final long serialVersionUID = 8479649048108914555L; private String customerId; private String projectId; diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java index 180ac24fe5..d94c781d71 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java @@ -197,4 +197,8 @@ public class ScreenProjectDataDTO implements Serializable { */ private String tempGridName; + private String finishOrg; + + private String finishOrgLevel; + } diff --git a/epmet-module/data-statistical/data-statistical-server/pom.xml b/epmet-module/data-statistical/data-statistical-server/pom.xml index 4e19d8988d..cf2f0f200b 100644 --- a/epmet-module/data-statistical/data-statistical-server/pom.xml +++ b/epmet-module/data-statistical/data-statistical-server/pom.xml @@ -122,6 +122,12 @@ 2.0.0 compile + + com.epmet + epmet-message-client + 2.0.0 + compile + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java index 1792654765..72e12ff5dc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java @@ -2,6 +2,7 @@ package com.epmet.mq; import com.alibaba.fastjson.JSON; import com.epmet.commons.rocketmq.constants.MQUserPropertys; +import com.epmet.commons.rocketmq.messages.DisputeProcessMQMsg; import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg; import com.epmet.commons.tools.distributedlock.DistributedLock; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -9,9 +10,11 @@ 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.constant.SystemMessageType; import com.epmet.dto.extract.form.ExtractOriginFormDTO; import com.epmet.service.evaluationindex.extract.todata.FactOriginExtractService; import com.epmet.service.evaluationindex.extract.toscreen.ScreenExtractService; +import com.epmet.service.evaluationindex.screen.ScreenProjectDataService; import com.epmet.util.DimIdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -29,7 +32,6 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; /** * @Description 项目变动-监听器 @@ -45,6 +47,7 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently private RedisUtils redisUtils; + @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { @@ -149,6 +152,16 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently SpringContextUtils.getBean(ScreenExtractService.class).extractPartData(customerId,dateId); } logger.info("consumer projectChanged msg success,{}",aBoolean); + + //发送项目数据上报的mq消息 + String type; + if ("issue_shift_project".equals(msgObj.getOperation()) || "created".equals(msgObj.getOperation())) { + type = SystemMessageType.PROJECT_ADD; + } else { + type = SystemMessageType.PROJECT_EDIT; + } + DisputeProcessMQMsg msg = new DisputeProcessMQMsg(customerId, msgObj.getProjectId(), type); + SpringContextUtils.getBean(ScreenProjectDataService.class).sendProjectChangeMq(msg); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【RocketMQ】消费项目变动消息失败:",e); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java index 2cf68852db..a29640a75b 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java @@ -18,6 +18,7 @@ package com.epmet.service.evaluationindex.screen; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.rocketmq.messages.DisputeProcessMQMsg; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.screen.form.ScreenProjectDataInfoFormDTO; @@ -136,6 +137,15 @@ public interface ScreenProjectDataService extends BaseService getProjectList(String customerId, String projectId); + List getProjectList(String customerId, String projectId, Integer pageNo, Integer pageSize); + + /** + * 项目变更MQ + * @Param msg + * @Return + * @Author zhaoqifeng + * @Date 2021/10/18 15:55 + */ + void sendProjectChangeMq(DisputeProcessMQMsg msg); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java index 10678a2fbc..3d9d3db088 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.rocketmq.messages.DisputeProcessMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.page.PageData; @@ -34,7 +35,10 @@ import com.epmet.dto.screen.form.ScreenProjectDataInfoFormDTO; import com.epmet.dto.screencoll.ScreenCollFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenProjectDataEntity; import com.epmet.entity.evaluationindex.screen.ScreenProjectImgDataEntity; +import com.epmet.feign.EpmetMessageOpenFeignClient; +import com.epmet.send.SendMqMsgUtil; import com.epmet.service.evaluationindex.screen.ScreenProjectDataService; +import com.github.pagehelper.PageHelper; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -62,6 +66,8 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl page(Map params) { @@ -284,7 +290,8 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl getProjectList(String customerId, String projectId) { + public List getProjectList(String customerId, String projectId, Integer pageNo, Integer pageSize) { + PageHelper.startPage(pageNo, pageSize); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.isNotBlank(customerId), ScreenProjectDataEntity::getCustomerId, customerId); wrapper.eq(StringUtils.isNotBlank(projectId), ScreenProjectDataEntity::getProjectId, projectId); @@ -294,4 +301,16 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl getEventInfo(EventInfoFormDTO formDTO) { List list; //根据入参,获取项目 - List projectList = screenProjectDataService.getProjectList(formDTO.getCustomerId(), formDTO.getProjectId()); + List projectList = screenProjectDataService.getProjectList(formDTO.getCustomerId(), formDTO.getProjectId(), formDTO.getPageNo(), formDTO.getPageSize()); //项目列表为空,返回空数组 if(CollectionUtils.isEmpty(projectList)) { return Collections.emptyList(); @@ -206,6 +206,7 @@ public class DataReportingServiceImpl implements DataReportingService { categoryCode = null; } } + dto.setEventCategory(categoryCode); dto.setReportTime(project.getProjectCreateTime()); dto.setHappenDate(DateUtils.parseDate(DateUtils.format(project.getProjectCreateTime()), DateUtils.DATE_PATTERN)); dto.setEventDescription(project.getProjectContent()); 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 9e502bd6ca..84580a3b4a 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 @@ -75,4 +75,14 @@ public interface SystemMessageType { */ String USER_PATROL_STOP = "user_patrol_stop"; + /** + * 项目变动 + */ + String PROJECT_ADD = "project_add"; + + /** + * 项目变动 + */ + String PROJECT_EDIT = "project_edit"; + } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java index 551bb9d4ec..e232f5f635 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java @@ -182,4 +182,35 @@ public class SendMqMsgUtil { } + /** + * desc: 发送项目变动事件消息 + * + * @param msgContent + * @return boolean + * @author LiuJanJun + * @date 2021/4/23 3:01 下午 + * @remark 失败重试1次,调用端自行判断如果失败是否要继续执行 + */ + public boolean sendProjectMqMsg(DisputeProcessMQMsg msgContent) { + try { + SystemMsgFormDTO systemMsgFormDTO = new SystemMsgFormDTO(); + systemMsgFormDTO.setMessageType(msgContent.getType()); + systemMsgFormDTO.setContent(msgContent); + Result sendMsgResult; + log.info("sendProjectMqMsg param:{}",msgContent); + int retryTime = 0; + do { + sendMsgResult = epmetMessageOpenFeignClient.sendSystemMsgByMQ(systemMsgFormDTO); + } while ((sendMsgResult == null || !sendMsgResult.success()) && retryTime++ < NumConstant.TWO); + + if (sendMsgResult != null && sendMsgResult.success()) { + return true; + } + log.error("发送(项目变动)系统消息到message服务失败:{},msg:{}", JSON.toJSONString(sendMsgResult), JSON.toJSONString(systemMsgFormDTO)); + } catch (Exception e) { + log.error("sendMqMsg exception", e); + } + return false; + } + } 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 dfd6737b57..0196a0aea7 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 @@ -183,6 +183,10 @@ public class SystemMessageServiceImpl implements SystemMessageService { case SystemMessageType.USER_PATROL_STOP: topic = TopicConstants.PATROL; break; + case SystemMessageType.PROJECT_ADD: + case SystemMessageType.PROJECT_EDIT: + topic = TopicConstants.PROJECT; + break; } return topic; } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java index 2ffed8c3dd..3fa339bc0b 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/RocketMQConsumerRegister.java @@ -43,9 +43,9 @@ public class RocketMQConsumerRegister extends MQAbstractRegister { "*", new OpenDataPatrolChangeEventListener()); register(consumerProperties, - ConsomerGroupConstants.PROJECT_CHANGED_COMPONENTS_GROUP, + ConsomerGroupConstants.OPEN_DATA_PROJECT_CHANGE_EVENT_LISTENER_GROUP, MessageModel.CLUSTERING, - TopicConstants.PROJECT_CHANGED, + TopicConstants.PROJECT, "*", new OpenDataProjectChangeEventListener()); diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java index e82e2cd8c9..c2af1cffe7 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/mq/listener/OpenDataProjectChangeEventListener.java @@ -2,11 +2,13 @@ package com.epmet.opendata.mq.listener; import com.alibaba.fastjson.JSON; import com.epmet.commons.rocketmq.constants.MQUserPropertys; +import com.epmet.commons.rocketmq.messages.DisputeProcessMQMsg; 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.ConvertUtils; import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.feign.EpmetMessageOpenFeignClient; @@ -63,7 +65,8 @@ public class OpenDataProjectChangeEventListener implements MessageListenerConcur //messageExt.propert logger.info("【开放数据事件监听器】-项目信息变更-收到消息内容:{}, 操作:{}, pendingMsgLabel:{}", msg, tags, pendingMsgLabel); - EventInfoFormDTO obj = JSON.parseObject(msg, EventInfoFormDTO.class); + DisputeProcessMQMsg obj = JSON.parseObject(msg, DisputeProcessMQMsg.class); + EventInfoFormDTO formDTO = ConvertUtils.sourceToTarget(obj, EventInfoFormDTO.class); DistributedLock distributedLock = null; RLock lock = null; @@ -71,7 +74,7 @@ public class OpenDataProjectChangeEventListener implements MessageListenerConcur distributedLock = SpringContextUtils.getBean(DistributedLock.class); lock = distributedLock.getLock(String.format("lock:open_data_project:%s", obj.getProjectId()), 30L, 30L, TimeUnit.SECONDS); - SpringContextUtils.getBean(BaseDisputeProcessService.class).getEventinfo(obj); + SpringContextUtils.getBean(BaseDisputeProcessService.class).getEventinfo(formDTO); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【开放数据事件监听器】-项目信息变更-上报项目信息失败:".concat(ExceptionUtils.getErrorStackTrace(e))); diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java index 0a0d18a9f0..d716762780 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java @@ -18,9 +18,11 @@ package com.epmet.opendata.service.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.SystemMessageType; import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.feign.DataStatisticalOpenFeignClient; import com.epmet.opendata.dao.BaseDisputeProcessDao; @@ -62,12 +64,27 @@ public class BaseDisputeProcessServiceImpl extends BaseServiceImpl list = result.getData(); if (CollectionUtils.isNotEmpty(list)) { List entityList = ConvertUtils.sourceToTarget(list, BaseDisputeProcessEntity.class); - if("add".equals(formDTO.getType())){ + if(SystemMessageType.PROJECT_ADD.equals(formDTO.getType())){ insertBatch(entityList); }else { updateBatchById(entityList); } } + //分批次循环 + while (CollectionUtils.isNotEmpty(list)) { + formDTO.setPageNo(formDTO.getPageNo() + NumConstant.ONE); + result = dataStatisticalOpenFeignClient.getEventInfo(formDTO); + list = result.getData(); + if (CollectionUtils.isNotEmpty(list)) { + List entityList = ConvertUtils.sourceToTarget(list, BaseDisputeProcessEntity.class); + if("add".equals(formDTO.getType())){ + insertBatch(entityList); + }else { + updateBatchById(entityList); + } + } + } + } From 21733738da679ca379a0c000138df62e0bb3d7f9 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Tue, 19 Oct 2021 10:50:50 +0800 Subject: [PATCH 048/177] =?UTF-8?q?=E5=8A=9E=E7=BB=93=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E5=92=8C=E5=8A=9E=E7=BB=93=E5=B1=82=E7=BA=A7=E8=AE=BE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/screen/ScreenProjectDataDTO.java | 3 + .../com/epmet/constant/OrgTypeConstant.java | 10 +++ .../com/epmet/constant/ProjectConstant.java | 8 ++ .../screen/ScreenProjectDataDao.java | 2 + .../impl/ScreenProjectDataServiceImpl.java | 9 +-- .../impl/DataReportingServiceImpl.java | 53 +++++++++++-- .../screen/ScreenProjectDataDao.xml | 78 +++++++++++++++++++ 7 files changed, 150 insertions(+), 13 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java index d94c781d71..be5355aebc 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java @@ -201,4 +201,7 @@ public class ScreenProjectDataDTO implements Serializable { private String finishOrgLevel; + private String orgIdPath; + + private String finishOrgType; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/OrgTypeConstant.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/OrgTypeConstant.java index 7c88be956c..3fa6ac0fdc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/OrgTypeConstant.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/OrgTypeConstant.java @@ -46,4 +46,14 @@ public interface OrgTypeConstant { */ String COMMUNITY = "community"; + /** + * 省级 + */ + String PROVINCE = "province"; + + /** + * 市级 + */ + String CITY = "city"; + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/ProjectConstant.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/ProjectConstant.java index e099b5f89d..6b9966b154 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/ProjectConstant.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/constant/ProjectConstant.java @@ -82,4 +82,12 @@ public interface ProjectConstant { */ String PROJECT_ORIGIN_AGENCY="agency"; String PROJECT_ORIGIN_EVENT="resi_event"; + /** + * 自办 + */ + String PROJECT_SELF_CLOSED="01"; + /** + * 上报 + */ + String PROJECT_REPORT="02"; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectDataDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectDataDao.java index 4083242997..97c85d1bc0 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectDataDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectDataDao.java @@ -66,4 +66,6 @@ public interface ScreenProjectDataDao extends BaseDao { void deleteByProjectIds(@Param("customerId") String customerId, @Param("list") List list); int updateProjectSatisfactionScore(@Param("projectId")String projectId, @Param("score")BigDecimal score); + + List selectProjectList(@Param("customerId") String customerId, @Param("projectId") String projectId); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java index 3d9d3db088..f04234049e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java @@ -17,7 +17,6 @@ package com.epmet.service.evaluationindex.screen.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.dynamic.datasource.annotation.DataSource; @@ -292,13 +291,7 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl getProjectList(String customerId, String projectId, Integer pageNo, Integer pageSize) { PageHelper.startPage(pageNo, pageSize); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StringUtils.isNotBlank(customerId), ScreenProjectDataEntity::getCustomerId, customerId); - wrapper.eq(StringUtils.isNotBlank(projectId), ScreenProjectDataEntity::getProjectId, projectId); - wrapper.ne(ScreenProjectDataEntity::getCategoryCode, null); - wrapper.ne(ScreenProjectDataEntity::getCategoryCode, ""); - List list = baseDao.selectList(wrapper); - return ConvertUtils.sourceToTarget(list, ScreenProjectDataDTO.class); + return baseDao.selectProjectList(customerId, projectId); } /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 39e3f698a3..721a827074 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -210,18 +210,61 @@ public class DataReportingServiceImpl implements DataReportingService { dto.setReportTime(project.getProjectCreateTime()); dto.setHappenDate(DateUtils.parseDate(DateUtils.format(project.getProjectCreateTime()), DateUtils.DATE_PATTERN)); dto.setEventDescription(project.getProjectContent()); - //TODO 办结方式 - dto.setWaysOfResolving("01"); dto.setSuccessfulOrNo(ProjectConstant.CLOSED_CASE.equals(project.getProjectStatusCode())?"Y":"N"); - //TODO 办结层级 - dto.setCompleteLevel("01"); + if (ProjectConstant.CLOSED_CASE.equals(project.getProjectStatusCode())) { + dto.setWaysOfResolving(project.getOrgId().equals(project.getFinishOrg())?ProjectConstant.PROJECT_SELF_CLOSED:ProjectConstant.PROJECT_REPORT); + //办结组织是机关时,办结层级为机关的层级 + if (OrgTypeConstant.AGENCY.equals(project.getFinishOrgType())) { + //如果是孔村的项目办结层级需要降一级 + if("2fe0065f70ca0e23ce4c26fca5f1d933".equals(project.getCustomerId())) { + switch (project.getFinishOrgLevel()) { + case OrgTypeConstant.DISTRICT: + dto.setCompleteLevel("04"); + break; + case OrgTypeConstant.STREET: + case OrgTypeConstant.COMMUNITY: + dto.setCompleteLevel("06"); + break; + default: + break; + } + } else { + dto.setCompleteLevel(getCompleteLevel(project.getFinishOrgLevel())); + } + } else if (OrgTypeConstant.DEPARTMENT.equals(project.getFinishOrgType())) { + //办结组织是部门时,办结层级为部门所在组织的曾经 + String[] orgIds = project.getOrgIdPath().split(StrConstant.COLON); + int size = orgIds.length; + ScreenCustomerAgencyEntity agency = screenCustomerAgencyService.getAgencyById(orgIds[size - 1]); + dto.setCompleteLevel(getCompleteLevel(agency.getLevel())); + } else { + //办结组织是网格时,办结层级为网格 + dto.setCompleteLevel("07"); + } + } + dto.setCompleteTime(project.getCloseCaseTime()); dto.setLat(project.getLatitude()); dto.setLng(project.getLongitude()); return dto; } - + private String getCompleteLevel(String level) { + switch (level) { + case OrgTypeConstant.PROVINCE: + return "01"; + case OrgTypeConstant.CITY: + return "02"; + case OrgTypeConstant.DISTRICT: + return "03"; + case OrgTypeConstant.STREET: + return "04"; + case OrgTypeConstant.COMMUNITY: + return "06"; + default: + return null; + } + } @Override public List getPatrolRecordList(MidPatrolFormDTO formDTO) { diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectDataDao.xml index db38763cb5..5930ae87c9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectDataDao.xml @@ -191,4 +191,82 @@ update screen_project_data set SATISFACTION_SCORE=#{score} where PROJECT_ID=#{projectId} + + + From 6a4f8f55292ec87f7891994041dd0511d457353a Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 19 Oct 2021 14:09:33 +0800 Subject: [PATCH 049/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=201.epmet-c?= =?UTF-8?q?ommon-tools=E6=A8=A1=E5=9D=97=E4=B8=AD=EF=BC=8C=E5=B0=86FeignCo?= =?UTF-8?q?nfig.java=E5=81=9A=E4=BA=86=E8=B0=83=E6=95=B4=EF=BC=8CRequestIn?= =?UTF-8?q?terceptor=E7=9A=84=E5=AE=9E=E4=BE=8B=E5=8C=96=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=81=9A=E4=BA=86=E8=B0=83=E6=95=B4=E3=80=82=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E4=BE=9D=E8=B5=96epmet-common-tools=E7=9A=84=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E8=87=AA=E5=AE=9A=E4=B9=89RequestInterceptor=202.job?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E7=9A=84RequestInterceptor=EF=BC=8C=E7=94=A8=E4=BA=8E=E7=94=9F?= =?UTF-8?q?=E6=88=90tran-serial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/EpmetBaseRequestInterceptor.java | 35 +++++++++++ .../commons/tools/feign/FeignConfig.java | 41 ++++--------- .../java/com/epmet/config/JobFeignConfig.java | 59 +++++++++++++++++++ 3 files changed, 106 insertions(+), 29 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java create mode 100644 epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/config/JobFeignConfig.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java new file mode 100644 index 0000000000..7fb9822290 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java @@ -0,0 +1,35 @@ +package com.epmet.commons.tools.feign; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Enumeration; + + +public class EpmetBaseRequestInterceptor implements RequestInterceptor { + + @Override + public void apply(RequestTemplate template) { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null) { + return; + } + + HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); + Enumeration headerNames = request.getHeaderNames(); + if (headerNames != null) { + while (headerNames.hasMoreElements()) { + String name = headerNames.nextElement(); + Enumeration values = request.getHeaders(name); + while (values.hasMoreElements()) { + String value = values.nextElement(); + template.header(name, value); + } + } + } + } +} \ No newline at end of file diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignConfig.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignConfig.java index c68dbc2913..ec7806a620 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignConfig.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignConfig.java @@ -1,8 +1,8 @@ /** * Copyright (c) 2018 人人开源 All rights reserved. - * + *

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

* 版权所有,侵权必究! */ @@ -10,49 +10,32 @@ package com.epmet.commons.tools.feign; import feign.Logger; import feign.RequestInterceptor; -import feign.RequestTemplate; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import java.util.Enumeration; /** * Feign调用,携带header + * 各服务可以自定义自己的RequestInterceptor,如果自定义了,此处不会再生效,会优先使用自定义的拦截器实例 * * @author Mark sunlightcs@gmail.com * @since 1.0.0 */ @Configuration -public class FeignConfig implements RequestInterceptor { - @Override - public void apply(RequestTemplate template) { - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - if (requestAttributes == null) { - return; - } - - HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); - Enumeration headerNames = request.getHeaderNames(); - if (headerNames != null) { - while (headerNames.hasMoreElements()) { - String name = headerNames.nextElement(); - Enumeration values = request.getHeaders(name); - while (values.hasMoreElements()) { - String value = values.nextElement(); - template.header(name, value); - } - } - } +public class FeignConfig { + @Bean + @ConditionalOnMissingBean + RequestInterceptor requestInterceptor() { + return new EpmetBaseRequestInterceptor(); } @Bean + @ConditionalOnMissingBean Logger.Level feignLoggerLevel() { return Logger.Level.BASIC;//控制台会输出debug日志 } + + } diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/config/JobFeignConfig.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/config/JobFeignConfig.java new file mode 100644 index 0000000000..d053f347cf --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/config/JobFeignConfig.java @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.epmet.config; + +import com.epmet.commons.tools.constant.AppClientConstant; +import com.epmet.commons.tools.feign.EpmetBaseRequestInterceptor; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Feign调用,携带header + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Configuration +public class JobFeignConfig { + + @Bean + RequestInterceptor requestInterceptor() { + return new JobRequestInterceptor(); + } + + class JobRequestInterceptor extends EpmetBaseRequestInterceptor { + @Override + public void apply(RequestTemplate template) { + super.apply(template); + + // job服务自己生成流水号 + template.header(AppClientConstant.TRANSACTION_SERIAL_KEY, generateTransactionSerial()); + } + + /** + * 获取事务流水号 + * + * @return + */ + public String generateTransactionSerial() { + String[] letterPool = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n" + , "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 2; i++) { + sb.append(letterPool[(int) (Math.random() * 25)]); + } + + sb.append(System.currentTimeMillis()); + return sb.toString(); + } + } +} \ No newline at end of file From 4766365f75f22bc24f6bdad85bb9545dcfd95ed8 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Tue, 19 Oct 2021 15:54:37 +0800 Subject: [PATCH 050/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/dto/basereport/form/EventInfoFormDTO.java | 2 -- .../screen/impl/ScreenCustomerAgencyServiceImpl.java | 2 +- .../screen/impl/ScreenCustomerGridServiceImpl.java | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java index c8f9c78e71..ee5830567a 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java @@ -1,7 +1,6 @@ package com.epmet.dto.basereport.form; import com.epmet.commons.tools.dto.form.PageFormDTO; -import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; @@ -12,7 +11,6 @@ import java.io.Serializable; * @Date 2021/10/15 10:55 */ @Data -@AllArgsConstructor public class EventInfoFormDTO extends PageFormDTO implements Serializable { private static final long serialVersionUID = 8479649048108914555L; private String customerId; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java index 972d8ef961..9f3510d049 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java @@ -325,7 +325,7 @@ public class ScreenCustomerAgencyServiceImpl extends BaseServiceImpl getAgencyList(String customerId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerAgencyEntity::getAgencyId, customerId); + wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerAgencyEntity::getCustomerId, customerId); List list = baseDao.selectList(wrapper); if (CollectionUtils.isEmpty(list)) { return Collections.emptyMap(); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java index c87c58f7fd..8c81b80bb9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java @@ -244,7 +244,7 @@ public class ScreenCustomerGridServiceImpl extends BaseServiceImpl getGridList(String customerId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerGridEntity::getGridId, customerId); + wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerGridEntity::getCustomerId, customerId); List list = baseDao.selectList(wrapper); return ConvertUtils.sourceToTarget(list, ScreenCustomerGridDTO.class).stream().collect(Collectors.toMap(ScreenCustomerGridDTO::getGridId, Function.identity())); } From 74974212038bbd3d3d61e94ca0f9fca4df53aa5e Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Wed, 20 Oct 2021 09:07:26 +0800 Subject: [PATCH 051/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8=E7=BD=91=E6=A0=BCID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendata/dto/BaseDisputeProcessDTO.java | 4 + .../com/epmet/opendata/dto/ExDeptDTO.java | 81 +++++++++++++ .../com/epmet/opendata/dao/ExDeptDao.java | 33 +++++ .../entity/BaseDisputeProcessEntity.java | 4 + .../epmet/opendata/entity/ExDeptEntity.java | 83 +++++++++++++ .../epmet/opendata/service/ExDeptService.java | 97 +++++++++++++++ .../impl/BaseDisputeProcessServiceImpl.java | 11 ++ .../service/impl/ExDeptServiceImpl.java | 114 ++++++++++++++++++ .../src/main/resources/mapper/ExDeptDao.xml | 19 +++ 9 files changed, 446 insertions(+) create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExDeptDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExDeptService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java index 38ab49fc12..2f377e9ac9 100644 --- a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java @@ -44,6 +44,10 @@ public class BaseDisputeProcessDTO implements Serializable { */ private String customerId; + private Integer detpId; + + private String reporterId; + /** * 网格编码 */ diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExDeptDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExDeptDTO.java new file mode 100644 index 0000000000..cd092d52ba --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExDeptDTO.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.opendata.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * 部门(网格)中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-19 + */ +@Data +public class ExDeptDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * (市平台)部门id + */ + private Integer deptId; + + /** + * (市平台)父部门id + */ + private Integer parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * (市平台)部门/网格名称 + */ + private String fullName; + + /** + * (市平台)部门/网格简称 + */ + private String deptName; + + /** + * (市平台)部门/网格编码 + */ + private String deptCode; + + /** + * + */ + private String gridCode; + + /** + * (区县平台)部门id + */ + private String deptIdQx; + + /** + * (区县平台)部门/网格名称 + */ + private String deptNameQx; + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.java new file mode 100644 index 0000000000..23793ddf6d --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.ExDeptEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 部门(网格)中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-19 + */ +@Mapper +public interface ExDeptDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java index c7266558ed..3f458a026a 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseDisputeProcessEntity.java @@ -44,6 +44,10 @@ public class BaseDisputeProcessEntity extends BaseEpmetEntity { */ private String customerId; + private Integer detpId; + + private String reporterId; + /** * 网格编码 */ diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java new file mode 100644 index 0000000000..68bf992a26 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.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.opendata.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-19 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ex_dept") +public class ExDeptEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * (市平台)部门id + */ + private Integer deptId; + + /** + * (市平台)父部门id + */ + private Integer parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * (市平台)部门/网格名称 + */ + private String fullName; + + /** + * (市平台)部门/网格简称 + */ + private String deptName; + + /** + * (市平台)部门/网格编码 + */ + private String deptCode; + + /** + * + */ + private String gridCode; + + /** + * (区县平台)部门id + */ + private String deptIdQx; + + /** + * (区县平台)部门/网格名称 + */ + private String deptNameQx; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExDeptService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExDeptService.java new file mode 100644 index 0000000000..644c06c673 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExDeptService.java @@ -0,0 +1,97 @@ +/** + * 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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.commons.tools.page.PageData; +import com.epmet.opendata.dto.ExDeptDTO; +import com.epmet.opendata.entity.ExDeptEntity; + +import java.util.List; +import java.util.Map; + +/** + * 部门(网格)中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-19 + */ +public interface ExDeptService extends BaseService { + + /** + * 默认分页 + * + * @param params + * @return PageData + * @author generator + * @date 2021-10-19 + */ + PageData page(Map params); + + /** + * 默认查询 + * + * @param params + * @return java.util.List + * @author generator + * @date 2021-10-19 + */ + List list(Map params); + + /** + * 单条查询 + * + * @param id + * @return ExDeptDTO + * @author generator + * @date 2021-10-19 + */ + ExDeptDTO get(String id); + + /** + * 默认保存 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-19 + */ + void save(ExDeptDTO dto); + + /** + * 默认更新 + * + * @param dto + * @return void + * @author generator + * @date 2021-10-19 + */ + void update(ExDeptDTO dto); + + /** + * 批量删除 + * + * @param ids + * @return void + * @author generator + * @date 2021-10-19 + */ + void delete(String[] ids); + + Map getDeptMap(); +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java index d716762780..8068eda5cc 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java @@ -29,11 +29,13 @@ import com.epmet.opendata.dao.BaseDisputeProcessDao; import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.entity.BaseDisputeProcessEntity; import com.epmet.opendata.service.BaseDisputeProcessService; +import com.epmet.opendata.service.ExDeptService; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 事件信息表 @@ -45,6 +47,8 @@ import java.util.List; public class BaseDisputeProcessServiceImpl extends BaseServiceImpl implements BaseDisputeProcessService { @Resource private DataStatisticalOpenFeignClient dataStatisticalOpenFeignClient; + @Resource + private ExDeptService exDeptService; /** * 获取上报事件 @@ -61,9 +65,13 @@ public class BaseDisputeProcessServiceImpl extends BaseServiceImpl deptMap = exDeptService.getDeptMap(); List list = result.getData(); if (CollectionUtils.isNotEmpty(list)) { List entityList = ConvertUtils.sourceToTarget(list, BaseDisputeProcessEntity.class); + entityList.forEach(item -> { + item.setDetpId(deptMap.get(item.getOrgCode())); + }); if(SystemMessageType.PROJECT_ADD.equals(formDTO.getType())){ insertBatch(entityList); }else { @@ -77,6 +85,9 @@ public class BaseDisputeProcessServiceImpl extends BaseServiceImpl entityList = ConvertUtils.sourceToTarget(list, BaseDisputeProcessEntity.class); + entityList.forEach(item -> { + item.setDetpId(deptMap.get(item.getOrgCode())); + }); if("add".equals(formDTO.getType())){ insertBatch(entityList); }else { diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java new file mode 100644 index 0000000000..a2bb40d070 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java @@ -0,0 +1,114 @@ +/** + * 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.opendata.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.opendata.dao.ExDeptDao; +import com.epmet.opendata.dto.ExDeptDTO; +import com.epmet.opendata.entity.ExDeptEntity; +import com.epmet.opendata.service.ExDeptService; +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; + +/** + * 部门(网格)中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-19 + */ +@Service +public class ExDeptServiceImpl extends BaseServiceImpl implements ExDeptService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, FieldConstant.CREATED_TIME, false), + getWrapper(params) + ); + return getPageData(page, ExDeptDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, ExDeptDTO.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 ExDeptDTO get(String id) { + ExDeptEntity entity = baseDao.selectById(id); + return ConvertUtils.sourceToTarget(entity, ExDeptDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(ExDeptDTO dto) { + ExDeptEntity entity = ConvertUtils.sourceToTarget(dto, ExDeptEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ExDeptDTO dto) { + ExDeptEntity entity = ConvertUtils.sourceToTarget(dto, ExDeptEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + // 逻辑删除(@TableLogic 注解) + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + + @Override + public Map getDeptMap() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + List entityList = baseDao.selectList(wrapper); + if (CollectionUtils.isEmpty(entityList)) { + return Collections.emptyMap(); + } + return entityList.stream().collect(Collectors.toMap(ExDeptEntity::getGridCode, ExDeptEntity::getDeptId, (key1, key2) -> key2)); + } + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml new file mode 100644 index 0000000000..db24b07d11 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 32bd1cbde9ee7c0e32909752d3abafced662f418 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Wed, 20 Oct 2021 10:34:57 +0800 Subject: [PATCH 052/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8=E7=BD=91=E6=A0=BCID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-gateway/pom.xml | 4 ++-- epmet-gateway/src/main/resources/bootstrap.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml index 3d668a8b6f..d180c7cab9 100644 --- a/epmet-gateway/pom.xml +++ b/epmet-gateway/pom.xml @@ -365,8 +365,8 @@ - - http://127.0.0.1:8117 + lb://open-data-worker-server + lb://epmet-openapi-adv-server diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index 69423d078f..1f34bc71a1 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -1,4 +1,4 @@ -server: +basedisputeprocessserver: tomcat: max-swallow-size: 100MB port: @server.port@ @@ -352,7 +352,7 @@ spring: - CpAuth=true #政府工作端议题管理 - id: open-data-worker-server - uri: @gateway.routes.gov-issue-server.uri@ + uri: @gateway.routes.open-data-worker-server.url@ order: 38 predicates: - Path=${server.servlet.context-path}/opendata/** From 8f3e2dc52141828aea4ca7ea399baea4d1a892ec Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Wed, 20 Oct 2021 14:05:58 +0800 Subject: [PATCH 053/177] =?UTF-8?q?=E6=9A=82=E6=97=B6=E6=94=BE=E5=BC=80err?= =?UTF-8?q?or?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extract/toscreen/impl/ScreenProjectSettleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java index ffff48bc3f..529593abcc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java @@ -197,7 +197,7 @@ public class ScreenProjectSettleServiceImpl implements ScreenProjectSettleServic } } - log.warn(String.format("/data/stats/demo/project-test,screen_project_**表抽取完毕,customerId:%s", param.getCustomerId())); + log.error(String.format("/data/stats/demo/project-test,screen_project_**表抽取完毕,customerId:%s", param.getCustomerId())); } /** From 2e8f1b997f435c04f29e3190d7934f9dc31a637b Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 20 Oct 2021 17:42:27 +0800 Subject: [PATCH 054/177] =?UTF-8?q?=E7=BB=84=E7=BB=87=E7=BD=91=E6=A0=BC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/org/result/CustomerAgencyDTO.java | 5 ++ .../epmet/dto/org/result/CustomerGridDTO.java | 5 ++ .../feign/DataStatisticalOpenFeignClient.java | 2 +- .../resources/mapper/org/CustomerGridDao.xml | 5 +- .../mapper/org/StatsCustomerAgencyDao.xml | 5 +- .../dto/form/GridBaseInfoFormDTO.java | 2 +- .../com/epmet/opendata/dao/ExDeptDao.java | 55 +++++++++++++ .../epmet/opendata/entity/ExDeptEntity.java | 53 ++++++++++++ .../service/impl/BaseGridInfoServiceImpl.java | 48 ++++++++--- .../src/main/resources/mapper/ExDeptDao.xml | 82 +++++++++++++++++++ 10 files changed, 242 insertions(+), 20 deletions(-) create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java index c78138e9bf..658a3e9c2d 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java @@ -78,6 +78,11 @@ public class CustomerAgencyDTO implements Serializable { */ private String areaCode; + /** + * 省组织编码 + */ + private String code; + /** * 删除标识 */ diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java index bcff1ea7b0..752bb721cd 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java @@ -67,6 +67,11 @@ public class CustomerGridDTO implements Serializable { */ private String areaCode; + /** + * 省网格编码 + */ + private String code; + /** * 删除标识:0.未删除 1.已删除 */ diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index 50b339b697..88393ae128 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -37,7 +37,7 @@ import java.util.List; */ //url="http://localhost:8108" //@FeignClient(name = ServiceConstant.DATA_STATISTICAL_SERVER, fallback = DataStatisticalOpenFeignClientFallBack.class, url = "http://localhost:6666") -@FeignClient(name = ServiceConstant.DATA_STATISTICAL_SERVER, fallbackFactory = DataStatisticalOpenFeignClientFallBackFactory.class) +@FeignClient(name = ServiceConstant.DATA_STATISTICAL_SERVER, fallbackFactory = DataStatisticalOpenFeignClientFallBackFactory.class,url="http://localhost:8108") public interface DataStatisticalOpenFeignClient { /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml index 5d637d31de..a3b0b4b23c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml @@ -131,10 +131,7 @@ * FROM customer_grid - WHERE 1=1 - - AND del_flag = '0' - + WHERE del_flag = '0' AND customer_id = #{customerId} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml index e1e4d79131..8a7afd3d87 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml @@ -209,10 +209,7 @@ * FROM customer_agency - WHERE 1=1 - - AND del_flag = '0' - + WHERE del_flag = '0' AND customer_id = #{customerId} diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java index c1952d1bcf..0b1910a2ea 100644 --- a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java @@ -25,7 +25,7 @@ public class GridBaseInfoFormDTO implements Serializable { */ private List orgIdList; /** - * 操作类型【新增:add 修改删除:edit】 + * 操作类型【新增:add 修改删除:edit 初始化所有数据:all】 */ private String type; diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.java new file mode 100644 index 0000000000..fa088c958f --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExDeptDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.BaseGridInfoEntity; +import com.epmet.opendata.entity.ExDeptEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网格基础信息表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-15 + */ +@Mapper +public interface ExDeptDao extends BaseDao { + + /** + * @Author sun + * @Description 网格基础信息批量更新部分字段 + **/ + int updateBatch(@Param("list") List entityList); + + /** + * @Author sun + * @Description 网格基础信息批量更新部分字段 + **/ + int insertBatch(@Param("list") List entityList); + + /** + * @Author sun + * @Description 网格基础信息批量更新部分字段 + **/ + int updateBatchGrid(@Param("list") List entityList); + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java new file mode 100644 index 0000000000..ecda9e6b11 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java @@ -0,0 +1,53 @@ +/** + * 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.opendata.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-15 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ex_dept") +public class ExDeptEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * (区县平台)部门id + */ + private String deptIdQx; + + /** + * (区县平台)部门/网格名称 + */ + private String deptNameQx; + + /** + * 部门/网格编码 + */ + private String gridCode; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java index 1d4f4a1e17..7802dfc707 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java @@ -18,14 +18,17 @@ package com.epmet.opendata.service.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.feign.DataStatisticalOpenFeignClient; import com.epmet.opendata.dao.BaseGridInfoDao; +import com.epmet.opendata.dao.ExDeptDao; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.entity.BaseGridInfoEntity; +import com.epmet.opendata.entity.ExDeptEntity; import com.epmet.opendata.service.BaseGridInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -44,6 +47,8 @@ import java.util.List; public class BaseGridInfoServiceImpl extends BaseServiceImpl implements BaseGridInfoService { @Autowired private DataStatisticalOpenFeignClient dataStatisticalOpenFeignClient; + @Autowired + private ExDeptDao exDeptDao; /** * @Author sun @@ -52,13 +57,16 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl> result = dataStatisticalOpenFeignClient.getAgencyBaseInfo(formDTO); if (!result.success()) { throw new RenException(result.getInternalMsg()); } + if (null == result.getData() || result.getData().size() < NumConstant.ONE) { + return; + } //2.中间库新增/修改数据 - List entityList = new ArrayList<>(); + /*List entityList = new ArrayList<>(); result.getData().forEach(ag->{ BaseGridInfoEntity entity = new BaseGridInfoEntity(); entity.setCustomerId(ag.getCustomerId()); @@ -76,13 +84,22 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl ExList = new ArrayList<>(); + result.getData().forEach(ag->{ + ExDeptEntity entity = new ExDeptEntity(); + entity.setDeptIdQx(ag.getId()); + entity.setDeptNameQx(ag.getOrganizationName()); + entity.setGridCode(ag.getCode()); + ExList.add(entity); }); - if("add".equals(formDTO.getType())){ - insertBatch(entityList); + if(null!=formDTO.getType()&& "all".equals(formDTO.getType())){ + exDeptDao.updateBatch(ExList); }else { - baseDao.updateBatch(entityList); + exDeptDao.insertBatch(ExList); } + } /** @@ -97,8 +114,11 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl entityList = new ArrayList<>(); + /*List entityList = new ArrayList<>(); result.getData().forEach(ag->{ BaseGridInfoEntity entity = new BaseGridInfoEntity(); entity.setCustomerId(ag.getCustomerId()); @@ -111,11 +131,19 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl ExList = new ArrayList<>(); + result.getData().forEach(ag -> { + ExDeptEntity entity = new ExDeptEntity(); + entity.setDeptIdQx(ag.getId()); + entity.setDeptNameQx(ag.getGridName()); + entity.setGridCode(ag.getCode()); + ExList.add(entity); }); - if("add".equals(formDTO.getType())){ - insertBatch(entityList); - }else { - baseDao.updateBatch(entityList); + if (null != formDTO.getType() && "all".equals(formDTO.getType())) { + exDeptDao.updateBatchGrid(ExList); + } else { + exDeptDao.insertBatch(ExList); } } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml new file mode 100644 index 0000000000..9090a77af5 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml @@ -0,0 +1,82 @@ + + + + + + + UPDATE ex_dept + + + + + + when grid_code = #{item.gridCode} then #{item.deptIdQx} + + + + + + + + when grid_code = #{item.gridCode} then #{item.deptNameQx} + + + + + + WHERE + 1=1 + + grid_code = #{item.gridCode} + + + + + INSERT INTO ex_dept + ( + dept_id_qx, + dept_name_qx + ) + VALUES + + ( + #{i.deptIdQx}, + #{i.deptNameQx} + ) + + ON DUPLICATE KEY + UPDATE + dept_id_qx = values(dept_id_qx), + dept_name_qx = values(dept_name_qx) + + + + UPDATE ex_dept + + + + + + when dept_name LIKE CONCAT(left(#{item.deptNameQx},2),'%',right(#{item.deptNameQx},2),if(LOCATE('第二', #{item.deptNameQx})>0,'%2','%1')) then #{item.deptIdQx} + + + + + + + + when dept_name LIKE CONCAT(left(#{item.deptNameQx},2),'%',right(#{item.deptNameQx},2),if(LOCATE('第二', #{item.deptNameQx})>0,'%2','%1')) then #{item.deptNameQx} + + + + + + WHERE + 1=1 + + dept_name LIKE CONCAT(left(#{item.deptNameQx},2),'%',right(#{item.deptNameQx},2),if(LOCATE('第二', #{item.deptNameQx})>0,'%2','%1')) + + + + + \ No newline at end of file From f8eb5a6a3ec36a8ab431403cd9c1c331215d37e5 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Wed, 20 Oct 2021 17:56:50 +0800 Subject: [PATCH 055/177] ... --- epmet-gateway/src/main/resources/bootstrap.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index 1f34bc71a1..6db9fa47bb 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -1,4 +1,4 @@ -basedisputeprocessserver: +server: tomcat: max-swallow-size: 100MB port: @server.port@ From 2ebfc657f10dc28b41544816bedd7ad9b8bd3fe7 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Wed, 20 Oct 2021 17:58:31 +0800 Subject: [PATCH 056/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8=E7=BD=91=E6=A0=BCID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/opendata/entity/ExDeptEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java index 8cc98bfc62..7a2d2e3ff8 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExDeptEntity.java @@ -18,7 +18,6 @@ package com.epmet.opendata.entity; import com.baomidou.mybatisplus.annotation.TableName; -import com.epmet.commons.mybatis.entity.BaseEpmetEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,7 +30,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper=false) @TableName("ex_dept") -public class ExDeptEntity extends BaseEpmetEntity { +public class ExDeptEntity { private static final long serialVersionUID = 1L; From 6a2c891acf05c6c1bfdd0a89e1642247a7673d12 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 21 Oct 2021 09:29:43 +0800 Subject: [PATCH 057/177] =?UTF-8?q?=E9=94=99=E6=8F=90url=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/feign/DataStatisticalOpenFeignClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index 88393ae128..50b339b697 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -37,7 +37,7 @@ import java.util.List; */ //url="http://localhost:8108" //@FeignClient(name = ServiceConstant.DATA_STATISTICAL_SERVER, fallback = DataStatisticalOpenFeignClientFallBack.class, url = "http://localhost:6666") -@FeignClient(name = ServiceConstant.DATA_STATISTICAL_SERVER, fallbackFactory = DataStatisticalOpenFeignClientFallBackFactory.class,url="http://localhost:8108") +@FeignClient(name = ServiceConstant.DATA_STATISTICAL_SERVER, fallbackFactory = DataStatisticalOpenFeignClientFallBackFactory.class) public interface DataStatisticalOpenFeignClient { /** From c5f00e1aaca9040a508551bb8c60ce64e99c97d4 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Thu, 21 Oct 2021 14:00:00 +0800 Subject: [PATCH 058/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8=E7=BD=91=E6=A0=BCID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/service/impl/DataReportingServiceImpl.java | 1 + .../java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java | 1 + 2 files changed, 2 insertions(+) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 721a827074..8de94bfd77 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -209,6 +209,7 @@ public class DataReportingServiceImpl implements DataReportingService { dto.setEventCategory(categoryCode); dto.setReportTime(project.getProjectCreateTime()); dto.setHappenDate(DateUtils.parseDate(DateUtils.format(project.getProjectCreateTime()), DateUtils.DATE_PATTERN)); + dto.setHappenPlace(project.getProjectAddress()); dto.setEventDescription(project.getProjectContent()); dto.setSuccessfulOrNo(ProjectConstant.CLOSED_CASE.equals(project.getProjectStatusCode())?"Y":"N"); if (ProjectConstant.CLOSED_CASE.equals(project.getProjectStatusCode())) { diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java index a2bb40d070..44b519e95b 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExDeptServiceImpl.java @@ -104,6 +104,7 @@ public class ExDeptServiceImpl extends BaseServiceImpl @Override public Map getDeptMap() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.ne(ExDeptEntity::getGridCode, null); List entityList = baseDao.selectList(wrapper); if (CollectionUtils.isEmpty(entityList)) { return Collections.emptyMap(); From 1cf71d92fd315b76a2e175d0687661696d0542a8 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Thu, 21 Oct 2021 15:38:17 +0800 Subject: [PATCH 059/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8=E7=BD=91=E6=A0=BCID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java | 2 ++ .../entity/evaluationindex/screen/ScreenProjectDataEntity.java | 2 ++ .../extract/toscreen/impl/ScreenProjectSettleServiceImpl.java | 1 + .../java/com/epmet/service/impl/DataReportingServiceImpl.java | 1 + .../java/com/epmet/service/impl/SystemMessageServiceImpl.java | 1 + 5 files changed, 7 insertions(+) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java index be5355aebc..dfd88c7e96 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java @@ -132,6 +132,8 @@ public class ScreenProjectDataDTO implements Serializable { */ private BigDecimal latitude; + private String projectCreator; + /** * 删除标识 0未删除;1已删除 */ diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java index b53feaf6f6..85b81560e2 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java @@ -160,4 +160,6 @@ public class ScreenProjectDataEntity extends BaseEpmetEntity { */ private BigDecimal satisfactionScore; + private String projectCreator; + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java index 529593abcc..744e0c61b6 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java @@ -85,6 +85,7 @@ public class ScreenProjectSettleServiceImpl implements ScreenProjectSettleServic meta.setProjectCreateTime(projectInfo.getCreatedTime()); meta.setProjectTitle(projectInfo.getTitle()); meta.setOrigin(projectInfo.getOrigin()); + meta.setProjectCreator(projectInfo.getCreatedBy()); if (ProjectConstant.PROJECT_ORIGIN_ISSUE.equals(projectInfo.getOrigin())) { //来源于议题的,上面的initNewScreenProjectData,已经赋值orgType=grid, orgId:gridId diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 8de94bfd77..a0b1931b29 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -194,6 +194,7 @@ public class DataReportingServiceImpl implements DataReportingService { dto.setId(project.getProjectId()); dto.setCustomerId(project.getCustomerId()); dto.setEventName(project.getProjectTitle()); + dto.setReporterId(project.getProjectCreator()); String categoryCode = project.getCategoryCode().split(StrConstant.COMMA)[0]; //如果是孔村、榆山、锦水的项目需要关联分类字典表 if("2fe0065f70ca0e23ce4c26fca5f1d933".equals(project.getCustomerId()) || 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 0196a0aea7..61373708df 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 @@ -212,6 +212,7 @@ public class SystemMessageServiceImpl implements SystemMessageService { case TopicConstants.PATROL: case TopicConstants.POINT: case TopicConstants.STAFF: + case TopicConstants.PROJECT: // 耗时较短。一个小时最多发送一次告警 if (l1LastAlertTime == null || ( From 920b476cadc73ba82a04751a2dfdd1430682ee78 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Thu, 21 Oct 2021 16:09:54 +0800 Subject: [PATCH 060/177] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E4=BF=AE=E6=94=B9=E7=88=B6=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=92=8C=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScreenProjectCategoryOrgDailyDao.java | 18 +++++-- ...eenProjectCategoryOrgDailyServiceImpl.java | 4 +- .../ScreenProjectCategoryOrgDailyDao.xml | 49 +++++++++++++------ 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java index d5336c4a34..70ef71817f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java @@ -55,16 +55,28 @@ public interface ScreenProjectCategoryOrgDailyDao extends BaseDao selectOrgCategoryInfo(@Param("customerId") String customerId, @Param("dateId") String dateId,@Param("level")String level); /** - * @Description 查询组织分类信息【多客户】 + * @Description 查询组织分类信息【多客户】父客户存在的分类 * @Param customerId * @Param dateId * @Param level - * @Param existsStatus 父客户是否存在 * @author zxc * @date 2021/3/24 下午2:48 */ List selectOrgCategoryMoreCustomerInfo(@Param("customerIds")List customerIds, @Param("dateId") String dateId, - @Param("level")String level, @Param("customerId")String customerId, @Param("existsStatus")Boolean existsStatus); + @Param("level")String level, @Param("customerId")String customerId); + + /** + * @Description 查询组织分类信息【多客户】父客户存在的分类 + * @param customerIds + * @param dateId + * @param level + * @param customerId + * @author zxc + * @date 2021/10/21 4:03 下午 + */ + List selectOrgCategoryMoreCustomerInfoNotExists(@Param("customerIds")List customerIds, @Param("dateId") String dateId, + @Param("level")String level, @Param("customerId")String customerId); + /** * @Description 查询组织分类信息【多客户】升级版 * @Param customerIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java index 1a4085042c..0244c0ea84 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java @@ -415,10 +415,10 @@ public class ScreenProjectCategoryOrgDailyServiceImpl extends BaseServiceImpl sonCustomerList = new ArrayList<>(); // 父客户存在的分类 - List categoryProjectExists = baseDao.selectOrgCategoryMoreCustomerInfo(customerIds, dateId, level, customerId, true); + List categoryProjectExists = baseDao.selectOrgCategoryMoreCustomerInfo(customerIds, dateId, level, customerId); log.info("父客户存在的分类{}"+ JSON.toJSONString(categoryProjectExists)); // 父客户不存在的分类 - List categoryProjectNotExists = baseDao.selectOrgCategoryMoreCustomerInfo(customerIds, dateId, level, customerId, false); + List categoryProjectNotExists = baseDao.selectOrgCategoryMoreCustomerInfoNotExists(customerIds, dateId, level, customerId); log.info("父客户不存在的分类{}"+ JSON.toJSONString(categoryProjectNotExists)); if (!CollectionUtils.isEmpty(categoryProjectExists)){ sonCustomerList.addAll(categoryProjectExists); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml index cdce01974a..663efd9458 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml @@ -44,7 +44,7 @@ GROUP BY sa.CATEGORY_CODE,sca.AGENCY_ID - + + + + \ No newline at end of file From 10e3359fae26f2680227d28a6026675356023168 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Thu, 21 Oct 2021 16:10:40 +0800 Subject: [PATCH 061/177] emm --- .../evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml index 663efd9458..38aa359065 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml @@ -52,7 +52,7 @@ IFNULL(sca.PIDS,'0') AS pids, #{customerId} as customerId, od.CUSTOMER_ID AS categoryOriginCustomerId, - od.level, + cd.level, cd.EPMET_CATEGORY_CODE AS categoryCode, SUM(od.PROJECT_TOTAL) AS projectTotal, #{level} as orgType, From e01839566742e33a5bc684a97703b0ef5e65736c Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Thu, 21 Oct 2021 16:12:37 +0800 Subject: [PATCH 062/177] warn --- .../extract/toscreen/impl/ScreenProjectSettleServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java index 529593abcc..ffff48bc3f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenProjectSettleServiceImpl.java @@ -197,7 +197,7 @@ public class ScreenProjectSettleServiceImpl implements ScreenProjectSettleServic } } - log.error(String.format("/data/stats/demo/project-test,screen_project_**表抽取完毕,customerId:%s", param.getCustomerId())); + log.warn(String.format("/data/stats/demo/project-test,screen_project_**表抽取完毕,customerId:%s", param.getCustomerId())); } /** From be0de5d61c16ceed1037dcd6329d7a3e66499fa7 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 21 Oct 2021 16:23:30 +0800 Subject: [PATCH 063/177] =?UTF-8?q?=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/ExDeptDao.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml index 16dc58a61a..ba20d99170 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/ExDeptDao.xml @@ -46,13 +46,15 @@ INSERT INTO ex_dept ( dept_id_qx, - dept_name_qx + dept_name_qx, + grid_code ) VALUES ( #{i.deptIdQx}, - #{i.deptNameQx} + #{i.deptNameQx}, + #{i.gridCode} ) ON DUPLICATE KEY From f965f9ec62d8cb0a6915ad41b4be8843070a5a73 Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Thu, 21 Oct 2021 16:50:28 +0800 Subject: [PATCH 064/177] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evaluationindex/screen/ScreenCustomerAgencyEntity.java | 1 - .../entity/evaluationindex/screen/ScreenCustomerGridEntity.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java index 4fc6f6bee8..475e9907bd 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java @@ -94,7 +94,6 @@ public class ScreenCustomerAgencyEntity extends BaseEpmetEntity { * 行政地区编码 */ private String areaCode; - private String code; private String sourceType; /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java index 5a2b97896a..9de3701b58 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java @@ -93,6 +93,4 @@ public class ScreenCustomerGridEntity extends BaseEpmetEntity { * desc: 是否参与上级计算yes:参与;no:不参与 add 01.14 */ private String upToCal; - - private String code; } From f4f7ca03b54f6be338100c8d47ad83743bdfa409 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Thu, 21 Oct 2021 17:00:34 +0800 Subject: [PATCH 065/177] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basereport/result/EventInfoResultDTO.java | 49 ++++++++++++++++++- .../feign/DataStatisticalOpenFeignClient.java | 3 +- ...ataStatisticalOpenFeignClientFallBack.java | 6 +-- .../controller/DataReportingController.java | 5 +- .../epmet/service/DataReportingService.java | 3 +- .../impl/DataReportingServiceImpl.java | 16 +++--- .../V0.0.24__add_categoryOriginCustomerId.sql | 2 + .../impl/BaseDisputeProcessServiceImpl.java | 6 +-- 8 files changed, 70 insertions(+), 20 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java index faff5af737..cce7f1bb65 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java @@ -14,11 +14,20 @@ import java.util.Date; @Data public class EventInfoResultDTO implements Serializable { private static final long serialVersionUID = -6483163020737762044L; + /** + * 主键 + */ + private String id; + /** * 客户Id */ private String customerId; + private Integer detpId; + + private String reporterId; + /** * 网格编码 */ @@ -70,7 +79,15 @@ public class EventInfoResultDTO implements Serializable { private String successfulOrNo; /** - * 办结层级01省、自治区、直辖市02地、市、州、盟03县、市、区、旗04乡镇、街道05片区06村、社区07网格 + * 办结层级 + 01省、自治区、直辖市 + 02地、市、州、盟 + 03县、市、区、旗 + 04乡镇、街道 + 05片区 + 06村、社区 + 07网格 + */ private String completeLevel; @@ -140,4 +157,34 @@ public class EventInfoResultDTO implements Serializable { * 重点人员现状 */ private String keypeopleStatus; + + /** + * 删除标识 0.未删除 1.已删除 + */ + private Long delFlag; + + /** + * 乐观锁 + */ + private Integer revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index 50b339b697..8b159704aa 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -4,6 +4,7 @@ import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.StatsFormDTO; import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.dto.basereport.result.EventInfoResultDTO; import com.epmet.dto.extract.form.BizDataFormDTO; import com.epmet.dto.extract.form.ExtractIndexFormDTO; import com.epmet.dto.extract.form.ExtractOriginFormDTO; @@ -340,5 +341,5 @@ public interface DataStatisticalOpenFeignClient { * @Date 2021/10/15 16:50 */ @PostMapping("/data/stats/datareporting/eventinfo") - Result> getEventInfo(@RequestBody EventInfoFormDTO formDTO); + Result> getEventInfo(@RequestBody EventInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java index b36b9e9434..f35020855a 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java @@ -5,6 +5,7 @@ import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.StatsFormDTO; import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.dto.basereport.result.EventInfoResultDTO; import com.epmet.dto.extract.form.BizDataFormDTO; import com.epmet.dto.extract.form.ExtractIndexFormDTO; import com.epmet.dto.extract.form.ExtractOriginFormDTO; @@ -20,7 +21,6 @@ import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.DataStatisticalOpenFeignClient; -import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; @@ -326,12 +326,12 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp * * @param formDTO * @Param formDTO - * @Return {@link Result>} + * @Return {@link Result>} * @Author zhaoqifeng * @Date 2021/10/15 16:50 */ @Override - public Result> getEventInfo(EventInfoFormDTO formDTO) { + public Result> getEventInfo(EventInfoFormDTO formDTO) { return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getEventInfo", formDTO); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index d9de9bc1e1..1d8fb280c3 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -3,6 +3,7 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.dto.basereport.result.EventInfoResultDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; @@ -98,8 +99,8 @@ public class DataReportingController { * @Date 2021/10/15 14:09 */ @PostMapping("eventinfo") - public Result> getEventInfo(@RequestBody(required = false) EventInfoFormDTO formDTO) { - return new Result>().ok(dataReportingService.getEventInfo(formDTO)); + public Result> getEventInfo(@RequestBody(required = false) EventInfoFormDTO formDTO) { + return new Result>().ok(dataReportingService.getEventInfo(formDTO)); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index bbaf18aa3c..882685a41e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -8,7 +8,6 @@ import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; @@ -68,6 +67,6 @@ public interface DataReportingService { * @Author zhaoqifeng * @Date 2021/10/15 14:10 */ - List getEventInfo(EventInfoFormDTO formDTO); + List getEventInfo(EventInfoFormDTO formDTO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index a0b1931b29..6a3b7fbbce 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -5,6 +5,7 @@ import com.epmet.commons.tools.utils.DateUtils; import com.epmet.constant.OrgTypeConstant; import com.epmet.constant.ProjectConstant; import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.dto.basereport.result.EventInfoResultDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.ScreenCustomerGridDTO; @@ -16,7 +17,6 @@ import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; import com.epmet.entity.stats.CustomerProjectCategoryDictEntity; -import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; @@ -140,13 +140,13 @@ public class DataReportingServiceImpl implements DataReportingService { * * @param formDTO * @Param formDTO - * @Return {@link List} + * @Return {@link List} * @Author zhaoqifeng * @Date 2021/10/15 14:10 */ @Override - public List getEventInfo(EventInfoFormDTO formDTO) { - List list; + public List getEventInfo(EventInfoFormDTO formDTO) { + List list; //根据入参,获取项目 List projectList = screenProjectDataService.getProjectList(formDTO.getCustomerId(), formDTO.getProjectId(), formDTO.getPageNo(), formDTO.getPageSize()); //项目列表为空,返回空数组 @@ -156,7 +156,7 @@ public class DataReportingServiceImpl implements DataReportingService { //项目ID不为空时,因为只有一条,可以直接处理 if (StringUtils.isNotEmpty(formDTO.getProjectId())) { list = projectList.stream().map(project -> { - BaseDisputeProcessDTO dto = getBaseDisputeProcessDTO(project); + EventInfoResultDTO dto = getEventInfoResultDTO(project); if (OrgTypeConstant.AGENCY.equals(project.getOrgType())) { ScreenCustomerAgencyEntity agency = screenCustomerAgencyService.getAgencyById(project.getOrgId()); dto.setOrgCode(agency.getCode()); @@ -173,7 +173,7 @@ public class DataReportingServiceImpl implements DataReportingService { Map agencyMap = screenCustomerAgencyService.getAgencyList(formDTO.getCustomerId()); Map gridMap = screenCustomerGridService.getGridList(formDTO.getCustomerId()); list = projectList.stream().map(project -> { - BaseDisputeProcessDTO dto = getBaseDisputeProcessDTO(project); + EventInfoResultDTO dto = getEventInfoResultDTO(project); if (OrgTypeConstant.AGENCY.equals(project.getOrgType())) { ScreenCustomerAgencyEntity agency = agencyMap.get(project.getOrgId()); dto.setOrgCode(agency.getCode()); @@ -189,8 +189,8 @@ public class DataReportingServiceImpl implements DataReportingService { return list.stream().filter(item -> StringUtils.isNotBlank(item.getEventCategory())).collect(Collectors.toList()); } - private BaseDisputeProcessDTO getBaseDisputeProcessDTO(ScreenProjectDataDTO project) { - BaseDisputeProcessDTO dto = new BaseDisputeProcessDTO(); + private EventInfoResultDTO getEventInfoResultDTO(ScreenProjectDataDTO project) { + EventInfoResultDTO dto = new EventInfoResultDTO(); dto.setId(project.getProjectId()); dto.setCustomerId(project.getCustomerId()); dto.setEventName(project.getProjectTitle()); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/db/migration/V0.0.24__add_categoryOriginCustomerId.sql b/epmet-module/data-statistical/data-statistical-server/src/main/resources/db/migration/V0.0.24__add_categoryOriginCustomerId.sql index 0997b46828..b4ca6c2318 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/db/migration/V0.0.24__add_categoryOriginCustomerId.sql +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/db/migration/V0.0.24__add_categoryOriginCustomerId.sql @@ -1 +1,3 @@ alter table `epmet_evaluation_index`.screen_project_category_org_daily add COLUMN `CATEGORY_ORIGIN_CUSTOMER_ID` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '分类来源客户ID' AFTER CUSTOMER_ID; +ALTER TABLE `epmet_evaluation_index`.`screen_project_data` + ADD COLUMN `PROJECT_CREATOR` varchar(64) NULL COMMENT '项目创建人' AFTER `SATISFACTION_SCORE`; \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java index 8068eda5cc..2a9e99acbf 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseDisputeProcessServiceImpl.java @@ -24,9 +24,9 @@ import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.constant.SystemMessageType; import com.epmet.dto.basereport.form.EventInfoFormDTO; +import com.epmet.dto.basereport.result.EventInfoResultDTO; import com.epmet.feign.DataStatisticalOpenFeignClient; import com.epmet.opendata.dao.BaseDisputeProcessDao; -import com.epmet.opendata.dto.BaseDisputeProcessDTO; import com.epmet.opendata.entity.BaseDisputeProcessEntity; import com.epmet.opendata.service.BaseDisputeProcessService; import com.epmet.opendata.service.ExDeptService; @@ -61,12 +61,12 @@ public class BaseDisputeProcessServiceImpl extends BaseServiceImpl> result = dataStatisticalOpenFeignClient.getEventInfo(formDTO); + Result> result = dataStatisticalOpenFeignClient.getEventInfo(formDTO); if (!result.success()) { throw new RenException(result.getInternalMsg()); } Map deptMap = exDeptService.getDeptMap(); - List list = result.getData(); + List list = result.getData(); if (CollectionUtils.isNotEmpty(list)) { List entityList = ConvertUtils.sourceToTarget(list, BaseDisputeProcessEntity.class); entityList.forEach(item -> { From df2e444b1965cd453d403897e552d25a306c3fde Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 21 Oct 2021 17:14:49 +0800 Subject: [PATCH 066/177] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/org/form/GridBaseInfoFormDTO.java | 34 +++++++++++++++++++ .../dto/user/form/StaffBaseInfoFormDTO.java | 33 ++++++++++++++++++ .../feign/DataStatisticalOpenFeignClient.java | 5 ++- ...ataStatisticalOpenFeignClientFallBack.java | 4 +-- .../controller/DataReportingController.java | 4 +-- .../com/epmet/dao/org/CustomerGridDao.java | 4 +-- .../epmet/dao/org/StatsCustomerAgencyDao.java | 2 +- .../main/java/com/epmet/dao/user/UserDao.java | 2 +- .../epmet/service/DataReportingService.java | 4 +-- .../impl/DataReportingServiceImpl.java | 4 +-- .../service/org/CustomerAgencyService.java | 2 +- .../service/org/CustomerGridService.java | 4 +-- .../org/impl/CustomerAgencyServiceImpl.java | 2 +- .../org/impl/CustomerGridServiceImpl.java | 4 +-- .../com/epmet/service/user/UserService.java | 2 +- .../service/user/impl/UserServiceImpl.java | 2 +- 16 files changed, 89 insertions(+), 23 deletions(-) create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/form/GridBaseInfoFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/form/StaffBaseInfoFormDTO.java diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/form/GridBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/form/GridBaseInfoFormDTO.java new file mode 100644 index 0000000000..9d39ef6b81 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/form/GridBaseInfoFormDTO.java @@ -0,0 +1,34 @@ +package com.epmet.dto.org.form; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @dscription 插叙客户网格基础信息--接口入参 + * @author sun + */ +@Data +public class GridBaseInfoFormDTO implements Serializable { + + private static final long serialVersionUID = -3634745091993094743L; + /** + * 客户Id + */ + @NotBlank(message = "事件标识不能为空", groups = {Grid.class}) + private String customerId = ""; + /** + * 网格Id + */ + private List orgIdList; + /** + * 操作类型【新增:add 修改删除:edit 初始化所有数据:all】 + */ + private String type; + + public interface Grid extends CustomerClientShowGroup {} + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/form/StaffBaseInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/form/StaffBaseInfoFormDTO.java new file mode 100644 index 0000000000..b82ca423fe --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/form/StaffBaseInfoFormDTO.java @@ -0,0 +1,33 @@ +package com.epmet.dto.user.form; + +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.List; + +/** + * @dscription 插叙客户网格人员基础信息--接口入参 + * @author sun + */ +@Data +public class StaffBaseInfoFormDTO implements Serializable { + + private static final long serialVersionUID = -3634745091993094743L; + /** + * 客户Id + */ + @NotBlank(message = "事件标识不能为空", groups = {Staff.class}) + private String customerId = ""; + /** + * 人员Id + */ + private List staffIdList; + /** + * 操作类型【新增:add 修改删除:edit】 + */ + private String type; + public interface Staff extends CustomerClientShowGroup {} + +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java index 8b159704aa..73b56ef7a0 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java @@ -11,18 +11,17 @@ import com.epmet.dto.extract.form.ExtractOriginFormDTO; import com.epmet.dto.extract.form.ExtractScreenFormDTO; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBackFactory; -import com.epmet.opendata.dto.BaseDisputeProcessDTO; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java index f35020855a..43638c894e 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java @@ -12,17 +12,17 @@ import com.epmet.dto.extract.form.ExtractOriginFormDTO; import com.epmet.dto.extract.form.ExtractScreenFormDTO; import com.epmet.dto.group.form.GroupStatsFormDTO; import com.epmet.dto.group.form.GroupTotalFormDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.form.InitCustomerIndexForm; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.feign.DataStatisticalOpenFeignClient; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import java.util.List; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java index 1d8fb280c3..85706430c4 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java @@ -4,15 +4,15 @@ import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.basereport.result.EventInfoResultDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.opendata.dto.BaseDisputeProcessDTO; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java index 84743c5a76..688807259e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java @@ -23,11 +23,11 @@ import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; import com.epmet.dto.org.GridInfoDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.entity.org.CustomerGridEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java index d091e81711..a16f40e204 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java @@ -2,11 +2,11 @@ package com.epmet.dao.org; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.AgencySubTreeDto; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.org.CustomerAgencyEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java index fabf82d123..2c8f46ea9b 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java @@ -5,10 +5,10 @@ import com.epmet.dto.extract.form.StaffPatrolStatsFormDTO; import com.epmet.dto.extract.result.UserPartyResultDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java index 882685a41e..921a2b3dde 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java @@ -2,14 +2,14 @@ package com.epmet.service; import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.basereport.result.EventInfoResultDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import java.util.List; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java index 6a3b7fbbce..5c386342e9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java @@ -6,10 +6,12 @@ import com.epmet.constant.OrgTypeConstant; import com.epmet.constant.ProjectConstant; import com.epmet.dto.basereport.form.EventInfoFormDTO; import com.epmet.dto.basereport.result.EventInfoResultDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; import com.epmet.dto.screen.ScreenCustomerGridDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.CustomerStaffDTO; import com.epmet.dto.user.result.GridUserInfoDTO; @@ -17,8 +19,6 @@ import com.epmet.dto.user.result.MidPatrolDetailResult; import com.epmet.dto.user.result.MidPatrolRecordResult; import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; import com.epmet.entity.stats.CustomerProjectCategoryDictEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.DataReportingService; import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java index 490e598aff..bb160098e0 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java @@ -1,10 +1,10 @@ package com.epmet.service.org; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.entity.org.CustomerAgencyEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import java.util.Date; import java.util.List; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java index a0d6fb449d..f6131f2906 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java @@ -6,11 +6,11 @@ import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; import com.epmet.dto.org.GridInfoDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.entity.org.CustomerGridEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import java.util.Date; import java.util.List; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java index 86ef831a2f..64a5a0186d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java @@ -5,6 +5,7 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.constant.DataSourceConstant; import com.epmet.dao.org.StatsCustomerAgencyDao; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerAreaCodeResultDTO; import com.epmet.dto.org.result.OrgStaffDTO; @@ -12,7 +13,6 @@ import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity; import com.epmet.entity.org.CustomerAgencyEntity; import com.epmet.entity.org.CustomerGridEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; import com.epmet.service.org.CustomerAgencyService; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java index 3a74f81639..7a8f1b3806 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java @@ -10,11 +10,11 @@ import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO; import com.epmet.dto.group.result.GridIdListByCustomerResultDTO; import com.epmet.dto.org.CustomerStaffGridDTO; import com.epmet.dto.org.GridInfoDTO; +import com.epmet.dto.org.form.GridBaseInfoFormDTO; import com.epmet.dto.org.result.CustomerGridDTO; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.result.GridUserInfoDTO; import com.epmet.entity.org.CustomerGridEntity; -import com.epmet.opendata.dto.form.GridBaseInfoFormDTO; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.Issue.IssueService; import com.epmet.service.org.CustomerGridService; import org.springframework.beans.factory.annotation.Autowired; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java index cf98bb6c18..ffa464d4fa 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java @@ -7,10 +7,10 @@ import com.epmet.dto.org.result.OrgStaffDTO; import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.result.UserStatisticalData; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.util.DimIdGenerator; import java.util.Date; diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java index f6dc980302..a8bf95d7f0 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java @@ -17,10 +17,10 @@ import com.epmet.dto.screen.ScreenProjectDataDTO; import com.epmet.dto.stats.form.GmUploadEventFormDTO; import com.epmet.dto.stats.user.*; import com.epmet.dto.stats.user.result.UserStatisticalData; +import com.epmet.dto.user.form.StaffBaseInfoFormDTO; import com.epmet.dto.user.param.MidPatrolFormDTO; import com.epmet.dto.user.result.*; import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity; -import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO; import com.epmet.service.user.UserService; import com.epmet.util.DimIdGenerator; import com.epmet.util.ModuleConstant; From 46afef7afa04b51c98fe4b0061b822cc55f38882 Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 21 Oct 2021 18:38:13 +0800 Subject: [PATCH 067/177] =?UTF-8?q?=E6=9A=82=E6=97=B6=E4=BD=8F=E6=8E=89?= =?UTF-8?q?=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/epmet/mq/ProjectChangedCustomListener.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java index 72e12ff5dc..8681c525da 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java @@ -14,7 +14,6 @@ import com.epmet.constant.SystemMessageType; import com.epmet.dto.extract.form.ExtractOriginFormDTO; import com.epmet.service.evaluationindex.extract.todata.FactOriginExtractService; import com.epmet.service.evaluationindex.extract.toscreen.ScreenExtractService; -import com.epmet.service.evaluationindex.screen.ScreenProjectDataService; import com.epmet.util.DimIdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -161,7 +160,7 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently type = SystemMessageType.PROJECT_EDIT; } DisputeProcessMQMsg msg = new DisputeProcessMQMsg(customerId, msgObj.getProjectId(), type); - SpringContextUtils.getBean(ScreenProjectDataService.class).sendProjectChangeMq(msg); + //SpringContextUtils.getBean(ScreenProjectDataService.class).sendProjectChangeMq(msg); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【RocketMQ】消费项目变动消息失败:",e); From bea33551205f73730dae652fe034fb5924841c8d Mon Sep 17 00:00:00 2001 From: jianjun Date: Thu, 21 Oct 2021 18:41:43 +0800 Subject: [PATCH 068/177] =?UTF-8?q?Revert=20"=E6=9A=82=E6=97=B6=E4=BD=8F?= =?UTF-8?q?=E6=8E=89=E5=8F=91=E9=80=81"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 46afef7a --- .../main/java/com/epmet/mq/ProjectChangedCustomListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java index 8681c525da..72e12ff5dc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java @@ -14,6 +14,7 @@ import com.epmet.constant.SystemMessageType; import com.epmet.dto.extract.form.ExtractOriginFormDTO; import com.epmet.service.evaluationindex.extract.todata.FactOriginExtractService; import com.epmet.service.evaluationindex.extract.toscreen.ScreenExtractService; +import com.epmet.service.evaluationindex.screen.ScreenProjectDataService; import com.epmet.util.DimIdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -160,7 +161,7 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently type = SystemMessageType.PROJECT_EDIT; } DisputeProcessMQMsg msg = new DisputeProcessMQMsg(customerId, msgObj.getProjectId(), type); - //SpringContextUtils.getBean(ScreenProjectDataService.class).sendProjectChangeMq(msg); + SpringContextUtils.getBean(ScreenProjectDataService.class).sendProjectChangeMq(msg); } catch (RenException e) { // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 logger.error("【RocketMQ】消费项目变动消息失败:",e); From 8f099eb6b435f53270025c0b8659a8f75bcd7f48 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 22 Oct 2021 10:49:46 +0800 Subject: [PATCH 069/177] =?UTF-8?q?=E4=B8=AD=E9=97=B4=E8=A1=A8=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendata/dto/BaseConflictsResolveDTO.java | 77 +++++++++++++++++++ .../com/epmet/opendata/dto/ExUserDTO.java | 76 ++++++++++++++++++ .../opendata/dao/BaseConflictsResolveDao.java | 33 ++++++++ .../com/epmet/opendata/dao/ExUserDao.java | 33 ++++++++ .../entity/BaseConflictsResolveEntity.java | 48 ++++++++++++ .../epmet/opendata/entity/ExUserEntity.java | 72 +++++++++++++++++ .../service/BaseConflictsResolveService.java | 31 ++++++++ .../epmet/opendata/service/ExUserService.java | 31 ++++++++ .../impl/BaseConflictsResolveServiceImpl.java | 36 +++++++++ .../service/impl/ExUserServiceImpl.java | 48 ++++++++++++ 10 files changed, 485 insertions(+) create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseConflictsResolveDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExUserDTO.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseConflictsResolveDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExUserDao.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseConflictsResolveEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExUserEntity.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseConflictsResolveService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExUserService.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseConflictsResolveServiceImpl.java create mode 100644 epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExUserServiceImpl.java diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseConflictsResolveDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseConflictsResolveDTO.java new file mode 100644 index 0000000000..00c96a08f6 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseConflictsResolveDTO.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.opendata.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 事件中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +@Data +public class BaseConflictsResolveDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 事件ID + */ + private String id; + + /** + * 事件信息 + */ + private String eventInfo; + + /** + * 事件所属网格ID + */ + private String gridId; + + /** + * + */ + private String delFlag; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExUserDTO.java b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExUserDTO.java new file mode 100644 index 0000000000..d0f61777ca --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/ExUserDTO.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.opendata.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * 系统用户中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +@Data +public class ExUserDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 市平台 用户ID + */ + private String userId; + + /** + * 市平台 用户名 + */ + private String userName; + + /** + * 市平台 用户身份证号 + */ + private String idCard; + + /** + * 市平台 用户手机号 + */ + private String mobile; + + /** + * 区县平台 用户ID + */ + private String userIdQx; + + /** + * 区县平台 用户名 + */ + private String userNameQx; + + /** + * 区县平台 用户账号 + */ + private String userAccount; + + /** + * 删除标识 + */ + private String delFlag; + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseConflictsResolveDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseConflictsResolveDao.java new file mode 100644 index 0000000000..29be2a6c23 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/BaseConflictsResolveDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.BaseConflictsResolveEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 事件中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +@Mapper +public interface BaseConflictsResolveDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExUserDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExUserDao.java new file mode 100644 index 0000000000..4a3c4ecc13 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/ExUserDao.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.opendata.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.opendata.entity.ExUserEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统用户中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +@Mapper +public interface ExUserDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseConflictsResolveEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseConflictsResolveEntity.java new file mode 100644 index 0000000000..fe9a50a92a --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/BaseConflictsResolveEntity.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.opendata.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-22 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("base_conflicts_resolve") +public class BaseConflictsResolveEntity { + + private static final long serialVersionUID = 1L; + + /** + * 事件信息 + */ + private String eventInfo; + + /** + * 事件所属网格ID + */ + private String gridId; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExUserEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExUserEntity.java new file mode 100644 index 0000000000..f178336ab1 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/ExUserEntity.java @@ -0,0 +1,72 @@ +/** + * 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.opendata.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 系统用户中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("ex_user") +public class ExUserEntity { + + private static final long serialVersionUID = 1L; + + /** + * 市平台 用户ID + */ + private String userId; + + /** + * 市平台 用户名 + */ + private String userName; + + /** + * 市平台 用户身份证号 + */ + private String idCard; + + /** + * 市平台 用户手机号 + */ + private String mobile; + + /** + * 区县平台 用户ID + */ + private String userIdQx; + + /** + * 区县平台 用户名 + */ + private String userNameQx; + + /** + * 区县平台 用户账号 + */ + private String userAccount; + +} diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseConflictsResolveService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseConflictsResolveService.java new file mode 100644 index 0000000000..85cb47c7b9 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/BaseConflictsResolveService.java @@ -0,0 +1,31 @@ +/** + * 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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.entity.BaseConflictsResolveEntity; + +/** + * 事件中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +public interface BaseConflictsResolveService extends BaseService { + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExUserService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExUserService.java new file mode 100644 index 0000000000..9c76d86500 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/ExUserService.java @@ -0,0 +1,31 @@ +/** + * 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.opendata.service; + +import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.opendata.entity.ExUserEntity; + +/** + * 系统用户中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +public interface ExUserService extends BaseService { + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseConflictsResolveServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseConflictsResolveServiceImpl.java new file mode 100644 index 0000000000..270cbb365f --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseConflictsResolveServiceImpl.java @@ -0,0 +1,36 @@ +/** + * 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.opendata.service.impl; + +import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.opendata.dao.BaseConflictsResolveDao; +import com.epmet.opendata.entity.BaseConflictsResolveEntity; +import com.epmet.opendata.service.BaseConflictsResolveService; +import org.springframework.stereotype.Service; + +/** + * 事件中间表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-22 + */ +@Service +public class BaseConflictsResolveServiceImpl extends BaseServiceImpl implements BaseConflictsResolveService { + + +} \ No newline at end of file diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExUserServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExUserServiceImpl.java new file mode 100644 index 0000000000..4badca6794 --- /dev/null +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/ExUserServiceImpl.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.opendata.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.opendata.dao.ExUserDao; +import com.epmet.opendata.dto.ExUserDTO; +import com.epmet.opendata.entity.ExUserEntity; +import com.epmet.opendata.service.ExUserService; +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-22 + */ +@Service +public class ExUserServiceImpl extends BaseServiceImpl implements ExUserService { + + +} \ No newline at end of file From d1d3b09fbdd3b94989e9ab012814f1847f9dab59 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 22 Oct 2021 10:52:37 +0800 Subject: [PATCH 070/177] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0projectCreator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java index 66e3943591..d4a767f525 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java @@ -132,4 +132,8 @@ public class ScreenProjectDataInfoFormDTO implements Serializable { * 满意度得分 */ private BigDecimal satisfactionScore; + /** + * 项目创建人 + */ + private String projectCreator; } From e03b7adea754852ee33583e59c0d58e79a33d5e1 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Mon, 25 Oct 2021 14:58:21 +0800 Subject: [PATCH 071/177] =?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 072/177] =?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 073/177] 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 074/177] =?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 075/177] 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 076/177] =?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 077/177] =?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 078/177] =?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 079/177] =?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 080/177] =?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 081/177] =?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 082/177] =?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 083/177] =?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 084/177] 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 085/177] 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 087/177] =?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 088/177] =?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 089/177] =?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 090/177] =?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 091/177] =?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 092/177] =?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 093/177] =?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 094/177] 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 095/177] =?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 096/177] =?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 097/177] 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 098/177] =?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 099/177] =?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 100/177] =?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 101/177] =?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 102/177] =?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 103/177] =?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 104/177] =?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 105/177] =?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 106/177] 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 107/177] =?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 108/177] =?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 109/177] =?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 110/177] =?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 111/177] =?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 112/177] =?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 113/177] 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 2d11c3b0d17a84d9f3296a37ddd03c723eb76d11 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 28 Oct 2021 10:35:50 +0800 Subject: [PATCH 114/177] =?UTF-8?q?=E7=BC=96=E8=AF=91=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opendata/service/impl/BaseGridInfoServiceImpl.java | 7 +++++-- .../opendata/service/impl/BaseGridUserServiceImpl.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java index 7802dfc707..8c7fd0d5c8 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridInfoServiceImpl.java @@ -20,6 +20,7 @@ package com.epmet.opendata.service.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.org.result.CustomerAgencyDTO; import com.epmet.dto.org.result.CustomerGridDTO; @@ -58,7 +59,8 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl> result = dataStatisticalOpenFeignClient.getAgencyBaseInfo(formDTO); + com.epmet.dto.org.form.GridBaseInfoFormDTO formDTO1 = ConvertUtils.sourceToTarget(formDTO, com.epmet.dto.org.form.GridBaseInfoFormDTO.class); + Result> result = dataStatisticalOpenFeignClient.getAgencyBaseInfo(formDTO1); if (!result.success()) { throw new RenException(result.getInternalMsg()); } @@ -110,7 +112,8 @@ public class BaseGridInfoServiceImpl extends BaseServiceImpl> result = dataStatisticalOpenFeignClient.getGridBaseInfo(formDTO); + com.epmet.dto.org.form.GridBaseInfoFormDTO formDTO1 = ConvertUtils.sourceToTarget(formDTO, com.epmet.dto.org.form.GridBaseInfoFormDTO.class); + Result> result = dataStatisticalOpenFeignClient.getGridBaseInfo(formDTO1); if (!result.success()) { throw new RenException(result.getInternalMsg()); } diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java index c323a8e2c4..6a8902a38b 100644 --- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java +++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/BaseGridUserServiceImpl.java @@ -56,7 +56,8 @@ public class BaseGridUserServiceImpl extends BaseServiceImpl> result = dataStatisticalOpenFeignClient.getStaffBaseInfo(formDTO); + com.epmet.dto.user.form.StaffBaseInfoFormDTO formDTO1 = ConvertUtils.sourceToTarget(formDTO, com.epmet.dto.user.form.StaffBaseInfoFormDTO.class); + Result> result = dataStatisticalOpenFeignClient.getStaffBaseInfo(formDTO1); if (!result.success()) { throw new RenException(result.getInternalMsg()); } 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 115/177] 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 116/177] =?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 117/177] 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 118/177] =?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 119/177] =?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 120/177] =?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 121/177] =?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 123/177] =?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 127/177] =?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 128/177] =?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 129/177] =?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 130/177] =?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 131/177] =?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 132/177] =?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 133/177] 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 134/177] =?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 135/177] =?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 136/177] =?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 137/177] =?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 138/177] =?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 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 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 139/177] =?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 140/177] =?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 141/177] =?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 142/177] =?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 143/177] =?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 144/177] =?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 145/177] =?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 146/177] =?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 147/177] =?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 148/177] =?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 149/177] =?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 150/177] =?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 zcmZ8k1yCEx7EN%1Tal*4y+EMQQe27`iff@r2~sE&w~`Vh5UeCPEfTc2I~3>P5WHyd zJgmsW3%~FGng8bho!Ol;bMM}n-MMq_IVU#Lww2dJgp=eUo0}+NKA1Kb?=7d23Ynw& zf?=7(H7zM~KQ&qZs0(pX@$I=K;;NWqRM(rc*i(AspnM@QloM> zQ8+5RER(nZ8?#XWvmQ?7i0rDQOAOPhRa8Hr9Cj$ zSiv))Z7UMYDz3(hEWVYvrp)!C)e$tUT)vnV}8ry&+Jog9G<5P2c5#;+p8|= zIeU>~Y}d4-_0@&5lwLwOJF>mCv3vH+mRstFoI6ClP14F1-}k@_Qt^Yyxi69;$CBuhS;&!+UWQ?xFvP8HAnfN z&8F=Y_^jkEzeYo-8EPm&N_ZfNvwV>m zd;nmY6#bH#873<1=jxJ|Xz7*#p^rG^-Ir%uA%tu#|%)Nx}~J1OWHhazvkfEp@Ho6KlmAfW0U(cXTf>G#86*2zZcYj4v33 zD$V7Jn^YH@_=L|snF29115r{TeQ8+&KROnrsr)LSEyFpXUc=EZ+?suQl3Zx2XzMBi zsklQn<|mu=(#xD*oyX}gQTeb`5ZtY|$FRzma1qW97GWdQ<0#X|QsiR`Xx8y@LBAMn zcDS%VVUHGpnYshssGX4xO`Xc4q)M-kP5W3gUgYN+Wc)W8)j!iOrcOP-4FnmJ$k;R# zD=4R-eZ>P`sEcR$-v!ZCN{C#A*q3lmbqHBgXu`8J2e=(19(_@huWtLZRI6)%N%ml| zMc;WnA``;d2k+Z%fyY=Jkss!idmjHFdi{~r3Wn!X6)aBTH-FgssC7jim;DjtUH7ZB zKAvqRskaLaQB3uHVZ6uM;a&@wq5MkhX~apmpa41-#t_br_LuRwB%!$|`WtlOmZY`T z@C6}0?BEQ7*2l&JhX}Q=22$BSAIXB&X;k`Qxwi>%h1-*&XPRq2SstJ{N$e^(DZVZw z!tShSxBRr30_oc{4FU+3+O6n<1=@IGDi#WzV5hi?gIW_wDHrrf&iN24006kV`}Yxp zU801u(RUn~*lYup^oPKeM!{`FoDJorQ8fYA?oX2N8J9#aDC+M*G6EMU!&wqHeyytn z0Ldf$i$~{-GJ*az&v7?r{N}j}uy@qd`=%h&?m#B*BWtRjhfFQfgOQVZ9>uV=HL@*a ziO5+wUl2_ThP)Nkn0HJ{TPLD_9@oc+P|;m*i*k&Wh`img8@&HM!An>4T{nch#+d3kIj9gDk>y1I0JO27 z^X_xOs>p{FTdjaV{p^l+AFZ6Cs-yDNLorW1kjnu>Ra6reV@;>7EZOlB?ELe`x4lPa zSS7Mj75$By;Kz9ple69fpQSkj1^nPQWK_?>95@PtlCsaA;;dsnYuaSm@knZn#~JSY zwRe43kn~;DqmAeJGX=N_skvZXTI0KFDSO;+xCfkI<>^v$S6y?r_HjC=4B z*x*197eU_HeAYIIKU>?WcL7X*@$?o{NLZV~~u%++?%& zEY&wmDZ3@`<>1_Mv$Cr?Q>r#F0;!$}Q|fp6{DtWv^cTw5X><9cxsF49KEn6n8C&!f1pO~K3oR!sNt+0_=I?j#F&KK@zwhT@VM7;O9XICiP zt_XKC8b+K>jr;zDcKdkZi)CP7I^!1v!9Wknh@g&_#HCwj6&}RNQeF?=ugki6%LP}J zck?#NPSySJNiHX{_*g($6wlU%$jtRkAoy^3b9uM|+i&!3$|v_gNg#CyuNf2`S5N`P zh(0TQTY8=RE0pHZl7;a3uNwnNu~(~ypPCL^L>uTfaMZ3Z;P5Q^?&m5ogktgQsd&(hrd&hXO^iU6b>g z>DgHoTNP`)Ml9rg%Rw?E2ribMi6GI)uAxiYgg&cP%Uf*ITfa_w?a(Hc5O@x&jsVd) zO|@P<&FvK=Ia{Y6=>`gA^D#M-Wb$|8Sh=64JjNQvDf2K!t=sXFYH%e}_(=(0tW>p{ z!?LVUahz{+V04$Id_$7M=m#PA)rfkQF`PSh!&-$C-tp-sS^eS0DhpQ z*dD-!G`kh(m&k6FnHJN(3L_K6E$KCv=o!!O3kJlQ)uC&{+Et103x)i9-V?4k)x~~ARs`&M8VBapV^?-%yeoqMQxz1g$z`Gv)9SiX zPNZ^|q!^gSbG%*UP0we`p4uz2xn$dVLZ2(Yq~X4y%YBbvH=9bK)~?ycidnDfxeXM~ z^Y}Eal|1EevaG2=MT&WE3-yDqsYOH0LU~{>fH++)Xip)qE%b>{I2R~&l=Q_K&Jfl@ zL5p=s`eW7x&vP_y;vQJX@&QmR`#vtLsR(rINfS1kNmjs{mhn2=VCzzdeOKuw)LanS zSuApSjtAs&^dO3r98NJPFeD56beU(&Ao4X*@(R-2jU1#@sh4wv>M~YgzGttD)wrf7 zy?>U$yWR=at4k2>U74!7RoQm~0MKI8bm$rOU!co3dJfRvqXLfzy~F{AX~$y~nEDTS zf)UVzd_qk#5_^2Ugr2?5X)1_C0i^1S6Ewmya=xdLMPgS~cF()!Va&r6bW|xT@lU&p zT6;4-S@F>vk(bhUD<@L1zuvFD?SHO5m==m8q;m>uYJEB1p(v8+`TUC4d64Yu=soRnMBQGVUvvD;i9xO{@#TJnOs~eKFBreQkPE zTHFfN?Ib_0-UeTj23{LR$Yp|EQVEX0Qvx$tiJuA@yV`^LUQ!}%2n60@p!o6hhx)H+ za$IlIaVkPbU60^`Rm4B3%M9L#qrdw$%7ap;Udh=GDh2`~139Wz5T?tqRjH2U)Cqg$ z9~jox)^{&You385T0XZSOsl%$`>d$+jkJ&KD0|2@N4rD%v@mm9H~nd1D~SA@&Q9!nbEE36-IG8xgycd-a)FnYUd zTsS#lQKzp_VeC?)U-P}-ug1EAPL*LZ9fy;WlQO^IM>^cTwlYax%fiCjhokpW7BmDM z6!#XXr76m;dWH;fuC#@RebNZYCqZxx`#^A#_#xbaHEBl>b(P&;ikIc6NLz>DFXRG7l^72~YHkfMnw}SXHjH?(0 zY#b>%r|vw$X0L~Z-WL|SIS5f20!7Z?M9-$0!|FRK9bVu zNxcg|-*eh>EW!xlxpCy0WFnlEgGRgifOGrh~=irN=)Vfd00~dsL%%`li z{>u@|$Ih>I0!;99Gc`NI2oD4^U>{mPw1100uUXYCTMvB6Lf9LNkbO$IUgWn*)-!X_ zzp)_ifquM4CI(6{mG02vWc80WQULk&-%| zicK9SWUl$~X+kgFk6=UlVA3rChX3~`*9`Ht68^{Pqho~h@$N{`t3r>!|9Bz*fa$lw z{bwnXqwi=L(6YiJc-qwehM~XVCGBs>f*utX02ZJxg?aA(BOn0)ihpkZMi{h|2pjmn zJpbEx(f?0ekqs@+b`KpRA^E`A>|PGT2&uNm zr1DC{4P;x2uAfxJhsN`IR`<%ih!kCqcMCxL{8iSL?sol!-zp${81y+=++k?!N(pe1 zv$lv*imnXoVfQYpK!&{=hyEgd9eAR)up10?qTFVFbi_fAx0F-s$v^_xooEZidT7=+ z^D>)MC3~$G!4>BB{$a7g0_2_Za3wr!iop01eL?mD|4X6Jfc(nHhfEg{OzP8l)Wvmg zz*^XGKYJO#3@KeD@%A1;0Iu79e2dmwJ>iz-)WE!bzuwV&U-{G{^bw<71lhhGP;}2- zC5vXmhdlR|H+C8LuL*yML~{dL4CGMCI%-hO=D4TY}imqh->g zJ^w26Am1-Q=B8N<4_NT7bOrT<%&R!Tn@Etyx(=9%a+dbcq=w-v9PwF1hjgk-MjDuu ziZOFggM>xp3pSO}9)2aJw^Wzm4HG5$1}=Jvtdb`#4>`sgqx&WNuQe6OD@eXp@enLN zv?Eo~;qK)X>*F84*2w)jfmAipX%H%t9%1|0s|P7JYZAehXwUR~k2&Vw=;;z&aPM5G zd|1L=`|6w4(i1Jk>VlNEcIk!X>$8etlBAE(;x=x>I8fm?wB7M6)JR6#{v=VEm$BIk z#`9#hKR14N-gZvwCdLQG{rrNC`b~&@dZWUrts#e!D#Ydcz#*SERDZFDy`K?Q@cZ}j z%<07Nw5`Xd556jLO(V2RUn}dvP(qko>cB|m$PlGDFSljkegnqO+h-OJR<`ED-g@Au zmIdOTT02S9TMV!SbhxxQz#@7YIzhs_ai(*H5%&?wg);9#Ngt?wa!lh575tDML&jrL z)$;kl>aiXK`?-)<^5G6|aA(ue&N!v37-Rs1EzNghF&SrQZqPnJ@caT|_66DM7{F?j zVAjR%FKtu+!1*N%gq0ifQU-`F!je*EeO-=yZhHrWv~et)DLUMIvASNs z;$W3oV|p)bl#1)DI_TV~)hxsv4A4(A#$h=oC*yaaw&5tE*>z-4h9p`V*WDJfoO_?D z|Nd30GZW^nR#agjpWw)p9I}9pF*V^Piv&p(h8-w;W)?R?59_OH*Dd~d7x7JRGR`v5 zbXuM6t;Ua)U^DT-Ns%=I)72ylf#@CGw$EHlcm~l0zt1$mAEj+Q$&npTzVJT^ zo?H4ONYG)hSmGY)ju!!ua4>p*J3ZgXG51f*RvMu>7AZ?NMU5awoClAewSuN`b%+`dLL^HgFbQJ%!%Q6its*)zcO-S|70+hgp4=zy zCu7a#ZksZQH`?J8cQYze z=T_S);nQp!R7Nc>2{AqxEGkx8j#rz@A#`ax0xyvsDVg4ZNQ6gvEX?HhdZdqv9TT7E z$Q>_gv3OfX)#xuxWA})bB5hATK1Wom+sj(B&0JR5RTUWLhGR%!xh$qu}@e}Fa@?clOPJ{>mnl6=l?sH|m z5iM5b0ls7`(QS;8vXH9(jvwM{e>AY`&TLHJLv1r|UnM=mBO{v{yVgc~$a!Ix(7tAj z=0+k<;s7TDM~|j4r?dFVvlFr!D@U3KcvbbaRT0z|47T@W1lzYq3YPP+NSW-W*(Er| zR#*>YuAddR0_tp-kn~^&3xi1yY5*XM3)2L>f_CT5iV7l7QWo8b2n@G%jjxS=s}ogt z(=TB@q`!t~#CiyS=*c6Hnl32*^~Xi`{_$uB-L$Co%CBeF*qnQ+HZl~SXqY4Ss82aB z`&}B+Fg#UI-Cc9_j?2@tFK`fr>kelj*C$qb_=%Y_3VwA$8j7DHEkO6h8!qF$GAniB z-=XPhM0pF?)Uqtwkuq~`(x5Mrgff)ZVldUmF063BJ<_R1PQ0dNt|AmCHf1>ibVPbG z$gW_&t`BC=#dFdlD}OUP8*Ve97RPJZAC)q#U}2a-mY60$>w7V9PI~MH(QE6Q#}Ekq zlGvAOBMYx4WL@}a@0g+w>}yLItsr zw{nvF6JA6*6sM2vtnWn6P&!^gtGWRl0nEH|}SQpZHmNG}+kW z>7GRW!ZErA>NzXh{l#19bfaS_S3!CL>VrU9=NoM^Kb@zqOx;2$5R+trb>T%q=?P9s zp4YNjT!&3L7w6vJk|YSjm2|7kI2T^GpYW`y2fO`L4k9>_$|!KsCfaDrr_n6{#ZYaP zv=UZx{d0@AQ9AibsnPod4NaHZrYA30M=#IJ=qUG@M@io?qaCMBn^zqgDba~kL7yG2 z4lO7zJ@62V%0cB9>bHB*?hR~)McPmr+Rqor(pfJclKp15E%Zi7YmEv_*C@J^EFQ3w zu`dNXW2VKlf}iL%bl}lJ3s$u?%OAWpQK6M)Lm8ZnLOD^BYkPb3j&$DGVMy3F7-FMK zUe+i%<$Sr57thgWXl=4kdH2+%&UGvY(ZwK5wJ1$d%s!B7Xt@d(~cUQRnP+ z%pN`K;mY|YJ|}5t0`=ssQm2N}NfpO-^RK_zI|IPtfAE=2*~7Dq2W!4(oH`W&Yb>H(Ei8rJlcS0wIBZ zCF|m&{M1_24D>8Nxd?Q26cWNc^nUEs&BNkO+v%$&vMI%NwrsX{o$Fx7l)D=r4Ovft z(x|b6=Z0zgHYpM`$xdInNMh)^5|PqtH5<7pOr>)Z2u7Ou&EAs`*M)=7B>+=sr|RvE zx9R)?G)sp{dT&y8M&c`-hK|BW^^>2qg*Em41yzvf`L}9mc4tWtFDU2cEtd=mjvd5lKm{X#8#&9%fR@t;v8pwMlN}2R3H#<6}LT{e{F~}kUC5>lgcZ9f@ zILGBv!Qq*!w z{L6*&>8d#ruBKP%im6F^*vcdy3UWCPvg*K(2vsVbQ_mXBPW8D0-yg{ns~>9%Eh*Vo z)sV^_%tWV(-tQ^!d}pV|WgZA&Wqhb6$UV6y(eoieq+R&BphjJ<7u>MNDccV#9wb#N z)KUFZCD}c~PJZ$*Tnjm5CXK531Wm!GiAwSh7G1{-LicgAEY7erwRqzx)d3EB9je;Q zH>6q-#UdwHueUkmvI#3!Roeh+cZQtN+?*x4t7z}*K|48L${1d~og4hR<^_Iw<=1H~ylsB5z8_v(SnitxH1yjSKmDnE z`n2hnZ%w;vrtkes#md5$yHkk=Od@$s+$9fiV=`xo2z^6a*)KN+VV?!^Kc^W&{7%bt zd_G^A`yB1%i=Y23!D6FcJtbka8c3-64&j#hVZ8FTj`l=wHrc0z1}TxBNlyONL6n#qrPH<#J;;b_A^x3}>6C47Za5A6yNrN{0L}`voW9-L;c5 zT_1}8R&i_wmW!?Rr&B$o@8|AtZk5s-P^rd)v1;=zJY_JxFMmxF!tR#2wD3sa166=! znn_$&6UF1t>bn~uH&lc5)&+`P4Mw@SYwJ{mSIUCVOWWe7*$;2Dw{>BO*sg!Nla4Jz zzMRE&@d}gLH`3H(qb*Z|3z-hj6y#I>G|L^J+!Y~VSV2Wgzp?~+p=8x1n{81aoe~psBRLH4N60Tyl 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 151/177] 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 152/177] =?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 153/177] =?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 154/177] =?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 155/177] =?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 156/177] =?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 157/177] =?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 158/177] =?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 159/177] =?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 160/177] =?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 161/177] 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 162/177] 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 163/177] =?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 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 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 164/177] =?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 165/177] =?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 166/177] =?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 167/177] =?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 168/177] =?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 169/177] =?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 170/177] =?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 171/177] =?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 172/177] =?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 173/177] =?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 174/177] =?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 175/177] =?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 176/177] =?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 177/177] =?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)) {