Pārlūkot izejas kodu

getaway增加webflux非阻塞接口 许昌800户表数据采集开发以及查询接口迁移完毕

1037015548@qq.com 1 gadu atpakaļ
vecāks
revīzija
6e105b2170
37 mainītis faili ar 4412 papildinājumiem un 36 dzēšanām
  1. 32 0
      dc3-gateway/pom.xml
  2. 2 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/GatewayApplication.java
  3. 30 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/JPBean/JPKprXuChangWaterSS.java
  4. 52 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/SpringContextUtil.java
  5. 40 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/bizmgr/KprXuChangWaterBizFun.java
  6. 187 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/CommTool.java
  7. 137 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/HttpTool.java
  8. 114 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/ResponseCode.java
  9. 59 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/ScheduleTaskMgr.java
  10. 500 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/TimeTool.java
  11. 446 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/XuchangWaterConfig.java
  12. 177 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/config/GlobalData.java
  13. 107 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/config/MainSourceConfiguration.java
  14. 94 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/control/KprXuChangWaterController.java
  15. 0 34
      dc3-gateway/src/main/java/io/github/pnoker/gateway/control/TestController.java
  16. 46 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/DBMgrProxy.java
  17. 96 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangCustomerMeterDayReadMapper.java
  18. 87 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangCustomerWaterConfigMapper.java
  19. 94 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangCustomerWaterInfoMapper.java
  20. 40 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangDayReadNewMapper.java
  21. 1076 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/BaseSqlProvider.java
  22. 60 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/XuChangCustomerMeterDayReadProvider.java
  23. 60 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/XuChangCustomerWaterConfigProvider.java
  24. 60 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/XuChangCustomerWaterInfoProvider.java
  25. 216 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/XuChangCustomerMeterDayReadServiceImpl.java
  26. 178 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/XuChangCustomerWaterConfigServiceImpl.java
  27. 202 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/XuChangCustomerWaterInfoServiceImpl.java
  28. 29 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/BaseDBService.java
  29. 33 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/XuChangCustomerMeterDayReadService.java
  30. 27 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/XuChangCustomerWaterConfigService.java
  31. 30 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/XuChangCustomerWaterInfoService.java
  32. 19 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/tables/XuChangCustomerMeterDayReadTable.java
  33. 27 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/tables/XuChangCustomerWaterConfigTable.java
  34. 27 0
      dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/tables/XuChangCustomerWaterInfoTable.java
  35. 2 0
      dc3-gateway/src/main/resources/application-dev.yml
  36. 22 1
      dc3-gateway/src/main/resources/application.yml
  37. 4 1
      dc3/docker-compose-dev.yml

+ 32 - 0
dc3-gateway/pom.xml

@@ -132,6 +132,38 @@
             <artifactId>dc3-common-model</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+
+        <!--重连-->
+        <dependency>
+            <groupId>org.springframework.retry</groupId>
+            <artifactId>spring-retry</artifactId>
+        </dependency>
+
+        <!-- 数据库 -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.2.5</version>
+            <!--<scope>runtime</scope>-->
+        </dependency>
+
+        <dependency>
+            <groupId>net.postgis</groupId>
+            <artifactId>postgis-jdbc</artifactId>
+            <version>2.5.0</version>
+        </dependency>
+
     </dependencies>
 
     <repositories>

+ 2 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/GatewayApplication.java

@@ -19,6 +19,7 @@ package io.github.pnoker.gateway;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.retry.annotation.EnableRetry;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
@@ -30,6 +31,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 @SpringBootApplication
 @EnableDiscoveryClient
 @EnableTransactionManagement
+@EnableRetry
 public class GatewayApplication {
 
     public static void main(String[] args) {

+ 30 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/JPBean/JPKprXuChangWaterSS.java

@@ -0,0 +1,30 @@
+package io.github.pnoker.gateway.JPBean;
+
+import io.github.pnoker.gateway.comtool.TimeTool;
+import lombok.Data;
+import org.springframework.util.StringUtils;
+
+/**
+ * @ClassName JPKprXuChangWaterSS
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/3
+ * @Version V1.0
+ **/
+@Data
+public class JPKprXuChangWaterSS {
+    private String freezeDate;
+
+    public boolean checkValid(){
+        if(StringUtils.isEmpty(freezeDate)){
+            return false;
+        }
+        try{
+            TimeTool.convertDateStr2UTC(freezeDate);
+        }catch (Exception ex){
+            //TODO 说明格式不对
+            return false;
+        }
+        return true;
+    }
+}

+ 52 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/SpringContextUtil.java

@@ -0,0 +1,52 @@
+package io.github.pnoker.gateway;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+//@Lazy(false) //true为懒加载,在第一次被引用的时候才会创建;false为Spring容器在启动时会立即创建
+//若要明确指定为懒加载,则必须使用@Lazy(true),否则bean对象默认取值lazy-init="false"即@Lazy(false)
+public class SpringContextUtil implements ApplicationContextAware {
+    //Spring应用上下文环境
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtil.applicationContext = applicationContext;
+    }
+
+    public static ApplicationContext getApplicationContext(){
+        return applicationContext;
+    }
+
+    public static boolean containsBean(String beanName){
+        return applicationContext.containsBean(beanName);
+    }
+
+    public static boolean isSingleton(String beanName) throws NoSuchBeanDefinitionException {
+        return applicationContext.isSingleton(beanName);
+    }
+
+    public static Class getType(String beanName) throws NoSuchBeanDefinitionException {
+        return applicationContext.getType(beanName);
+    }
+
+    public static String[] getAliases(String beanName) throws NoSuchBeanDefinitionException {
+        return applicationContext.getAliases(beanName);
+    }
+
+    public static Object getBean(String beanName) throws BeansException {
+        return applicationContext.getBean(beanName);
+    }
+
+    public static <T> T getBean(Class<T> className) throws BeansException {
+        return applicationContext.getBean(className);
+    }
+
+    public static <T> T getBean(String beanName, Class<T> className) throws BeansException {
+        return applicationContext.getBean(beanName, className);
+    }
+}

+ 40 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/bizmgr/KprXuChangWaterBizFun.java

@@ -0,0 +1,40 @@
+package io.github.pnoker.gateway.bizmgr;
+
+
+import io.github.pnoker.gateway.JPBean.JPKprXuChangWaterSS;
+import io.github.pnoker.gateway.dbdao.DBMgrProxy;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerMeterDayReadService;
+
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName KprXuChangWaterBizFun
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/3
+ * @Version V1.0
+ **/
+public class KprXuChangWaterBizFun {
+    private final static String mStrClassName = "KprAuditDashBoardFun";
+    private final static String EMPTY_NULL = "NULL";
+
+    public static XuChangCustomerMeterDayReadService getXuChangCustomerMeterDayReadService(){
+        return DBMgrProxy.getInstance().applyXuChangCustomerMeterDayReadApi();
+    }
+
+    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    public static List<Map<String,Object>> dataCenterTogether(JPKprXuChangWaterSS oJsonParam){
+        List<Map<String,Object>> oRes = new ArrayList<>();
+        try{
+            oRes = getXuChangCustomerMeterDayReadService().selectXuChangDayReadList(oJsonParam.getFreezeDate());
+        }catch(Exception ex){
+            oRes = null;
+            return oRes;
+        }
+        return oRes;
+    }
+}

+ 187 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/CommTool.java

@@ -0,0 +1,187 @@
+package io.github.pnoker.gateway.comtool;
+
+import org.springframework.util.StringUtils;
+
+import java.security.MessageDigest;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommTool {
+    public static final char[] HEX_DIGITS;
+    static {
+        HEX_DIGITS = "0123456789ABCDEF".toCharArray();
+    }
+
+    public static String getPlatformByAgent(String strClientType, String strUserAgent){
+        return getPlatformByAgent(!StringUtils.isEmpty(strClientType)?strClientType:strUserAgent);
+    }
+
+    public static String getPlatformByAgent(String strUserAgent){
+        String type = "_";
+        if (StringUtils.isEmpty(strUserAgent))
+            return type;
+
+        if(strUserAgent.contains("Android") || strUserAgent.contains("Linux")) {
+            type = "apk";
+        } else if (strUserAgent.contains("iPhone") || strUserAgent.contains("iPod") || strUserAgent.contains("iPad")){
+            type = "ios";
+        } else if (strUserAgent.indexOf("micromessenger") > -1){
+            type = "wx";
+        } else if (strUserAgent.indexOf("Windows") > -1){
+            type = "pc";
+        }else if (strUserAgent.contains("tri.")){
+            type = strUserAgent;
+        }
+        return type;
+    }
+
+    public static boolean isMobilePlatform(String platform){
+        return ("apk".equals(platform) || "ios".equals(platform) || "wx".equals(platform));
+    }
+
+    public static boolean isTheThisFormatMatch(final String strFormatFilter, String strDesData){
+        if (!StringUtils.isEmpty(strFormatFilter) && !StringUtils.isEmpty(strDesData)) {
+            //正则表达式的模式
+            Pattern p = Pattern.compile(strFormatFilter);
+            //正则表达式的匹配器
+            Matcher m = p.matcher(strDesData);
+            //进行正则匹配
+            return m.matches();
+        }
+        return false;
+    }
+
+    public static int listSize(List<? extends Object> listSrc){
+        return (listSrc==null)?0:listSrc.size();
+    }
+
+    public static int collectionSize(Collection<? extends Object> cc){
+        return (cc==null)?0:cc.size();
+    }
+
+    public static int mapSize(Map<? extends Object, ? extends Object> mapSrc){
+        return (mapSrc==null)?0:mapSrc.size();
+    }
+
+    public static int lenString(String strSrc) {
+        if (StringUtils.isEmpty(strSrc))
+            return 0;
+        return strSrc.length();
+    }
+
+    public static boolean strBetweenLen(String strSrc, int nMinLen, int nMaxLen){
+        if (strSrc == null || nMinLen > nMaxLen)
+            return false;
+        return strSrc.length() >= nMinLen && strSrc.length() <= nMaxLen;
+    }
+
+    /**
+     * 从订单id中提取订单的创建时间,并以yyyyMMddHHmmss时间格式返回
+     * @param strOrderId
+     * @return
+     */
+    public static String getOrderTmStrFromOrderID(String strOrderId){
+        try {
+            String time = "";
+            int nStartIndex = 3; //所有工单的标识为前三个字符标识
+            time = strOrderId.substring(nStartIndex, nStartIndex+TimeTool.TIMESTAMP_FORMAT_EX2.length());
+            return time.trim();
+        }catch (Exception e){}
+        return "";
+    }
+
+    public static String list2QueryIn(List<? extends Object> listSrc){
+        StringBuilder str = new StringBuilder("");
+        if (listSrc != null && listSrc.size() > 0){
+            str.append("(");
+            int nStart = 0;
+            for (Object item:listSrc){
+                if (nStart++ > 0)
+                    str.append(",");
+                if (item instanceof String){
+                    str.append("'"+item+"'");
+                }else{
+                    str.append(item);
+                }
+            }
+            str.append(")");
+        }
+        return str.toString();
+    }
+
+    public static int totalCharCountsInStr(String srcStr, char chDes){
+        int nums = 0;
+        if (StringUtils.isEmpty(srcStr))
+            return nums;
+
+        char[] arr = srcStr.toCharArray();
+        for (char ch:arr){
+            if (ch == chDes)
+                nums++;
+        }
+        return nums;
+    }
+
+
+    public static String escapeInHex(final String src) {
+        StringBuilder tmp = new StringBuilder("");
+        if (StringUtils.isEmpty(src))
+            return tmp.toString();
+
+        int i;
+        char j;
+        tmp.ensureCapacity(src.length() * 6);
+        for (i = 0; i < src.length(); i++) {
+            j = src.charAt(i);
+            if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
+                tmp.append(j);
+            else if (j < 256) {
+                tmp.append(j);
+                /*tmp.append("%");
+                if (j < 16)
+                    tmp.append("0");
+                tmp.append(Integer.toString(j, 16));
+                */
+            } else {
+                //tmp.append("%u");
+                //tmp.append(Integer.toString(j, 16));
+                tmp.append("&#x");
+                tmp.append(Integer.toString(j, 16));
+                tmp.append(";");
+            }
+        }
+        return tmp.toString();
+    }
+
+    private static final String PHONE_MATCH_FILTER = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";
+    public static String adjustMobilePhone(String phone){
+        if (!StringUtils.isEmpty(phone)
+                && phone.length() == 11
+                && isTheThisFormatMatch(PHONE_MATCH_FILTER, phone)){
+            return phone;
+        }
+        return "";
+    }
+
+    private static String exchangeMD5(String md5){
+        StringBuilder res = new StringBuilder("");
+        int len = md5.length()/2;
+        for (int i=0; i<len; i++){
+            int index = i*2;
+            res.append(Integer.toHexString((Integer.parseInt(String.valueOf(md5.charAt(index+1)), 16)<<4 | Integer.parseInt(String.valueOf(md5.charAt(index)), 16)) % 16).toUpperCase());
+        }
+        //for (int i = 0,j = md5.length()-1; i<=j; i++,j--){
+        //    res.append(Integer.toHexString(((0x0F & md5.charAt(i)) ^ (0x0F & md5.charAt(j)))).toUpperCase());
+        //}
+        return res.toString();
+    }
+
+
+    public static List safeList(List<? extends Object> listSrc){
+        if (listSrc == null)
+            return new ArrayList();
+        else
+            return listSrc;
+    }
+}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 137 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/HttpTool.java


+ 114 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/ResponseCode.java

@@ -0,0 +1,114 @@
+package io.github.pnoker.gateway.comtool;
+
+/**
+ * RESULT_开头的为响应体中的结果码rescode
+ * STATUS_开头的为HTTP Status响应码
+ */
+public enum ResponseCode {
+    RESULT_NORMAL(0, "Normal result."),
+    RESULT_BAD(1, "Bad result,see the message/data for reason."),
+
+    STATUS_SUCCESS(200, "Success"),
+    STATUS_BAD_REQUEST(600, "Bad Request,see the message/data for reason."),
+    STATUS_ACCESS_DENY(603, "Access denied."),
+    STATUS_NOT_FOUND_URI(604, "No mapping found for HTTP request with URI."),
+    STATUS_METHOD_NOT_ALLOWED(605, "Method Not Allowed."),
+    STATUS_HTTP_TYPE_NOT_ACCEPTABLE(606, "Http media type not acceptable."),
+    STATUS_HTTP_TYPE_NOT_SUPPORTED(615, "Http media type not supported."),
+    STATUS_INTERNAL_SERVER_ERROR(700, "Internal Server Error."),
+    STATUS_SERVER_RUN_ERROR(1000,"The server is abnormal."),
+    STATUS_NULL_POINT_EXCEPTION(1001, "Empty param or param is null."),
+    STATUS_ERROR_DATA_TYPE(1002, "The data type is wrong."),
+    STATUS_IO_EXCEPTION(1003, "IO exception."),
+    STATUS_NO_SUCH_METHOD(1004, "No such method."),
+    STATUS_INDEX_OUT_OF_BOUNDS(1005, "Index out of bounds."),
+    STATUS_ERROR_JSON_FORMAT(1006, "Error JSON data format."),
+    STATUS_NOT_POST_REQUEST(1007, "Not post request."),
+    STATUS_NOT_DELETE_REQUEST(1008, "Not delete request."),
+    STATUS_ERROR_PARAM_FORMAT(1009, "Error parameter format."),
+    STATUS_INVALID_CONTENT_TYPE(1010, "Error Content-Type."),
+    STATUS_NOT_MATCHED_URI(1011, "No mapping found for HTTP request with URI."),
+    STATUS_ERROR_REQUEST_METHOD(1012, "Error request method."),
+    STATUS_NO_USER_ACCOUNT(1013, "No such user or has not login."),
+    STATUS_SERVER_NET_DISCONN_OR_BUSY(1014, "The network of server is down or busy. Please try again later."),
+    STATUS_MAX_CONCURRENT_REQUEST_COUNT(1015, "Exceeded the maximum number of concurrent requests. Please try again later."),
+    STATUS_INVALID_HEADER(1016, "Invalid headers, please check the headers of request."),
+    STATUS_INVALID_SIGN(1017, "Illegal signature, please check and request again."),
+
+    STATUS_EMPTY_TOKEN(2000,"Empty token."),
+    STATUS_INVALID_TOKEN(2001, "Invalidate Token, please re-login."),
+    STATUS_EXPIRED_TOKEN(2002, "Expired Token, please re-login."),
+    STATUS_NOT_LOGGED_IN(2003, "Not logged in."),
+    STATUS_DENY_OPERATE_USER(2004, "No permission to operate."),
+    STATUS_TOO_OLD_TOKEN(2005, "The token is too old, please use your new token."),
+    STATUS_INVALID_OLD_PWD(2006, "The original password is wrong."),
+
+    RESULT_ERROR_SIGN(3000, "Illegal signature"),
+    RESULT_REPEAT_SEQUENCE(3001, "Repeat the request, please check the request sequence number."),
+    RESULT_REQUEST_TIMEOUT(3002, "Request timed out."),
+    RESULT_REQUEST_TOO_BUSY(3003, "Request too busy, please try again later."),
+    RESULT_REPEAT_RECORDS(3004, "Repeat the records, please check the request."),
+    RESULT_REFERENCE_NOT_EXIST(3006, "Reference the not exist, please check the request."),
+
+    RESULT_INVALID_ORDER(4000, "The order number is inconsistent."),//错误或不合法的工单号
+    RESULT_DUPLICATE_ORDER(4001,"The order is already exists."), //指定工单已存在
+    RESULT_ORDER_ACCEPTED(4002, "The order is already accepted."),//指定工单已被接收
+    RESULT_ORDER_DEALED(4003, "The order is already deal."),//指定工单已被处理
+    RESULT_ORDER_ODD_STATUS(4004, "The order status is incorrect.No permission to operation."),//指定工单状态错误,暂无权限做次操作
+    RESULT_ORDER_OWN_CHANGED(4005, "The owner of order is changed.No permission to operation."),//指定工单归属已变更,暂无限操作
+
+    RESULT_USER_ALREADY_REG(8000, "This phone is already registered."),
+    RESULT_DENY_FOR_SAME_PASS(8001, "Two passwords cannot be the same."),
+    RESULT_REFRESH_TOKEN_FAILED(8002, "Refresh token failed, please login again."),
+    RESULT_TOKEN_INVALID_SIGN(8003, "Refresh token failed, invalid signature"),
+    RESULT_INVALID_USER_INFO(8004, "User information verification failed."),
+    RESULT_EXISTS_USER_NAME(8005, "Username already exists."),
+    RESULT_USER_NOT_REG(8006, "This phone is not registered."),
+    RESULT_INNER_JS_SERVER_AUTH_FAILED(8007, "Inner js service verify failed."),
+
+    RESULT_SERVER_NET_DISCONN_OR_BUSY(9000, "The network of server is down or busy. Please try again later."),
+
+    RESULT_INVALID_PUSH_TASK(9100, "The push task is inconsistent."),
+    RESULT_PUSH_TASK_CLOSE(9101, "The push task will be closed."),
+    RESULT_PUSH_TASK_RETRY(9102, "The push task will be next push in the queue."),
+    RESULT_PUSH_FAILED_ERROR_RECEIVER(9103, "Push task failed because of error receiver."),
+    RESULT_PUSH_FAILED_ERROR_OTHERS(9104, "Push task failed because of other errors."),
+    RESULT_PUSH_FAILED_NO_WAY(9105, "Push task failed because of no support the push way."),
+
+    RESULT_FILE_INVALID_TYPE(10000, "Illegal file type."),
+    RESULT_FILE_RW_FILED(10001, "File read/write error."),
+    RESULT_FILE_SIZE_EXCEED(10002, "File size limit exceeded."),
+    RESULT_FILE_PARSE_FAILED(10003, "File parse failed."),
+    RESULT_FILE_EMPTY_ROWS(10004, "File is empty rows."),
+
+    RESULT_NOT_SUPPORT_GEO_WFS_TYPE(20000, "The operation for this geo wfs type is not supported."),
+    RESULT_NOT_SUPPORT_GEO_WFS_WS(20001, "The operation for this geo wfs workspace is not supported."),
+    RESULT_GEO_WFS_TYPE_EMPTY_DATA(20002, "The empty data for this geo wfs type."),
+    RESULT_LABEL_ALREADY_USED(20003, "The Label is already in use."),
+    RESULT_REQ_TO_GEO_SERVER_FAILED(20004, "The request to GeoServer Failed."),
+
+    RESULT_FAST_DFS_UPLOAD_FAILED(30000, "Upload File To FastDfs Failed."),
+
+    BUSINESS_DB_REQ_FAILED(65530,"The DB operation failed."),
+    BUSINESS_API_ABOLISH(65531,"The Api has been abolished."),
+    BUSINESS_BUSY(65532,"Business is busy, please try again."),
+    SERVICE_OFFLINE(65533, "Service offline, please turn off offline mode"),
+    STATUS_UNKNOWN(65534,"Unknown reason,see the message/data for reason."),
+    RESULT_UNKNOWN(65535,"Unknown reason,see the message/data for reason.");
+
+    private String name;
+    private int index;
+    private ResponseCode(int indexC, String strN){
+        index = indexC;
+        name = strN;
+    }
+
+    public int toInt() {return index;}
+    public String toStrCode() {return String.valueOf(index);}
+    public String toStrMsg() {return name;}
+
+    @Override
+    public String toString() {
+        return "StatusCode: " + index + " Message: " + name;
+    }
+}

+ 59 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/ScheduleTaskMgr.java

@@ -0,0 +1,59 @@
+package io.github.pnoker.gateway.comtool;
+
+import io.github.pnoker.gateway.dbdao.DBMgrProxy;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.sql.Time;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * @ClassName ScheduleTaskMgr
+ * @Description: TODO 定时任务
+ * @Author LX
+ * @Date 2024/2/20
+ * @Version V1.0
+ **/
+@Component
+@EnableScheduling   // 1.开启定时任务
+@EnableAsync        // 2.开启多线程
+public class ScheduleTaskMgr {
+    private final String mBusinessType = "class";
+    private String mStrClassName;
+    public ScheduleTaskMgr() {
+        mStrClassName = this.getClass().getSimpleName();
+    }
+
+    @Resource
+    private XuchangWaterConfig xuchangWaterConfig;
+
+    //TODO 启动时,判断当前是否超过两点  如果超过 ,查询昨日是否有数据插入, 如果没有,则在启动时执行一下xuchangWaterConfig.init()
+    @PostConstruct
+    public void postInit(){
+        new Timer().schedule(new TimerTask() {
+            @Override
+            public void run() {
+                DBMgrProxy.getInstance().init();
+            }
+        },3000);
+        new Timer().schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    xuchangWaterConfig.init();
+                }
+            },10000);
+    }
+
+
+    //    @Scheduled(cron = "0 15 10 * * ?")
+    @Scheduled(cron = "0 10 12 * * ?")
+    public void checkXuchangMeter(){
+        xuchangWaterConfig.init();
+    }
+}

+ 500 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/TimeTool.java

@@ -0,0 +1,500 @@
+package io.github.pnoker.gateway.comtool;
+
+import org.springframework.util.StringUtils;
+
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+public class TimeTool {
+    public static final long MS_HTTP_REQ_TIMEOUT = 120*1000;  //两分钟的毫秒数
+    public static final long MS_ONE_HALF_MIN = 90*1000;  //一分半钟的毫秒数
+    public static final long MS_ONE_MIN = 60*1000;       //一分钟的毫秒数
+    public static final long MIN_ONE_DAY = 24*60;        //一天中的分
+    public static final long SEC_ONE_DAY = 24*60*60;     //一天中的秒
+    public static final long MS_ONE_DAY = 24*60*60*1000; //一天中的毫秒
+    public static final long MS_ONE_YEAR = 365*MS_ONE_DAY;//一年中的毫秒
+    public static final long MS_ONE_HOUR = 60*60*1000;   //一小时的毫秒
+    public static final String YEAR_FORMAT = "yyyy";
+    public static final String YEAR_MONTH_FORMAT_EX = "yyyyMM";
+    public static final String YEAR_MONTH_FORMAT = "yyyy-MM";
+    public static final String YEAR_MONTH_DAY_FORMAT = "yyyy-MM-dd";
+    public static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    public static final String TIMESTAMP_FORMAT_EX = "yyyy-MM-dd HH:mm:ss.SSS";
+    public static final String TIMESTAMP_FORMAT_EX2 = "yyyyMMddHHmmss";
+    public static final String TIMESTAMP_FORMAT_EX3 = "yyyyMMddHH";
+    public static final String TIMESTAMP_FORMAT_EX4 = "yyMMddHH";
+    public static final long UTC_MS_START_ONLINE = 1538323200000L;//2018-10-01 00:00:00
+    public static volatile long UTC_MS_TODAY_BEGIN = 0L;
+    public static volatile long UTC_MS_TODAY_END = 0L;
+    public static volatile long UTC_MS_THIS_MONTH_BEGIN = 0L;
+    public static volatile long UTC_MS_THIS_MONTH_END = 0L;
+
+    private static final DateTimeFormatter TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT);
+    private static final DateTimeFormatter TIMESTAMP_EX_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT_EX);
+    private static final DateTimeFormatter TIMESTAMP_EX2_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT_EX2);
+    private static final DateTimeFormatter YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern(YEAR_MONTH_FORMAT);
+    private static final DateTimeFormatter YEAR_MONTH_DAY_FORMATTER = DateTimeFormatter.ofPattern(YEAR_MONTH_DAY_FORMAT);
+
+    public static void refreshUTCTimeRes(){
+        UTC_MS_TODAY_BEGIN = getTodayBeginUTC();
+        UTC_MS_TODAY_END = getTodayEndUTC();
+        UTC_MS_THIS_MONTH_BEGIN = getMonthBeginUTC(System.currentTimeMillis());
+        UTC_MS_THIS_MONTH_END = getMonthEndUTC(System.currentTimeMillis());
+    }
+
+    private static LocalDateTime strTime2LocalDateTime(String time, String format) {
+        switch (format){
+            case YEAR_MONTH_FORMAT:
+                return LocalDateTime.parse(time, YEAR_MONTH_FORMATTER);
+            case YEAR_MONTH_DAY_FORMAT:
+                return LocalDateTime.parse(time, YEAR_MONTH_DAY_FORMATTER);
+            case TIMESTAMP_FORMAT:
+                return LocalDateTime.parse(time, TIMESTAMP_FORMATTER);
+            case TIMESTAMP_FORMAT_EX:
+                return LocalDateTime.parse(time, TIMESTAMP_EX_FORMATTER);
+            case TIMESTAMP_FORMAT_EX2:
+                return LocalDateTime.parse(time, TIMESTAMP_EX2_FORMATTER);
+            default:
+                return LocalDateTime.parse(time, DateTimeFormatter.ofPattern(format));
+        }
+    }
+
+    private static String localDateTime2StrTime(LocalDateTime localDateTime, String format) {
+        switch (format){
+            case YEAR_MONTH_FORMAT:
+                return localDateTime.format(YEAR_MONTH_FORMATTER);
+            case YEAR_MONTH_DAY_FORMAT:
+                return localDateTime.format(YEAR_MONTH_DAY_FORMATTER);
+            case TIMESTAMP_FORMAT:
+                return localDateTime.format(TIMESTAMP_FORMATTER);
+            case TIMESTAMP_FORMAT_EX:
+                return localDateTime.format(TIMESTAMP_EX_FORMATTER);
+            case TIMESTAMP_FORMAT_EX2:
+                return localDateTime.format(TIMESTAMP_EX2_FORMATTER);
+            default:
+                return localDateTime.format(DateTimeFormatter.ofPattern(format));
+        }
+    }
+
+    private static LocalDateTime utcMsTime2LocalDateTime(long lUTC) {
+        if (!isMsUTC(lUTC)){
+            lUTC = lUTC*1000;
+        }
+        Instant instant = Instant.ofEpochMilli(lUTC);
+        ZoneId zone = ZoneId.systemDefault();
+        return LocalDateTime.ofInstant(instant, zone);
+    }
+
+    private static long localDateTime2UtcMsTime(LocalDateTime localDateTime) {
+        ZoneId zone = ZoneId.systemDefault();
+        Instant instant = localDateTime.atZone(zone).toInstant();
+        return instant.toEpochMilli();
+    }
+
+    private static long strTime2UtcMsTime(String dateStr, String format){
+        return localDateTime2UtcMsTime(strTime2LocalDateTime(dateStr, format));
+    }
+
+    private static String utcMsTime2StrTime(long lUTC, String format){
+        return localDateTime2StrTime(utcMsTime2LocalDateTime(lUTC), format);
+    }
+
+    public static long convertDateStr2UTC(String dateStr){
+        try {
+            dateStr = dateStr.trim();
+            int len = dateStr.length();
+            if (len >= 23)
+                return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT_EX);
+            else if (len >= 19)
+                return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT);
+            else if (len >= 14)
+                return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT_EX2);
+            else if (len >= 10)//即dataStr为yyyy-MM-dd
+                return strTime2UtcMsTime(String.format("%s 00:00:00", dateStr), TIMESTAMP_FORMAT);
+            else if (len >= 7)//即dataStr为yyyy-MM
+                return strTime2UtcMsTime(String.format("%s-01 00:00:00", dateStr), TIMESTAMP_FORMAT);
+            else if (len >= 6)//即dataStr为yyyyMM
+                return strTime2UtcMsTime(String.format("%s01000000", dateStr), TIMESTAMP_FORMAT_EX2);
+            else if (len >= 4)//即dataStr为yyyy
+                return strTime2UtcMsTime(String.format("%s-01-01 00:00:00", dateStr), TIMESTAMP_FORMAT);
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 指定UTC是否为精确到毫秒的UTC时间
+     * @param lUTC
+     * @return
+     */
+    public static boolean isMsUTC(long lUTC){
+        return lUTC > 10000000000L;
+    }
+
+    public static long getCurSecUTC(){
+        return (System.currentTimeMillis()/1000)*1000;
+    }
+
+    public static long getCurMsUTC(){
+        return System.currentTimeMillis();
+    }
+
+    /**
+     *
+     * @param lUTC  UTC时间格式(单位:毫秒)
+     * @param strDateFormat 日期格式模板:如:yyyy-MM-dd HH:mm:ss
+     * @return
+     */
+    public static String convertUTC2DateStr(long lUTC, String strDateFormat){
+        try {
+            return utcMsTime2StrTime(lUTC<=0?System.currentTimeMillis():lUTC
+                    , StringUtils.isEmpty(strDateFormat)?TIMESTAMP_FORMAT:strDateFormat);
+        }catch (Exception e){}
+        return "";
+    }
+
+    /**
+     * 从当前时间算起,还有多少毫秒今天将结束
+     * @return 所剩的毫秒数
+     */
+    public static long hasMsWhenTodayEnd(){
+        long lR = UTC_MS_TODAY_END+1-System.currentTimeMillis();
+        if (lR <= 0)
+            lR = 1;
+        return lR;
+    }
+
+    /**
+     * 获取过期时间
+     * @param nSeconds 从当前时间算起,nSeconds秒后过期
+     * @return UTC时间格式(单位:毫秒)
+     */
+    public static long createExpiredTime(long nSeconds){
+        nSeconds = nSeconds<0?0:nSeconds;
+        long nowMillis = System.currentTimeMillis();
+        return nowMillis+(nSeconds*1000);
+    }
+
+    /**
+     * 获取当天的开始时间
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:00:00:00.000所对应的时间戳
+     */
+    public static long getTodayBeginUTC(){
+        return LocalDateTime.of(LocalDate.now(), LocalTime.MIN)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+        /*Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 0);
+        todayStart.set(Calendar.MINUTE, 0);
+        todayStart.set(Calendar.SECOND, 0);
+        todayStart.set(Calendar.MILLISECOND, 0);
+        return todayStart.getTime().getTime();*/
+    }
+
+    /**
+     * 获取当天距离最近的整点时刻
+     * @return UTC时间格式(单位:毫秒)
+     * @return
+     */
+    public static long getTodayLastHourUTC(){
+        return LocalDateTime.now().withMinute(0).withSecond(0).withNano(0)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+    }
+
+    /**
+     * 获取指定时间当日的起始时刻(即00:00:00.000)
+     * @param tmMS
+     * @return
+     */
+    public static long getBeginUTCOfTime(long tmMS){
+        if (!isMsUTC(tmMS)){
+            tmMS = tmMS*1000;
+        }
+        LocalDateTime startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(tmMS), ZoneId.systemDefault()).with(LocalTime.MIN);
+        return startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+    }
+
+    /**
+     * 获取指定时间当日的结束时刻(即23:59:59.999)
+     * @param tmMS
+     * @return
+     */
+    public static long getEndUTCOfTime(long tmMS){
+        if (!isMsUTC(tmMS)){
+            tmMS = tmMS*1000;
+        }
+        LocalDateTime startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(tmMS), ZoneId.systemDefault()).with(LocalTime.MAX);
+        return startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+    }
+    /**
+     * 获取当天的结束时间
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:23:59:59.999所对应的时间戳
+     */
+    public static long getTodayEndUTC(){
+        return LocalDateTime.of(LocalDate.now(), LocalTime.MAX)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+        /*Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 23);
+        todayStart.set(Calendar.MINUTE, 59);
+        todayStart.set(Calendar.SECOND, 59);
+        todayStart.set(Calendar.MILLISECOND, 999);
+        return todayStart.getTime().getTime();*/
+    }
+
+    /**
+     * 获取当前时间所在月份的开始时间戳
+     * @param curTime
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:xxxx-xx-01 00:00:00.000所对应的时间戳
+     */
+    public static long getMonthBeginUTC(long curTime){
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.set(Calendar.DAY_OF_MONTH, 1);
+            c.set(Calendar.HOUR_OF_DAY, 0);
+            c.set(Calendar.MINUTE, 0);
+            c.set(Calendar.SECOND,0);
+            c.set(Calendar.MILLISECOND, 0);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 获取当前时间所在月份的结束时间戳
+     * @param curTime
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:xxxx-xx-31 23:59:59.999所对应的时间戳
+     */
+    public static long getMonthEndUTC(long curTime){
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+            c.set(Calendar.HOUR_OF_DAY, 23);
+            c.set(Calendar.MINUTE, 59);
+            c.set(Calendar.SECOND,59);
+            c.set(Calendar.MILLISECOND, 999);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 月份字符串列表
+     * ["2018-01", "2018-02"]
+     */
+    public static List<String> getMonthListBetween(long startTime, long endTime){
+        ArrayList<String> arrMonth = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(startTime));
+            String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(endTime));
+            Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strStart);
+            Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strEnd);
+
+            Calendar dPos = Calendar.getInstance();
+            dPos.setTime(dtStart);                  //设置日期起始时间
+            while (dPos.getTime().before(dtEnd)) {
+                arrMonth.add((new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(dPos.getTime()));
+                dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+            arrMonth.add(strEnd);
+        }catch (Exception e){e.printStackTrace();}
+        return arrMonth;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 月份字符串列表
+     * ["201801", "201802"]
+     */
+    public static List<String> getMonthListBetweenEx(long startTime, long endTime){
+        ArrayList<String> arrMonth = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(new Date(startTime));
+            String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(new Date(endTime));
+            Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).parse(strStart);
+            Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).parse(strEnd);
+
+            Calendar dPos = Calendar.getInstance();
+            dPos.setTime(dtStart);                  //设置日期起始时间
+            while (dPos.getTime().before(dtEnd)) {
+                arrMonth.add((new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(dPos.getTime()));
+                dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+            arrMonth.add(strEnd);
+        }catch (Exception e){e.printStackTrace();}
+        return arrMonth;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表UTC
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 月份UTC时间戳列表(精确到毫秒)
+     * [2018-01-01 00:00:00.000对应的UTC, 2018-02-01 00:00:00.000对应的UTC]
+     */
+    public static List<Long> getMonthUTCListBetween(long startTime, long endTime){
+        ArrayList<Long> arrMonth = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(startTime));
+            String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(endTime));
+            Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strStart);
+            Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strEnd);
+
+            Calendar dPos = Calendar.getInstance();
+            dPos.setTime(dtStart);                  //设置日期起始时间
+            while (dPos.getTime().before(dtEnd)) {
+                arrMonth.add(dPos.getTimeInMillis());
+                dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+            arrMonth.add(dtEnd.getTime());
+        }catch (Exception e){e.printStackTrace();}
+        return arrMonth;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始月份,如:2018-01-01 00:00:00
+     * @param endTime 结束月份,如:2018-02-01 00:00:00
+     * @return 月份字符串列表
+     * ["2018-01", "2018-02"]
+     */
+    public static List<String> getMonthListBetween(String startTime, String endTime){
+        try {
+            //Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(startTime);
+            //Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(endTime);
+            return getMonthListBetween(convertDateStr2UTC(startTime), convertDateStr2UTC(endTime));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始月份,如:2018-01-01 00:00:00
+     * @param endTime 结束月份,如:2018-02-01 00:00:00
+     * @return 月份字符串列表
+     * ["201801", "201802"]
+     */
+    public static List<String> getMonthListBetweenEx(String startTime, String endTime){
+        try {
+            //Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).parse(startTime);
+            //Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).parse(endTime);
+            return getMonthListBetweenEx(convertDateStr2UTC(startTime), convertDateStr2UTC(endTime));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表UTC
+     * @param startTime 起始月份,如:2018-01-01 00:00:00
+     * @param endTime 结束月份,如:2018-02-01 00:00:00
+     * @return 月份UTC时间戳列表(精确到秒)
+     * [2018-01-01 00:00:00.000对应的UTC, 2018-02-01 00:00:00.000对应的UTC]
+     */
+    public static List<Long> getMonthUTCListBetween(String startTime, String endTime){
+        try {
+            Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(startTime);
+            Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(endTime);
+            return getMonthUTCListBetween(d1.getTime(), d2.getTime());
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * yyyyMMddhhmmss时间字符串转yyyy-MM-dd HH:mm:ss时间字符串
+     * @param strDateStr
+     * @return
+     */
+    public static String addSplitForDateStr(String strDateStr){
+        if (!StringUtils.isEmpty(strDateStr)){
+            try {
+                return localDateTime2StrTime(strTime2LocalDateTime(strDateStr, TIMESTAMP_FORMAT_EX2), TIMESTAMP_FORMAT);
+            }catch (Exception e){}
+        }
+        return "";
+    }
+
+    /**
+     * 修改指定时间的月份
+     * @param curTime
+     * @param month  > 0 在指定时间上加数个月;< 0 在指定时间上减数个月;
+     * @return
+     */
+    public static long getTimeChgMonth(long curTime, int month){
+        if (month == 0)
+            return curTime;
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.add(Calendar.MONTH, month);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    public static String convertDateObj2DateStr(Date dateObj, String strDateFormat){
+        try {
+            int len = strDateFormat.length();
+            if (len >= 21)
+                return new SimpleDateFormat(TIMESTAMP_FORMAT_EX).format(dateObj);
+            else if (len >= 17)
+                return new SimpleDateFormat(TIMESTAMP_FORMAT).format(dateObj);
+            else if (len >= 12)
+                return new SimpleDateFormat(TIMESTAMP_FORMAT_EX2).format(dateObj);
+            else {
+                int splitCounts = CommTool.totalCharCountsInStr(strDateFormat, '-');
+                if (splitCounts <= 0)
+                    splitCounts = CommTool.totalCharCountsInStr(strDateFormat, '/');
+                if (splitCounts >= 2)
+                    return new SimpleDateFormat(YEAR_MONTH_DAY_FORMAT).format(dateObj);
+                else if (splitCounts >= 1)
+                    return new SimpleDateFormat(YEAR_MONTH_FORMAT).format(dateObj);
+                else
+                    return new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).format(dateObj);
+            }
+        }catch (Exception e){}
+        return new SimpleDateFormat(YEAR_MONTH_DAY_FORMAT).format(dateObj);
+    }
+}

+ 446 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/comtool/XuchangWaterConfig.java

@@ -0,0 +1,446 @@
+package io.github.pnoker.gateway.comtool;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.github.pnoker.gateway.dbdao.DBMgrProxy;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerMeterDayReadService;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerWaterConfigService;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerWaterInfoService;
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerWaterConfigTable;
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerWaterInfoTable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.remoting.RemoteAccessException;
+
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.*;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * @ClassName XuchangWaterConfig
+ * @Description: TODO 许昌800只户表数据查询
+ * @Author LX
+ * @Date 2024/1/30
+ * @Version V1.0
+ **/
+@Configuration
+public class XuchangWaterConfig {
+
+    private static final Logger log = LoggerFactory.getLogger(XuchangWaterConfig.class);
+
+    private static volatile String url = "";
+    private static volatile String user = "";
+    private static volatile String pwd = "";
+
+    private static XuChangCustomerWaterConfigService getXuChangCustomerWaterConfigApi(){
+        return DBMgrProxy.getInstance().applyXuchangCustomerWaterConfigApi();
+    }
+
+    private static XuChangCustomerWaterInfoService getXuChangCustomerWaterInfoApi(){
+        return DBMgrProxy.getInstance().applyXuchangCustomerWaterInfoApi();
+    }
+
+    private static XuChangCustomerMeterDayReadService getXuChangCustomerMeterDayReadApi(){
+        return DBMgrProxy.getInstance().applyXuChangCustomerMeterDayReadApi();
+    }
+
+    //TODO 初始化方法
+    //TODO 远程WebService查询智能水表接口
+    public void init() {
+        try {
+            YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
+//此处是为了找到对应yaml文件的位置
+            yaml.setResources(new ClassPathResource("application.yml"));
+            Properties properties = yaml.getObject();
+            if(StringUtils.isEmpty(user)) {
+                user = properties.getProperty("xuchang.user");
+            }
+            if(StringUtils.isEmpty(pwd)) {
+                pwd = properties.getProperty("xuchang.pwd");
+            }
+            if(StringUtils.isEmpty(url)) {
+                url = properties.getProperty("xuchang.url");
+            }
+            //TODO 首先查询config配置信息, 通过配置信息查询用户以及日用量记录
+            List<Map<String,Object>> configList = new ArrayList<>();
+            int nTotals = getXuChangCustomerWaterConfigApi().totalCountsEx("", null, null, "");
+            if(nTotals>0){
+                //TODO 优化 以分页方式查询所有,初始分页行数定为3000查询速率较好
+                int pageNum = nTotals%3000==0?nTotals/3000:(nTotals/3000)+1;//总页数
+
+                Integer limit = 3000;
+                if(pageNum<=1){
+                    limit = nTotals;//说明总数比第一页小
+                }
+                for (int i = 0; i < pageNum; i++) {
+                    Integer offset = i*limit;
+                    List<Map<String,Object>> arrTmpDbs = getXuChangCustomerWaterConfigApi().listAllWiths(
+                            limit,
+                            offset,
+                            null,
+                            null,
+                            XuChangCustomerWaterConfigTable.R_INFO.DEFAULT_ORDER,
+                            "");
+                    if(!CollectionUtils.isEmpty(arrTmpDbs)){
+                        configList.addAll(arrTmpDbs);
+                    }
+                }
+            }
+
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            //TODO 得到配置列表后 , 查询相应信息的用户信息和户表信息并进行数据插入
+            //TODO 用户信息相关集合
+            List<Map<String,Object>> dataMaps = new ArrayList<>();
+            List<Map<String,Object>> upDataMaps = new ArrayList<>();
+            List<Map<String,Object>> upAndWheres = new ArrayList<>();//修改条件
+
+            //TODO 日用量信息相关集合
+            List<Map<String,Object>> dayReadDataMaps = new ArrayList<>();
+            List<Map<String,Object>> dayReadUpDataMaps = new ArrayList<>();
+            List<Map<String,Object>> dayReadUpAndWheres = new ArrayList<>();//修改条件
+            for(Map<String,Object> map:configList){
+                //TODO 查询用户信息是否存在 , 若存在则修改 , 不存在则新增
+                JSONArray userArray = getUserInfo(user,pwd,!StringUtils.isEmpty(map.get("user_code"))?map.get("user_code").toString():"");
+                if(userArray!=null&&userArray.size()>0){
+                    JSONObject userObj = JSONObject.parseObject(userArray.get(0).toString());
+                    Map<String,Object> andWheres = new HashMap<>();
+                    andWheres.put(XuChangCustomerWaterInfoTable.R_INFO.METER_ADDR,userObj.getString("meterAddr"));
+                    List<Map<String,Object>> userListRes = getXuChangCustomerWaterInfoApi().listAllWiths(1,0,andWheres,null,"","");
+                    if(CollectionUtils.isEmpty(userListRes)){
+                        //TODO 新增
+                        Map<String,Object> dataMap = new HashMap<>();
+                        dataMap.put("uid","UI"+UUID.randomUUID());
+                        dataMap.put("user_code",userObj.getString("usercode"));
+                        dataMap.put("user_name",userObj.getString("username"));
+                        dataMap.put("door_plate",userObj.getString("doorplate"));
+                        dataMap.put("address",userObj.getString("address"));
+                        dataMap.put("meter_addr",userObj.getString("meterAddr"));
+                        dataMap.put("meter_type_name",userObj.getString("meterTypeName"));
+                        dataMap.put("phone",userObj.getString("phone"));
+                        dataMap.put("reserve",userObj.getString("reserve"));
+                        dataMap.put("remnant",userObj.getString("remnant"));
+                        dataMap.put("gis",map.get("gis"));
+                        dataMap.put("territory",userObj.getString("territory"));
+                        dataMaps.add(dataMap);
+                    }else{
+                        //TODO 修改
+                        Map<String,Object> dataMap = new HashMap<>();
+                        dataMap.put("user_code",userObj.getString("usercode"));
+                        dataMap.put("user_name",userObj.getString("username"));
+                        dataMap.put("door_plate",userObj.getString("doorplate"));
+                        dataMap.put("address",userObj.getString("address"));
+                        dataMap.put("meter_addr",userObj.getString("meterAddr"));
+                        dataMap.put("meter_type_name",userObj.getString("meterTypeName"));
+                        dataMap.put("phone",userObj.getString("phone"));
+                        dataMap.put("reserve",userObj.getString("reserve"));
+                        dataMap.put("remnant",userObj.getString("remnant"));
+                        dataMap.put("gis",map.get("gis"));
+                        dataMap.put("territory",userObj.getString("territory"));
+                        Map<String,Object> aw = new HashMap<>();
+                        aw.put("uid",userListRes.get(0).get("uid"));
+
+                        upAndWheres.add(aw);
+                        upDataMaps.add(dataMap);
+                    }
+                }
+
+                //TODO 用户信息新增/修改完毕后, 然后新增/修改日用量表信息
+                LocalDateTime now = LocalDateTime.now();
+                JSONArray dayReadArray = getFreezeDayDosage(user,pwd,now.minusDays(1).format(formatter),now.format(formatter),
+                        String.valueOf(map.get(XuChangCustomerWaterConfigTable.R_INFO.METER_ADDR)==null?"":map.get(XuChangCustomerWaterConfigTable.R_INFO.METER_ADDR)),1,1000);
+                if(dayReadArray!=null&&dayReadArray.size()>0){
+                    JSONObject dayReadObj = JSONObject.parseObject(dayReadArray.get(0).toString());
+                    Map<String,Object> andWheres = new HashMap<>();
+                    andWheres.put("insert_date",TimeTool.convertDateStr2UTC(dayReadObj.getString("insertDate")));
+                    List<Map<String,Object>> dayReadRes = getXuChangCustomerMeterDayReadApi().listAllWiths(1,0,andWheres,null,"","");
+                    if(CollectionUtils.isEmpty(dayReadRes)) {
+                        //TODO 新增
+                        Map<String,Object> dataMap = new HashMap<>();
+                        dataMap.put("uid","UR"+UUID.randomUUID());
+                        dataMap.put("meter_addr",dayReadObj.getString("meterAddr"));
+                        dataMap.put("begin_date",dayReadObj.getString("beginDate"));
+                        dataMap.put("freeze_date",dayReadObj.getString("freezeDate"));
+                        dataMap.put("begin_number",dayReadObj.getString("beginNumber"));
+                        dataMap.put("end_number",dayReadObj.getString("endNumber"));
+                        dataMap.put("use_number",dayReadObj.getString("useNumber"));
+                        dataMap.put("insert_date", TimeTool.convertDateStr2UTC(dayReadObj.getString("insertDate")));
+
+                        dayReadDataMaps.add(dataMap);
+                    }else{
+                        //TODO 修改
+                        Map<String,Object> dataMap = new HashMap<>();
+                        dataMap.put("meter_addr",dayReadObj.getString("meterAddr"));
+                        dataMap.put("begin_date",dayReadObj.getString("beginDate"));
+                        dataMap.put("freeze_date",dayReadObj.getString("freezeDate"));
+                        dataMap.put("begin_number",dayReadObj.getDoubleValue("beginNumber"));
+                        dataMap.put("end_number",dayReadObj.getDoubleValue("endNumber"));
+                        dataMap.put("use_number",dayReadObj.getDoubleValue("useNumber"));
+                        Map<String,Object> aw = new HashMap<>();
+                        aw.put("uid",dayReadRes.get(0).get("uid"));
+                        aw.put("insert_date",dayReadRes.get(0).get("insert_date"));
+
+                        dayReadUpDataMaps.add(dataMap);
+                        dayReadUpAndWheres.add(aw);
+                    }
+                }
+            }
+            int nRes = 0;
+            if(!CollectionUtils.isEmpty(dataMaps)) {
+                nRes = getXuChangCustomerWaterInfoApi().bacthInserts(dataMaps);
+            }
+            if(!CollectionUtils.isEmpty(upDataMaps)){
+                nRes = getXuChangCustomerWaterInfoApi().bacthUpdates(upDataMaps,upAndWheres);
+            }
+            log.info(0+"XuchangWaterConfig"
+                    +String.format("XuchangWaterInfo_Success" + " nRes: %s====>"
+                            ,nRes));
+
+            int nReadRes = 0;
+            if(!CollectionUtils.isEmpty(dayReadDataMaps)) {
+                nReadRes = getXuChangCustomerMeterDayReadApi().bacthInserts(dayReadDataMaps);
+            }
+            if(!CollectionUtils.isEmpty(dayReadUpDataMaps)){
+                nReadRes = getXuChangCustomerMeterDayReadApi().bacthUpdates(dayReadUpDataMaps,dayReadUpAndWheres);
+            }
+            log.info(0+"XuchangWaterConfig"
+                    +String.format("XuchangMeterDayRead_Success" + " nReadRes: %s====>"
+                    ,nReadRes));
+        }catch(Exception ex){
+            ex.printStackTrace();
+            log.error(2+ "XuchangWaterConfig"
+                    +String.format("XuchangWater_Error" + " errorMsg: %s====>"
+                            , ex.getLocalizedMessage()));
+        }
+    }
+
+
+    //TODO 获取表当前数据
+    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 200L, multiplier = 1))
+    public static JSONArray creatPostAndTransData(String A,String B,int C,String D,int page,int pageSize) {
+        String line = "";
+        // 用来存储接收到的返回值
+        StringBuffer resultStringBuffer = new StringBuffer();
+        OutputStreamWriter out = null;
+        try {
+            // 根据url连接接口
+            URL realUrl = new URL(url);
+            URLConnection urlConnection = realUrl.openConnection();
+            // 根据需要,将传来的接口参数组装为xml文本
+            String xmlInfo = getGetReadNowDataXmlInfo(A,B,C,D,page,pageSize);
+            byte[] xmlInfoBytes = xmlInfo.getBytes();
+            urlConnection.setDoInput(true);
+            urlConnection.setDoOutput(true);
+            urlConnection.setUseCaches(false);
+            urlConnection.setRequestProperty("Content-Type","text/xml; charset=utf-8");
+            urlConnection.setRequestProperty("Content-length",String.valueOf(xmlInfoBytes.length));
+            out = new OutputStreamWriter(urlConnection.getOutputStream());
+            out.write(new String(xmlInfo.getBytes(StandardCharsets.ISO_8859_1)));
+            out.flush();
+            out.close();
+            // 开始接收返回值
+            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
+            for (line = bufferedReader.readLine(); line != null;line = bufferedReader.readLine()) {
+                resultStringBuffer.append(line);
+            }
+            // 从返回的文本中,截取出我们需要的内容
+            int beginIndex = resultStringBuffer.indexOf("<NBIoT_GetReadNowDataResult>") + 28;
+            int endIndex = resultStringBuffer.lastIndexOf("</NBIoT_GetReadNowDataResult>");
+            String jsonString = resultStringBuffer.toString().substring(beginIndex,endIndex);
+            JSONObject result = JSONObject.parseObject(jsonString);
+            String outResult = result.getString("outResult");
+            JSONArray jsonArray = null;
+            if(!StringUtils.isEmpty(outResult)&&"1".equals(outResult)){
+                jsonArray = result.getJSONArray("outData");
+            }else{
+                log.error("waterErrorCode:"+outResult+";waterErrorMsg:"+result.getString("outMsg"));
+            }
+            // List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);
+            return jsonArray;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    //TODO TODO 获取表日用量
+    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 200L, multiplier = 1))
+    public static JSONArray getFreezeDayDosage(String A,String B,String C,String D,String F,int page,int pageSize) {
+        String line = "";
+        // 用来存储接收到的返回值
+        StringBuffer resultStringBuffer = new StringBuffer();
+        OutputStreamWriter out = null;
+        try {
+            // 根据url连接接口
+            URL realUrl = new URL(url);
+            URLConnection urlConnection = realUrl.openConnection();
+            // 根据需要,将传来的接口参数组装为xml文本
+            String xmlInfo = getGetFreezeDayDosageXmlInfo(A,B,C,D,F,page,pageSize);
+            byte[] xmlInfoBytes = xmlInfo.getBytes();
+            urlConnection.setDoInput(true);
+            urlConnection.setDoOutput(true);
+            urlConnection.setUseCaches(false);
+            urlConnection.setRequestProperty("Content-Type","text/xml; charset=utf-8");
+            urlConnection.setRequestProperty("Content-length",String.valueOf(xmlInfoBytes.length));
+            out = new OutputStreamWriter(urlConnection.getOutputStream());
+            out.write(new String(xmlInfo.getBytes(StandardCharsets.ISO_8859_1)));
+            out.flush();
+            out.close();
+            // 开始接收返回值
+            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
+            for (line = bufferedReader.readLine(); line != null;line = bufferedReader.readLine()) {
+                resultStringBuffer.append(line);
+            }
+            // 从返回的文本中,截取出我们需要的内容
+            int beginIndex = resultStringBuffer.indexOf("<NBIoT_GetFreezeDayDosageResult>") + 32;
+            int endIndex = resultStringBuffer.lastIndexOf("</NBIoT_GetFreezeDayDosageResult>");
+            String jsonString = resultStringBuffer.toString().substring(beginIndex,endIndex);
+            JSONObject result = JSONObject.parseObject(jsonString);
+            String outResult = result.getString("outResult");
+            JSONArray jsonArray = null;
+            if(!StringUtils.isEmpty(outResult)&&"1".equals(outResult)){
+                jsonArray = result.getJSONArray("outData");
+            }else{
+                log.error("waterErrorCode:"+outResult+";waterErrorMsg:"+result.getString("outMsg"));
+            }
+            // List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);
+            return jsonArray;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    //TODO TODO 获取用户信息
+    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 200L, multiplier = 1))
+    public static JSONArray getUserInfo(String A,String B,String C) {
+        String line = "";
+        // 用来存储接收到的返回值
+        StringBuffer resultStringBuffer = new StringBuffer();
+        OutputStreamWriter out = null;
+        try {
+            // 根据url连接接口
+            URL realUrl = new URL(url);
+            URLConnection urlConnection = realUrl.openConnection();
+            // 根据需要,将传来的接口参数组装为xml文本
+            String xmlInfo = getGetUserInfoXML(A,B,C);
+            byte[] xmlInfoBytes = xmlInfo.getBytes();
+            urlConnection.setDoInput(true);
+            urlConnection.setDoOutput(true);
+            urlConnection.setUseCaches(false);
+            urlConnection.setRequestProperty("Content-Type","text/xml; charset=utf-8");
+            urlConnection.setRequestProperty("Content-length",String.valueOf(xmlInfoBytes.length));
+            out = new OutputStreamWriter(urlConnection.getOutputStream());
+            out.write(new String(xmlInfo.getBytes(StandardCharsets.ISO_8859_1)));
+            out.flush();
+            out.close();
+            // 开始接收返回值
+            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
+            for (line = bufferedReader.readLine(); line != null;line = bufferedReader.readLine()) {
+                resultStringBuffer.append(line);
+            }
+            // 从返回的文本中,截取出我们需要的内容
+            int beginIndex = resultStringBuffer.indexOf("<NBIoT_GetUserInfoResult>") + 25;
+            int endIndex = resultStringBuffer.lastIndexOf("</NBIoT_GetUserInfoResult>");
+            String jsonString = resultStringBuffer.toString().substring(beginIndex,endIndex);
+            JSONObject result = JSONObject.parseObject(jsonString);
+            String outResult = result.getString("outResult");
+            JSONArray jsonArray = null;
+            if(!StringUtils.isEmpty(outResult)&&"1".equals(outResult)){
+                jsonArray = result.getJSONArray("outData");
+            }else{
+                log.error("waterErrorCode:"+outResult+";waterErrorMsg:"+result.getString("outMsg"));
+            }
+            // List<Map> list = JSONObject.parseArray(jsonArray.toString(),Map.class);
+            return jsonArray;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private static String getGetReadNowDataXmlInfo(String A,String B,int C,String D,int page,int pageSize) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        stringBuilder.append("<soap:Envelope xmlns:xsi=\"http:/www.w3.org/201/XMLschema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLschema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
+        stringBuilder.append("    <soap:Body>");
+        stringBuilder.append("        <NBIoT_GetReadNowData xmlns=\"http://www.suntront.com/\">");
+        stringBuilder.append("            <user>"+A+"</user>");
+        stringBuilder.append("            <pwd>"+B+"</pwd>");
+        stringBuilder.append("            <pageSize>"+pageSize+"</pageSize>");
+        stringBuilder.append("            <currentPageIndex>"+page+"</currentPageIndex>");
+        stringBuilder.append("            <OrderType>"+C+"</OrderType>");
+        stringBuilder.append("            <meterAddr>"+D+"</meterAddr>");
+        stringBuilder.append("        </NBIoT_GetReadNowData>");
+        stringBuilder.append("    </soap:Body>");
+        stringBuilder.append("</soap:Envelope>");
+        return stringBuilder.toString();
+    }
+    private static String getGetFreezeDayDosageXmlInfo(String A,String B,String C,String D,String F,int page,int pageSize) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        stringBuilder.append("<soap:Envelope xmlns:xsi=\"http:/www.w3.org/201/XMLschema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLschema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
+        stringBuilder.append("    <soap:Body>");
+        stringBuilder.append("        <NBIoT_GetFreezeDayDosage xmlns=\"http://www.suntront.com/\">");
+        stringBuilder.append("            <user>"+A+"</user>");
+        stringBuilder.append("            <pwd>"+B+"</pwd>");
+        stringBuilder.append("            <pageSize>"+pageSize+"</pageSize>");
+        stringBuilder.append("            <currentPageIndex>"+page+"</currentPageIndex>");
+        stringBuilder.append("            <meterAddr>"+F+"</meterAddr>");
+        stringBuilder.append("            <beginDate>"+C+"</beginDate>");
+        stringBuilder.append("            <endDate>"+D+"</endDate>");
+        stringBuilder.append("        </NBIoT_GetFreezeDayDosage>");
+        stringBuilder.append("    </soap:Body>");
+        stringBuilder.append("</soap:Envelope>");
+        return stringBuilder.toString();
+    }
+    private static String getGetUserInfoXML(String A,String B,String C) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        stringBuilder.append("<soap:Envelope xmlns:xsi=\"http:/www.w3.org/201/XMLschema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLschema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
+        stringBuilder.append("    <soap:Body>");
+        stringBuilder.append("        <NBIoT_GetUserInfo xmlns=\"http://www.suntront.com/\">");
+        stringBuilder.append("            <user>"+A+"</user>");
+        stringBuilder.append("            <pwd>"+B+"</pwd>");
+        stringBuilder.append("            <userCode>"+C+"</userCode>");
+        stringBuilder.append("        </NBIoT_GetUserInfo>");
+        stringBuilder.append("    </soap:Body>");
+        stringBuilder.append("</soap:Envelope>");
+        return stringBuilder.toString();
+    }
+}

+ 177 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/config/GlobalData.java

@@ -0,0 +1,177 @@
+package io.github.pnoker.gateway.config;
+
+import org.springframework.util.StringUtils;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validator;
+import javax.validation.executable.ExecutableValidator;
+import java.util.*;
+
+public class GlobalData {
+    public final static String ORIGIN_KEY = "Y^c3b5d3z1";    //原始口令:阳春布德泽
+    private boolean mBHttpStatusAlready200 = true;          //HttpStatus返回码是不是总是返回200ok
+    private boolean  mBTokenIsUnique = false;
+    private boolean  mBSvrTestMode = false;
+
+    private Validator mValidForParam = null;
+    private ExecutableValidator mValidForFun = null;
+    private volatile boolean mBUseLocalCache = true;         //是否启用本地缓存
+    private String mStrServerId = "";                          //本服务的ID
+    private int mNOwnerMachineIndex = 0;                      //本服务所在的部署机器的索引编号
+    private int mNOwnerServiceIndex = 0;                      //本服务在部署机器上的服务索引编号
+    private int mNCpuCoresForEnableAsyncSubTask = 8;        //启动异步子任务的最小cpu核心数
+    private volatile boolean mBSwitchTraceLog = true;       //是否开启基于TraceId的日志记录
+    private boolean mBPostGisValid = false;
+
+    private String mStrOperatorAccount = "";
+    private String mStrOperatorPassword = "";
+    private String mStrInternalCallPassword = "";            //本机的内部通信可信任口令
+    private volatile String mStrGeoServerAddress = "";
+    private volatile String mStrKprProxyAddress = "";
+
+    private volatile Map<String, List<String>> dashboardKind2Module = new HashMap<>();
+    private static volatile GlobalData msInstance = null;
+    public static GlobalData getInstance(){
+        if (msInstance == null){
+            synchronized (GlobalData.class){
+                if (msInstance == null)
+                    msInstance = new GlobalData();
+            }
+        }
+        return msInstance;
+    }
+
+    private GlobalData() {
+    }
+
+    public void setCpuCoresForEnableAsyncSubTask(int nCpuCores){
+        this.mNCpuCoresForEnableAsyncSubTask = nCpuCores;
+    }
+
+    public boolean isEnableAsyncSubTask(){
+        //cpu核心数>=指定配置时才启用异步子任务(注:过多线程并发可增加线程间的切换开销,导致单个请求执行时间拉长)
+        return mNCpuCores >= mNCpuCoresForEnableAsyncSubTask;
+    }
+
+    private int mNCpuCores = 1;
+    public int getCpuCores() {
+        return mNCpuCores;
+    }
+
+    public void setCpuCores(int mNCpuCores) {
+        this.mNCpuCores = mNCpuCores;
+    }
+
+    public <T> boolean checkObjectByValidator(T object, Class<?>... classForObject){
+        if (mValidForParam != null){
+            Set<ConstraintViolation<T>> constraintViolations = mValidForParam.validate(object, classForObject);
+            if (!(constraintViolations == null || constraintViolations.size() <= 0))
+                return false;
+        }
+        return true;
+    }
+
+    public Validator getValidForParam() {
+        return mValidForParam;
+    }
+
+    public void setValidForParam(Validator mValidForParam) {
+        this.mValidForParam = mValidForParam;
+    }
+
+    public ExecutableValidator getValidForFun() {
+        return mValidForFun;
+    }
+
+    public void setValidForFun(ExecutableValidator mValidForFun) {
+        this.mValidForFun = mValidForFun;
+    }
+
+    public boolean isTokenMustUnique() {
+        return mBTokenIsUnique;
+    }
+
+    public void setTokenMustUnique(boolean mBTokenIsUnique) {
+        this.mBTokenIsUnique = mBTokenIsUnique;
+    }
+
+    public boolean isSvrTestMode() {
+        return mBSvrTestMode;
+    }
+
+    public void setSvrTestMode(boolean mBSvrTestMode) {
+        this.mBSvrTestMode = mBSvrTestMode;
+    }
+
+    public boolean isHttpStatusAlready200() {
+        return mBHttpStatusAlready200;
+    }
+
+    public void setHttpStatusAlready200(boolean mBHttpStatusAlready200) {
+        this.mBHttpStatusAlready200 = mBHttpStatusAlready200;
+    }
+
+    public boolean isUseLocalCache() { return mBUseLocalCache; }
+
+    public void setUseLocalCache(boolean mBUseLocalCache) { this.mBUseLocalCache = mBUseLocalCache; }
+
+    public String getServerId() { return mStrServerId; }
+
+    public void setServerId(String mStrServerId) { this.mStrServerId = mStrServerId; }
+
+    public int getNOwnerMachineIndex() { return mNOwnerMachineIndex; }
+
+    public void setNOwnerMachineIndex(int mNOwnerMachineIndex) { this.mNOwnerMachineIndex = mNOwnerMachineIndex; }
+
+    public int getNOwnerServiceIndex() { return mNOwnerServiceIndex; }
+
+    public void setNOwnerServiceIndex(int mNOwnerServiceIndex) { this.mNOwnerServiceIndex = mNOwnerServiceIndex; }
+
+    public boolean isSwitchTraceLog() { return mBSwitchTraceLog; }
+
+    public void setSwitchTraceLog(boolean mBSwitchTraceLog) { this.mBSwitchTraceLog = mBSwitchTraceLog; }
+
+    public String getStrOperatorAccount() { return mStrOperatorAccount; }
+
+    public void setStrOperatorAccount(String mStrOperatorAccount) { this.mStrOperatorAccount = mStrOperatorAccount; }
+
+    public String getStrOperatorPassword() { return mStrOperatorPassword; }
+
+    public void setStrOperatorPassword(String mStrOperatorPassword) { this.mStrOperatorPassword = mStrOperatorPassword; }
+
+    public String getInternalCallPassword() { return mStrInternalCallPassword; }
+
+    public void setInternalCallPassword(String mStrInternalCallPassword) { this.mStrInternalCallPassword = mStrInternalCallPassword; }
+
+    public boolean isPostGisValid() { return mBPostGisValid; }
+
+    public void setPostGisValid(boolean mBPostGisValid) { this.mBPostGisValid = mBPostGisValid; }
+
+    public void reInitDashboardModule(String kind, List<String> modules){
+        if (modules == null)
+            return;
+        dashboardKind2Module.put(kind, new ArrayList<>(modules));
+    }
+
+    public List<String> getDashboardModule(String kind){
+        if (StringUtils.isEmpty(kind))
+            return null;
+        return dashboardKind2Module.get(kind);
+    }
+
+    public String getGeoServerAddress() {
+        return mStrGeoServerAddress;
+    }
+
+    public void setGeoServerAddress(String mStrGeoServerAddress) {
+        this.mStrGeoServerAddress = mStrGeoServerAddress;
+    }
+
+    public String getKprProxyAddress() {
+        return mStrKprProxyAddress;
+    }
+
+    public void setKprProxyAddress(String mStrKprProxyAddress) {
+        this.mStrKprProxyAddress = mStrKprProxyAddress;
+    }
+}

+ 107 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/config/MainSourceConfiguration.java

@@ -0,0 +1,107 @@
+package io.github.pnoker.gateway.config;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = "io.github.pnoker.gateway.dbdao.mapper", sqlSessionTemplateRef = "mainSqlSessionTemplate")
+public class MainSourceConfiguration {
+    @Value("${spring.datasource.driver-class-name:}")
+    private String driveClass = "org.postgresql.Driver";
+
+    @Value("${spring.datasource.jdbc-url:}")
+    private String url = "";
+
+    @Value("${spring.datasource.username:}")
+    private String username = "";
+
+    @Value("${spring.datasource.password:}")
+    private String password = "";
+
+    @Value("${spring.datasource.data.maximum-pool-size:200}")
+    private Integer maxPoolSize;
+
+    @Value("${spring.datasource.data.minimum-idle:1}")
+    private Integer minIdle;
+
+    @Value("${spring.datasource.data.connection-test-query:}")
+    private String connectionTestQuery;
+
+    @Value("${spring.datasource.data.max-lifetime:120000}")
+    private Long maxLifetime;
+
+    @Value("${spring.datasource.data.idle-timeout:30000}")
+    private Long idleTimeout;
+
+    @Value("${spring.datasource.data.connection-timeout:30000}")
+    private Long connectionTimeout;
+
+    @Value("${spring.datasource.data.validation-timeout:30000}")
+    private Long validTimeout;
+
+    @Bean(name = "mainDatasource")
+    //@ConfigurationProperties(prefix = "spring.datasource.data")
+    public DataSource mainDataSource() {
+        return new HikariDataSource(getConfig());
+        //return DataSourceBuilder.create().build();
+        //Spring Boot 2.x默认使用HikariCP
+    }
+
+    private HikariConfig getConfig() {
+        HikariConfig hikariConfig = new HikariConfig();
+        hikariConfig.setDriverClassName(driveClass);
+        hikariConfig.setJdbcUrl(url);
+        hikariConfig.setUsername(username);
+        hikariConfig.setPassword(password);
+
+        hikariConfig.setMaximumPoolSize(maxPoolSize);
+        hikariConfig.setMinimumIdle(minIdle);
+        hikariConfig.setConnectionTestQuery(connectionTestQuery);
+        hikariConfig.setMaxLifetime(maxLifetime);
+        hikariConfig.setIdleTimeout(idleTimeout);
+        hikariConfig.setConnectionTimeout(connectionTimeout);
+        hikariConfig.setValidationTimeout(validTimeout);
+        return hikariConfig;
+    }
+
+    @Bean("mainSqlSessionFactory")
+    public SqlSessionFactory mainSqlSessionFactoryBean(@Qualifier("mainDatasource") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+        sessionFactoryBean.setDataSource(dataSource);
+
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setCallSettersOnNulls(true);       //数据库中字段值为null时也要求返回
+        configuration.setMapUnderscoreToCamelCase(true); //开启驼峰映射
+        configuration.setCacheEnabled(false);
+        sessionFactoryBean.setConfiguration(configuration);
+        return sessionFactoryBean.getObject();
+    }
+
+    @Bean("mainSqlSessionTemplate")
+    public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sessionFactory) {
+        return new SqlSessionTemplate(sessionFactory);
+    }
+
+    @Bean(name = "mainDbTransactionManager")
+    public DataSourceTransactionManager mainDbTransactionManager(@Qualifier("mainDatasource") DataSource dataSource){
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+    @PostConstruct
+    public void init(){
+        GlobalData.getInstance().setPostGisValid("org.postgis.DriverWrapper".equals(driveClass));
+    }
+}

+ 94 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/control/KprXuChangWaterController.java

@@ -0,0 +1,94 @@
+package io.github.pnoker.gateway.control;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import io.github.pnoker.gateway.JPBean.JPKprXuChangWaterSS;
+import io.github.pnoker.gateway.bizmgr.KprXuChangWaterBizFun;
+import io.github.pnoker.gateway.comtool.CommTool;
+import io.github.pnoker.gateway.comtool.HttpTool;
+import io.github.pnoker.gateway.config.GlobalData;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import retrofit2.http.POST;
+import io.github.pnoker.gateway.comtool.ResponseCode;
+
+import javax.servlet.http.HttpServletRequest;
+import java.nio.CharBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @ClassName TestController
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/1/31
+ * @Version V1.0
+ **/
+@RestController
+@RequestMapping("/iot-cloud/gateway/xuchang/water")
+public class KprXuChangWaterController {
+
+    WebClient webClient = WebClient.builder().codecs(configurer->configurer.defaultCodecs().maxInMemorySize(262144)).build();
+
+    @RequestMapping(value = "/newlist",method = {RequestMethod.POST})
+    public Mono<JSONObject> testMono(ServerHttpRequest serverHttpRequest){
+        JSONObject oRes = new JSONObject();
+        long llReqBefore = System.currentTimeMillis();
+        oRes.set("rescode",ResponseCode.RESULT_BAD.toStrCode());
+        oRes.set("msg",".error");
+        oRes.set("resdata","");
+        oRes.set("timestamp", System.currentTimeMillis());
+        try {
+            //TODO webflux获取body
+            Flux<DataBuffer> body = serverHttpRequest.getBody();
+            AtomicReference<String> bodyRef = new AtomicReference<>();
+            body.subscribe(buffer -> {
+                CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
+                DataBufferUtils.release(buffer);
+                bodyRef.set(charBuffer.toString());
+            });
+            String bodyStr = bodyRef.get();
+            if(StringUtils.isEmpty(bodyStr)){
+                oRes.set("rescode", ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode());
+                oRes.set("msg", ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrMsg());
+                return Mono.just(oRes);
+            }
+            com.alibaba.fastjson.JSONObject jObj = com.alibaba.fastjson.JSONObject.parseObject(bodyStr);
+            JPKprXuChangWaterSS oJsonParam = jObj.toJavaObject(JPKprXuChangWaterSS.class);
+            if (oJsonParam == null
+                    || !oJsonParam.checkValid()) {
+                oRes.set("rescode", ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode());
+                oRes.set("msg", ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrMsg());
+                return Mono.just(oRes);
+            }
+
+
+            List<Map<String, Object>> resResultList = KprXuChangWaterBizFun.dataCenterTogether(oJsonParam);
+            if (!CollectionUtils.isEmpty(resResultList)) {
+                oRes.set("rescode", ResponseCode.RESULT_NORMAL.toStrCode());
+                oRes.set("msg", ".success");
+                oRes.set("resdata", com.alibaba.fastjson.JSONObject.toJSONString(resResultList));
+            }
+
+            return Mono.just(oRes);
+        }catch(Exception ex){
+            ex.printStackTrace();
+            oRes.set("rescode", ResponseCode.RESULT_BAD.toStrCode());
+            oRes.set("msg", ".error");
+            return Mono.just(oRes);
+        }
+    }
+
+}

+ 0 - 34
dc3-gateway/src/main/java/io/github/pnoker/gateway/control/TestController.java

@@ -1,34 +0,0 @@
-package io.github.pnoker.gateway.control;
-
-import cn.hutool.json.JSONObject;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.reactive.function.client.WebClient;
-import reactor.core.publisher.Mono;
-import retrofit2.http.POST;
-
-/**
- * @ClassName TestController
- * @Description: TODO
- * @Author LX
- * @Date 2024/1/31
- * @Version V1.0
- **/
-@RestController
-@RequestMapping("/getaway/test")
-public class TestController {
-
-    WebClient webClient = WebClient.builder().codecs(configurer->configurer.defaultCodecs().maxInMemorySize(262144)).build();
-
-    @RequestMapping(value = "/testMono",method = {RequestMethod.POST})
-    public Mono<JSONObject> testMono(ServerHttpRequest serverHttpRequest){
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.set("code","0");
-        jsonObject.set("msg",".success");
-        jsonObject.set("resdata","{'name':'lixing'}");
-        return Mono.just(jsonObject);
-    }
-
-}

+ 46 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/DBMgrProxy.java

@@ -0,0 +1,46 @@
+package io.github.pnoker.gateway.dbdao;
+
+import io.github.pnoker.gateway.SpringContextUtil;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerMeterDayReadService;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerWaterConfigService;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerWaterInfoService;
+
+/**
+ * @ClassName DBMgrProxy
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/20
+ * @Version V1.0
+ **/
+public class DBMgrProxy {
+    private volatile XuChangCustomerWaterConfigService xuchangCustomerWaterConfigService= null;
+    private volatile XuChangCustomerWaterInfoService xuChangCustomerWaterInfoService= null;
+    private volatile XuChangCustomerMeterDayReadService xuChangCustomerMeterDayReadService= null;
+
+    private static volatile DBMgrProxy msInstance = null;
+    public static DBMgrProxy getInstance(){
+        if (msInstance == null){
+            synchronized (DBMgrProxy.class){
+                if (msInstance == null)
+                    msInstance = new DBMgrProxy();
+            }
+        }
+        return msInstance;
+    }
+
+    private DBMgrProxy() {
+    }
+
+    public void init(){
+        if (xuchangCustomerWaterConfigService == null)
+            xuchangCustomerWaterConfigService = (XuChangCustomerWaterConfigService) SpringContextUtil.getBean(XuChangCustomerWaterConfigService.class);
+        if (xuChangCustomerWaterInfoService == null)
+            xuChangCustomerWaterInfoService = (XuChangCustomerWaterInfoService)SpringContextUtil.getBean(XuChangCustomerWaterInfoService.class);
+        if (xuChangCustomerMeterDayReadService == null)
+            xuChangCustomerMeterDayReadService = (XuChangCustomerMeterDayReadService)SpringContextUtil.getBean(XuChangCustomerMeterDayReadService.class);
+    }
+
+    public XuChangCustomerWaterConfigService applyXuchangCustomerWaterConfigApi() { return xuchangCustomerWaterConfigService; }
+    public XuChangCustomerWaterInfoService applyXuchangCustomerWaterInfoApi() { return xuChangCustomerWaterInfoService; }
+    public XuChangCustomerMeterDayReadService applyXuChangCustomerMeterDayReadApi() { return xuChangCustomerMeterDayReadService; }
+}

+ 96 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangCustomerMeterDayReadMapper.java

@@ -0,0 +1,96 @@
+package io.github.pnoker.gateway.dbdao.mapper;
+
+import io.github.pnoker.gateway.dbdao.providers.XuChangCustomerMeterDayReadProvider;
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerMeterDayReadTable;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigMapper
+ * @Description: TODO 许昌户表配置信息
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public interface XuChangCustomerMeterDayReadMapper extends XuChangCustomerMeterDayReadTable {
+    @SelectProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "listAllWiths")
+    List<Map<String, Object>> listAllWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("limit") int limit
+            , @Param("offset") int offset
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "totalCounts")
+    int totalCounts(@Param("table") String table,
+                    @Param("andWheres") Map<String, Object> andWheres,
+                    @Param("orWheres") Map<String, Object> orWheres,
+                    @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "batchQueryIn")
+    List<Map<String, Object>> batchQueryIn(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("ids") List<? extends Object> ids
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "existsLine")
+    boolean existLine(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @InsertProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "batchInsertsOrUpdate")
+    int batchInsertOrUpdate(@Param("inserts") List<Map<String, Object>> inserts
+            , @Param("uniques") List<Object> uniques
+            , @Param("updates") List<Object> updates);
+
+    @InsertProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "insertOrUpdateEx")
+    int insertOrUpdate(@Param("inserts") Map<String, Object> inserts
+            , @Param("uniques") List<? extends Object> uniques
+            , @Param("updates") List<? extends Object> updates);
+
+    @InsertProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "updateWiths")
+    int updateWiths(@Param("datas") Map<String, Object> datas
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @DeleteProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "deleteInIds")
+    int batchDeleteIn(@Param("ids") List<? extends Object> ids, @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("id") Object id);
+
+    @InsertProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "batchInserts")
+    int batchInserts(@Param("inserts") List<Map<String, Object>> inserts);
+
+    @UpdateProvider(type = XuChangCustomerMeterDayReadProvider.class, method = "batchUpdateWiths")
+    int batchUpdates(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+
+
+}

+ 87 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangCustomerWaterConfigMapper.java

@@ -0,0 +1,87 @@
+package io.github.pnoker.gateway.dbdao.mapper;
+
+import io.github.pnoker.gateway.dbdao.providers.XuChangCustomerWaterConfigProvider;
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerWaterConfigTable;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigMapper
+ * @Description: TODO 许昌户表配置信息
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public interface XuChangCustomerWaterConfigMapper extends XuChangCustomerWaterConfigTable {
+    @SelectProvider(type = XuChangCustomerWaterConfigProvider.class, method = "listAllWiths")
+    List<Map<String, Object>> listAllWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("limit") int limit
+            , @Param("offset") int offset
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterConfigProvider.class, method = "totalCounts")
+    int totalCounts(@Param("table") String table,
+                    @Param("andWheres") Map<String, Object> andWheres,
+                    @Param("orWheres") Map<String, Object> orWheres,
+                    @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterConfigProvider.class, method = "batchQueryIn")
+    List<Map<String, Object>> batchQueryIn(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("ids") List<? extends Object> ids
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterConfigProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterConfigProvider.class, method = "existsLine")
+    boolean existLine(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @InsertProvider(type = XuChangCustomerWaterConfigProvider.class, method = "batchInsertsOrUpdate")
+    int batchInsertOrUpdate(@Param("inserts") List<Map<String, Object>> inserts
+            , @Param("uniques") List<Object> uniques
+            , @Param("updates") List<Object> updates);
+
+    @InsertProvider(type = XuChangCustomerWaterConfigProvider.class, method = "insertOrUpdateEx")
+    int insertOrUpdate(@Param("inserts") Map<String, Object> inserts
+            , @Param("uniques") List<? extends Object> uniques
+            , @Param("updates") List<? extends Object> updates);
+
+    @InsertProvider(type = XuChangCustomerWaterConfigProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = XuChangCustomerWaterConfigProvider.class, method = "updateWiths")
+    int updateWiths(@Param("datas") Map<String, Object> datas
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @DeleteProvider(type = XuChangCustomerWaterConfigProvider.class, method = "deleteInIds")
+    int batchDeleteIn(@Param("ids") List<? extends Object> ids, @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterConfigProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("id") Object id);
+}

+ 94 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangCustomerWaterInfoMapper.java

@@ -0,0 +1,94 @@
+package io.github.pnoker.gateway.dbdao.mapper;
+
+import io.github.pnoker.gateway.dbdao.providers.XuChangCustomerWaterInfoProvider;
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerWaterInfoTable;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigMapper
+ * @Description: TODO 许昌户表配置信息
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public interface XuChangCustomerWaterInfoMapper extends XuChangCustomerWaterInfoTable {
+    @SelectProvider(type = XuChangCustomerWaterInfoProvider.class, method = "listAllWiths")
+    List<Map<String, Object>> listAllWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("limit") int limit
+            , @Param("offset") int offset
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterInfoProvider.class, method = "totalCounts")
+    int totalCounts(@Param("table") String table,
+                    @Param("andWheres") Map<String, Object> andWheres,
+                    @Param("orWheres") Map<String, Object> orWheres,
+                    @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterInfoProvider.class, method = "batchQueryIn")
+    List<Map<String, Object>> batchQueryIn(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("ids") List<? extends Object> ids
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterInfoProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterInfoProvider.class, method = "existsLine")
+    boolean existLine(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @InsertProvider(type = XuChangCustomerWaterInfoProvider.class, method = "batchInsertsOrUpdate")
+    int batchInsertOrUpdate(@Param("inserts") List<Map<String, Object>> inserts
+            , @Param("uniques") List<Object> uniques
+            , @Param("updates") List<Object> updates);
+
+    @InsertProvider(type = XuChangCustomerWaterInfoProvider.class, method = "insertOrUpdateEx")
+    int insertOrUpdate(@Param("inserts") Map<String, Object> inserts
+            , @Param("uniques") List<? extends Object> uniques
+            , @Param("updates") List<? extends Object> updates);
+
+    @InsertProvider(type = XuChangCustomerWaterInfoProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = XuChangCustomerWaterInfoProvider.class, method = "updateWiths")
+    int updateWiths(@Param("datas") Map<String, Object> datas
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @DeleteProvider(type = XuChangCustomerWaterInfoProvider.class, method = "deleteInIds")
+    int batchDeleteIn(@Param("ids") List<? extends Object> ids, @Param("extend") String extend);
+
+    @SelectProvider(type = XuChangCustomerWaterInfoProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("id") Object id);
+
+    @InsertProvider(type = XuChangCustomerWaterInfoProvider.class, method = "batchInserts")
+    int batchInserts(@Param("inserts") List<Map<String, Object>> inserts);
+
+    @UpdateProvider(type = XuChangCustomerWaterInfoProvider.class, method = "batchUpdateWiths")
+    int batchUpdates(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+}

+ 40 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/mapper/XuChangDayReadNewMapper.java

@@ -0,0 +1,40 @@
+package io.github.pnoker.gateway.dbdao.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangDayReadNewMapper
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/3
+ * @Version V1.0
+ **/
+public interface XuChangDayReadNewMapper {
+
+
+
+    /**
+     * @Author Lx
+     * @Description //TODO 简洁查询指定时间的日分析数据
+     * @Date 15:36 2024/2/3
+     * @Param
+     * @return
+     **/
+    @Select(" SELECT cwi.uid AS cwiUid,cwi.user_code AS userCode,cwi.user_name AS userName,cwi.door_plate AS doorPlate,\n" +
+            " cwi.address AS address,cwi.meter_addr AS meterAddr,cwi.meter_type_name AS meterTypeName,cwi.phone AS phone,\n" +
+            " cwi.reserve AS reserve,cwi.remnant AS remnant,cwi.gis AS gis,cwi.territory AS territory,\n" +
+            " cmdr.uid AS cmdrUid,\n" +
+            " cmdr.begin_date AS beginDate, \n" +
+            " cmdr.freeze_date AS freezeDate\n" +
+            " ,cmdr.begin_number AS beginNumber,cmdr.end_number AS endNumber,\n" +
+            " cmdr.use_number AS useNumber, cmdr.insert_date AS insertDate\n" +
+            " FROM \"k3_xuchang_customer_water_info\" AS cwi\n" +
+            " LEFT JOIN \n" +
+            " (SELECT * FROM \"k3_xuchang_customer_meter_day_read\" AS childcmdr WHERE childcmdr.freeze_date='${freezeDate}') AS cmdr\n" +
+            " ON cwi.meter_addr = cmdr.meter_addr\n")
+    List<Map<String,Object>> selectXuChangDayReadList(@Param("freezeDate") String freezeDate);
+}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1076 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/BaseSqlProvider.java


+ 60 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/XuChangCustomerMeterDayReadProvider.java

@@ -0,0 +1,60 @@
+package io.github.pnoker.gateway.dbdao.providers;
+
+
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerMeterDayReadTable;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigProvider
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public class XuChangCustomerMeterDayReadProvider extends BaseSqlProvider implements XuChangCustomerMeterDayReadTable {
+    @Override
+    public String getRTableName() {
+        return R_INFO.TABLE;
+    }
+
+    @Override
+    public String getWTableName() {
+        return W_INFO.TABLE;
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return R_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return W_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return R_INFO.ALL_FILED;
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return R_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return W_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+//        if (W_INFO.CREATE_TIME.equalsIgnoreCase(filedName)) //create_time定义为long型用于高效排序
+//            return false;
+        return (filedName.endsWith("time"));
+    }
+}

+ 60 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/XuChangCustomerWaterConfigProvider.java

@@ -0,0 +1,60 @@
+package io.github.pnoker.gateway.dbdao.providers;
+
+
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerWaterConfigTable;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigProvider
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public class XuChangCustomerWaterConfigProvider extends BaseSqlProvider implements XuChangCustomerWaterConfigTable {
+    @Override
+    public String getRTableName() {
+        return R_INFO.TABLE;
+    }
+
+    @Override
+    public String getWTableName() {
+        return W_INFO.TABLE;
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return R_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return W_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return R_INFO.ALL_FILED;
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return R_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return W_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+//        if (W_INFO.CREATE_TIME.equalsIgnoreCase(filedName)) //create_time定义为long型用于高效排序
+//            return false;
+        return (filedName.endsWith("time"));
+    }
+}

+ 60 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/providers/XuChangCustomerWaterInfoProvider.java

@@ -0,0 +1,60 @@
+package io.github.pnoker.gateway.dbdao.providers;
+
+
+import io.github.pnoker.gateway.dbdao.tables.XuChangCustomerWaterInfoTable;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigProvider
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public class XuChangCustomerWaterInfoProvider extends BaseSqlProvider implements XuChangCustomerWaterInfoTable {
+    @Override
+    public String getRTableName() {
+        return R_INFO.TABLE;
+    }
+
+    @Override
+    public String getWTableName() {
+        return W_INFO.TABLE;
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return R_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return W_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return R_INFO.ALL_FILED;
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return R_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return W_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+//        if (W_INFO.CREATE_TIME.equalsIgnoreCase(filedName)) //create_time定义为long型用于高效排序
+//            return false;
+        return (filedName.endsWith("time"));
+    }
+}

+ 216 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/XuChangCustomerMeterDayReadServiceImpl.java

@@ -0,0 +1,216 @@
+package io.github.pnoker.gateway.dbdao.services;
+
+import io.github.pnoker.gateway.dbdao.mapper.XuChangCustomerMeterDayReadMapper;
+import io.github.pnoker.gateway.dbdao.mapper.XuChangDayReadNewMapper;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerMeterDayReadService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterInfoServiceImpl
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+@Service
+public class XuChangCustomerMeterDayReadServiceImpl implements XuChangCustomerMeterDayReadService {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+    private static final Logger log = LoggerFactory.getLogger(XuChangCustomerMeterDayReadServiceImpl.class);
+
+    public XuChangCustomerMeterDayReadServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = " XuChangCustomerMeterDayRead";
+        logTag = "XuChangCustomerMeterDayRead";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    private XuChangCustomerMeterDayReadMapper xuChangCustomerMeterDayReadMapper;
+    @SuppressWarnings("all")
+    @Autowired
+    private XuChangDayReadNewMapper xuChangDayReadNewMapper;
+
+    @Override
+    public int totalCountsEx(String table, Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerMeterDayReadMapper.totalCounts(table, andWheres, orWheres, extend);
+        }catch (Exception e){
+            return 0;
+        }finally {
+            log.info(nCode+
+                    mBusinessType+
+                    mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWithsEx(String table, String filed, Map<String, Object> andWheres, Map<String, Object> orWheres, String order, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = xuChangCustomerMeterDayReadMapper.listAllWiths("", "", limit, offset, andWheres, orWheres, orderBy, extend);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryIn(List<?> ids, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWiths(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerMeterDayReadMapper.getOne("", "", id);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return null;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int insertByMap(Map<String, Object> maps) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerMeterDayReadMapper.inserts(maps);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return -1;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    + String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int updateWiths(Map<String, Object> datas, Map<String, Object> andWheres) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerMeterDayReadMapper.updateWiths(datas, andWheres, null, "");
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return -1;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    + String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int delete(Object id) {
+        return 0;
+    }
+
+    @Override
+    public int batchDeleteIn(List<?> ids, String extend) {
+        return 0;
+    }
+
+    @Override
+    public int bacthInserts(List<Map<String, Object>> maps) {
+        try {
+            int nRes = xuChangCustomerMeterDayReadMapper.batchInserts(maps);
+            if (nRes > 0) {
+                return nRes;
+            }
+        }catch(Exception ex){
+            ex.printStackTrace();
+            return 0;
+        }
+        return 0;
+    }
+
+    @Override
+    public int bacthUpdates(List<Map<String, Object>> maps,List<Map<String, Object>> andWheres) {
+        try {
+            int nRes = xuChangCustomerMeterDayReadMapper.batchUpdates(andWheres,maps);
+            if (nRes > 0) {
+                return nRes;
+            }
+        }catch(Exception ex){
+            ex.printStackTrace();
+            return 0;
+        }
+        return 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> selectXuChangDayReadList(String freezeDate) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = xuChangDayReadNewMapper.selectXuChangDayReadList(freezeDate);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+        return arrRes;
+    }
+}

+ 178 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/XuChangCustomerWaterConfigServiceImpl.java

@@ -0,0 +1,178 @@
+package io.github.pnoker.gateway.dbdao.services;
+
+import io.github.pnoker.gateway.dbdao.mapper.XuChangCustomerWaterConfigMapper;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerWaterConfigService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigServiceImpl
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+@Service
+public class XuChangCustomerWaterConfigServiceImpl implements XuChangCustomerWaterConfigService {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+
+    private static final Logger log = LoggerFactory.getLogger(XuChangCustomerWaterConfigServiceImpl.class);
+
+    public XuChangCustomerWaterConfigServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = "XuChangCustomerWaterConfig";
+        logTag = "XuchangCustomerWaterConfig";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    private XuChangCustomerWaterConfigMapper xuChangCustomerWaterConfigMapper;
+
+    @Override
+    public int totalCountsEx(String table, Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterConfigMapper.totalCounts(table, andWheres, orWheres, extend);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    + String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return 0;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWithsEx(String table, String filed, Map<String, Object> andWheres, Map<String, Object> orWheres, String order, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = xuChangCustomerWaterConfigMapper.listAllWiths("", "", limit, offset, andWheres, orWheres, orderBy, extend);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryIn(List<?> ids, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWiths(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterConfigMapper.getOne("", "", id);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return null;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int insertByMap(Map<String, Object> maps) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterConfigMapper.inserts(maps);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return -1;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int updateWiths(Map<String, Object> datas, Map<String, Object> andWheres) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterConfigMapper.updateWiths(datas, andWheres, null, "");
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return -1;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int delete(Object id) {
+        return 0;
+    }
+
+    @Override
+    public int batchDeleteIn(List<?> ids, String extend) {
+        return 0;
+    }
+}

+ 202 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/XuChangCustomerWaterInfoServiceImpl.java

@@ -0,0 +1,202 @@
+package io.github.pnoker.gateway.dbdao.services;
+
+import io.github.pnoker.gateway.dbdao.mapper.XuChangCustomerWaterInfoMapper;
+import io.github.pnoker.gateway.dbdao.services.intef.XuChangCustomerWaterInfoService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterInfoServiceImpl
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+@Service
+public class XuChangCustomerWaterInfoServiceImpl implements XuChangCustomerWaterInfoService {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+
+    private static final Logger log = LoggerFactory.getLogger(XuChangCustomerWaterInfoServiceImpl.class);
+
+    public XuChangCustomerWaterInfoServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = "XuChangCustomerWaterInfo";
+        logTag = "XuChangCustomerWaterInfo";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    private XuChangCustomerWaterInfoMapper xuChangCustomerWaterInfoMapper;
+
+    @Override
+    public int totalCountsEx(String table, Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterInfoMapper.totalCounts(table, andWheres, orWheres, extend);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return 0;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWithsEx(String table, String filed, Map<String, Object> andWheres, Map<String, Object> orWheres, String order, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = xuChangCustomerWaterInfoMapper.listAllWiths("", "", limit, offset, andWheres, orWheres, orderBy, extend);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    + String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryIn(List<?> ids, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWiths(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterInfoMapper.getOne("", "", id);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    + String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return null;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int insertByMap(Map<String, Object> maps) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterInfoMapper.inserts(maps);
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return -1;
+        }finally {
+            log.info(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int updateWiths(Map<String, Object> datas, Map<String, Object> andWheres) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return xuChangCustomerWaterInfoMapper.updateWiths(datas, andWheres, null, "");
+        }catch (Exception e){
+            nCode = 2;
+            strMsg = e.getLocalizedMessage();
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+            return -1;
+        }finally {
+            nCode = 2;
+            log.error(nCode+
+                            mBusinessType+
+                            mStrClassName
+                    +String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public int delete(Object id) {
+        return 0;
+    }
+
+    @Override
+    public int batchDeleteIn(List<?> ids, String extend) {
+        return 0;
+    }
+
+    @Override
+    public int bacthInserts(List<Map<String, Object>> maps) {
+        try {
+            int nRes = xuChangCustomerWaterInfoMapper.batchInserts(maps);
+            if (nRes > 0) {
+                return nRes;
+            }
+        }catch(Exception ex){
+            ex.printStackTrace();
+            return 0;
+        }
+        return 0;
+    }
+
+    @Override
+    public int bacthUpdates(List<Map<String, Object>> maps,List<Map<String, Object>> andWheres) {
+        try {
+            int nRes = xuChangCustomerWaterInfoMapper.batchUpdates(andWheres,maps);
+            if (nRes > 0) {
+                return nRes;
+            }
+        }catch(Exception ex){
+            ex.printStackTrace();
+            return 0;
+        }
+        return 0;
+    }
+}

+ 29 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/BaseDBService.java

@@ -0,0 +1,29 @@
+package io.github.pnoker.gateway.dbdao.services.intef;
+
+import java.util.List;
+import java.util.Map;
+
+public interface BaseDBService {
+    List<Map<String, Object>> listAllWiths(int limit
+            , int offset
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String orderBy
+            , String extend);
+
+    List<Map<String, Object>> batchQueryIn(List<? extends Object> ids
+            , String orderBy
+            , String extend);
+
+    List<Map<String, Object>> batchQueryWiths(Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String orderBy
+            , String extend);
+
+    int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres);
+    Map<String, Object> getOne(Object id);
+    int insertByMap(Map<String, Object> maps);
+    int updateWiths(Map<String, Object> datas, Map<String, Object> andWheres);
+    int delete(Object id);
+    int batchDeleteIn(List<? extends Object> ids, String extend);
+}

+ 33 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/XuChangCustomerMeterDayReadService.java

@@ -0,0 +1,33 @@
+package io.github.pnoker.gateway.dbdao.services.intef;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigService
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public interface XuChangCustomerMeterDayReadService extends BaseDBService{
+    int totalCountsEx(String table
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String extend);
+
+    List<Map<String, Object>> batchQueryWithsEx(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    int bacthInserts(List<Map<String, Object>> maps);
+    int bacthUpdates(List<Map<String, Object>> maps, List<Map<String, Object>> andWheres);
+
+    //TODO 简洁查询指定日期的日用量信息
+    List<Map<String,Object>> selectXuChangDayReadList(String freezeDate);
+}

+ 27 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/XuChangCustomerWaterConfigService.java

@@ -0,0 +1,27 @@
+package io.github.pnoker.gateway.dbdao.services.intef;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigService
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public interface XuChangCustomerWaterConfigService extends BaseDBService{
+    int totalCountsEx(String table
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String extend);
+
+    List<Map<String, Object>> batchQueryWithsEx(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+}

+ 30 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/services/intef/XuChangCustomerWaterInfoService.java

@@ -0,0 +1,30 @@
+package io.github.pnoker.gateway.dbdao.services.intef;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName XuChangCustomerWaterConfigService
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/2/2
+ * @Version V1.0
+ **/
+public interface XuChangCustomerWaterInfoService extends BaseDBService{
+    int totalCountsEx(String table
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String extend);
+
+    List<Map<String, Object>> batchQueryWithsEx(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    int bacthInserts(List<Map<String, Object>> maps);
+    int bacthUpdates(List<Map<String, Object>> maps, List<Map<String, Object>> andWheres);
+}

+ 19 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/tables/XuChangCustomerMeterDayReadTable.java

@@ -0,0 +1,19 @@
+package io.github.pnoker.gateway.dbdao.tables;
+
+public interface XuChangCustomerMeterDayReadTable {
+    interface R_INFO{
+        String TABLE = "k3_xuchang_customer_meter_day_read";
+        String PRIMARY_KEY = "uid";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID 4)联合主键字段
+        String UNIQUE_ID = "uid";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID
+
+        String ALL_FILED = "*";
+        String DEFAULT_ORDER = "uid DESC";
+        String DEFAULT_EXTEND = "";
+    }
+
+    interface W_INFO{
+        String TABLE = "k3_xuchang_customer_meter_day_read";
+        String PRIMARY_KEY = "uid";//赋值优先级:赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID 4)联合主键字段
+        String UNIQUE_ID = "uid";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID
+    }
+}

+ 27 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/tables/XuChangCustomerWaterConfigTable.java

@@ -0,0 +1,27 @@
+package io.github.pnoker.gateway.dbdao.tables;
+
+public interface XuChangCustomerWaterConfigTable {
+    interface R_INFO{
+        String TABLE = "k3_xuchang_customer_meter_config";
+        String PRIMARY_KEY = "id";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID 4)联合主键字段
+        String UNIQUE_ID = "id";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID
+
+        String USER_CODE = "user_code";
+        String USER_NAME = "user_name";
+        String METER_ADDR = "meter_addr";
+
+        String ALL_FILED = "*";
+        String DEFAULT_ORDER = "id DESC";
+        String DEFAULT_EXTEND = "";
+    }
+
+    interface W_INFO{
+        String TABLE = "k3_xuchang_customer_meter_config";
+        String PRIMARY_KEY = "id";//赋值优先级:赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID 4)联合主键字段
+        String UNIQUE_ID = "id";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID
+
+        String USER_CODE = "user_code";
+        String USER_NAME = "user_name";
+        String METER_ADDR = "meter_addr";
+    }
+}

+ 27 - 0
dc3-gateway/src/main/java/io/github/pnoker/gateway/dbdao/tables/XuChangCustomerWaterInfoTable.java

@@ -0,0 +1,27 @@
+package io.github.pnoker.gateway.dbdao.tables;
+
+public interface XuChangCustomerWaterInfoTable {
+    interface R_INFO{
+        String TABLE = "k3_xuchang_customer_water_info";
+        String PRIMARY_KEY = "uid";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID 4)联合主键字段
+        String UNIQUE_ID = "uid";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID
+
+        String USER_CODE = "user_code";
+        String USER_NAME = "user_name";
+        String METER_ADDR = "meter_addr";
+
+        String ALL_FILED = "*";
+        String DEFAULT_ORDER = "uid DESC";
+        String DEFAULT_EXTEND = "";
+    }
+
+    interface W_INFO{
+        String TABLE = "k3_xuchang_customer_water_info";
+        String PRIMARY_KEY = "uid";//赋值优先级:赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID 4)联合主键字段
+        String UNIQUE_ID = "uid";//赋值优先级:1)单主键字段 2)单唯一索引字段 3)自增ID
+
+        String USER_CODE = "user_code";
+        String USER_NAME = "user_name";
+        String METER_ADDR = "meter_addr";
+    }
+}

+ 2 - 0
dc3-gateway/src/main/resources/application-dev.yml

@@ -32,3 +32,5 @@ spring:
         watch-delay: 5000
         username: dc3
         password: dc3
+        #服务器配置
+        server-addr: 127.0.0.1:8849

+ 22 - 1
dc3-gateway/src/main/resources/application.yml

@@ -15,7 +15,8 @@
 #
 
 server:
-  port: 8000
+  #服务器配置
+  port: 9309
   undertow:
     threads:
       io: 2
@@ -125,9 +126,29 @@ spring:
             # args:
             #   name: default
             #   fallbackUri: 'forward:/fallback'
+  datasource:
+      driver-class-name: org.postgis.DriverWrapper
+      jdbc-url: jdbc:postgresql_postGIS://119.96.165.176:5432/watersmart?useSSL=false&useAffectedRows=false&allowMultiQueries=true
+      username: postgres
+      password: kpr.23417.postgres
+      data:
+        maximum-pool-size: 200
+        validation-query: SELECT 1
+        connection-test-query: SELECT 1
+        test-on-return: false
+        idle-timeout: 30000
+        connection-timeout: 30000
+  jpa:
+    show-sql: false
 
 logging:
   level:
     io.github.pnoker: DEBUG
   file:
     name: dc3/logs/gateway/${spring.application.name}.log
+
+#许昌八百支户表相关参数配置,密码为MD532位大写前二十位
+xuchang:
+  user: zzsfy
+  pwd: D41D8CD98F00B204E980
+  url: http://42.227.69.38:8004/WebServiceOfNBIoT.asmx

+ 4 - 1
dc3/docker-compose-dev.yml

@@ -21,9 +21,12 @@ services:
     image: registry.cn-beijing.aliyuncs.com/dc3/dc3-center-register:4.0.0-nacos
     restart: on-failure
     ports:
-      - "8848:8848"
+      #服务器配置
+      - "8849:8849"
       - "9848:9848"
       - "9555:9555"
+      #服务器配置
+      - "9849:9849"
     environment:
       - PREFER_HOST_MODE=hostname
       - MODE=standalone