8
0

6 کامیت‌ها b8c2841758 ... f1bd1c57f6

نویسنده SHA1 پیام تاریخ
  ximinghao f1bd1c57f6 抽取微信第三方服务baseURL配置 1 هفته پیش
  ximinghao 044953151c 简单优化及bug修复 1 هفته پیش
  ximinghao 4c02799ce7 楼宇级别企业行业统计聚合到门类 1 هفته پیش
  ximinghao 14fb0f3593 完成统计接口所需新功能,引入高级查询降低企业表的性能影响 1 هفته پیش
  ximinghao 0e9dc1820a 提取角色配置到环境变量 2 هفته پیش
  ximinghao 64296e0c86 改造,提取column配置到配置文件 2 هفته پیش
25فایلهای تغییر یافته به همراه793 افزوده شده و 130 حذف شده
  1. 7 0
      application.yml
  2. 2 0
      src/main/java/com/skyversation/xjcy/bean/Enterprise.java
  3. 7 7
      src/main/java/com/skyversation/xjcy/controller/LoginController.java
  4. 5 2
      src/main/java/com/skyversation/xjcy/controller/OtherController.java
  5. 4 2
      src/main/java/com/skyversation/xjcy/controller/SerialNumberController.java
  6. 22 18
      src/main/java/com/skyversation/xjcy/dms/DMSColumn.java
  7. 37 0
      src/main/java/com/skyversation/xjcy/dms/DMSColumnConfig.java
  8. 2 2
      src/main/java/com/skyversation/xjcy/dms/DMSImport.java
  9. 1 4
      src/main/java/com/skyversation/xjcy/dms/DMSQuery.java
  10. 104 15
      src/main/java/com/skyversation/xjcy/dms/DMSService.java
  11. 124 0
      src/main/java/com/skyversation/xjcy/dms/complex/DMSComplexQueryRequest.java
  12. 63 0
      src/main/java/com/skyversation/xjcy/dms/complex/condition/ConditionItem.java
  13. 38 0
      src/main/java/com/skyversation/xjcy/dms/complex/condition/ConditionList.java
  14. 12 0
      src/main/java/com/skyversation/xjcy/dms/complex/condition/Conditions.java
  15. 10 0
      src/main/java/com/skyversation/xjcy/dms/complex/condition/FieldValue.java
  16. 9 0
      src/main/java/com/skyversation/xjcy/dms/complex/groupBy/GroupByItem.java
  17. 22 0
      src/main/java/com/skyversation/xjcy/dms/complex/join/JoinColumn.java
  18. 4 0
      src/main/java/com/skyversation/xjcy/dms/complex/join/JoinColumns.java
  19. 19 0
      src/main/java/com/skyversation/xjcy/dms/complex/selectItem/SelectItem.java
  20. 19 0
      src/main/java/com/skyversation/xjcy/dms/complex/subQuery/SubQuery.java
  21. 77 7
      src/main/java/com/skyversation/xjcy/service/AuthService.java
  22. 137 43
      src/main/java/com/skyversation/xjcy/service/DataCountService.java
  23. 49 20
      src/main/java/com/skyversation/xjcy/service/SerialNumberGenerator.java
  24. 11 9
      src/main/java/com/skyversation/xjcy/service/WeChatService.java
  25. 8 1
      src/main/resources/application.yml

+ 7 - 0
application.yml

@@ -0,0 +1,7 @@
+#
+app:
+  dms:
+    column:
+      data: '{"INDUSTRIAL_PARK":{"id":"1580","modelId":"1525"},"ENTERPRISE":{"id":"1593","modelId":"1537"},"ENTERPRISE_ECONOMIC":{"id":"1594","modelId":"1538"},"ORDER":{"id":"1587","modelId":"1531"},"LEASE_DETAIL":{"id":"1574","modelId":"1520"},"INVESTMENT_TARGET":{"id":"1578","modelId":"1523"},"CLUE":{"id":"1576","modelId":"1521"},"CLUE_FOLLOW":{"id":"1577","modelId":"1522"},"ENTERPRISE_HEALTH":{"id":"1643","modelId":"1643"},"WECHAT_ARTICLE":{"id":"1599","modelId":"1544"},"MESSAGE":{"id":"1646","modelId":"1649"},"USER":{"id":"1579","modelId":"1524"},"MESSAGE_TARGET":{"id":"1661","modelId":"1671"},"LCXM":{"id":"1660","modelId":"1669"},"INSPECTION_TASK":{"id":"1616","modelId":"1576"},"ENTERPRISE_PRODUCT":{"id":"1592","modelId":"1536"},"ENTERPRISE_PURCHASE":{"id":"1591","modelId":"1535"},"INDUSTRIAL_MANAGE":{"id":"1645","modelId":"1647"}}'
+  oauth:
+    role-config: '{"ENTERPRISE_ROLE":[{"roleId":"40","serviceId":"11","comment":"企业用户权限,pc端"},{"roleId":"44","serviceId":"12","comment":"企业用户权限,wx小程序端"}],"INIT_ROLE":[{"roleId":"41","serviceId":"11","comment":"普通游客权限,pc端"},{"roleId":"45","serviceId":"12","comment":"普通游客权限,wx小程序端"},{"roleId":"48","serviceId":"2","comment":"徐泾一般用户,dms"}]}'

+ 2 - 0
src/main/java/com/skyversation/xjcy/bean/Enterprise.java

@@ -35,6 +35,8 @@ public class Enterprise implements FromJSON ,DateInterval {
     private String cIsKeyProjectQp;
     @JSONField(deserializeUsing = LocalDateFromTimestampDeserializer.class)
     private LocalDate gsqyTime;
+    private String cNationalIndustryCode;
+    private String cNationalIndustry;
     @Override
     public LocalDate getStartDate() {
         return Optional.ofNullable(cCertificateDate).orElse(LocalDate.MIN);

+ 7 - 7
src/main/java/com/skyversation/xjcy/controller/LoginController.java

@@ -72,11 +72,11 @@ public class LoginController {
             return MessageManage.getInstance().getResultContent(500, e.getMessage(), "未知错误");
         }
     }
-    @RequestMapping("/test")
-    public String testLogin(@RequestParam(required = false) String uniCode){
-        if (uniCode == null|| uniCode.isEmpty()) {
-            uniCode = "123456";
-        }
-        return authService.logOrRegTestAccount(uniCode);
-    }
+//    @RequestMapping("/test")
+//    public String testLogin(@RequestParam(required = false) String uniCode){
+//        if (uniCode == null|| uniCode.isEmpty()) {
+//            uniCode = "123456";
+//        }
+//        return authService.logOrRegTestAccount(uniCode);
+//    }
 }

+ 5 - 2
src/main/java/com/skyversation/xjcy/controller/OtherController.java

@@ -7,6 +7,7 @@ import com.google.zxing.common.HybridBinarizer;
 import com.skyversation.xjcy.bean.Lcxm;
 import com.skyversation.xjcy.bean.User;
 import com.skyversation.xjcy.dms.DMSColumn;
+import com.skyversation.xjcy.dms.DMSColumnConfig;
 import com.skyversation.xjcy.dms.DMSService;
 import com.skyversation.xjcy.service.AlyOCRService;
 import com.skyversation.xjcy.service.AuthService;
@@ -40,13 +41,15 @@ public class OtherController {
     private final DMSService dMSService;
     private final AlyOCRService alyOCRService;
     private final MessageService messageService;
+    private final DMSColumnConfig dMSColumnConfig;
 
-    public OtherController(WeChatService weChatService, AuthService authService, DMSService dMSService, AlyOCRService alyOCRService, MessageService messageService) {
+    public OtherController(WeChatService weChatService, AuthService authService, DMSService dMSService, AlyOCRService alyOCRService, MessageService messageService, DMSColumnConfig dMSColumnConfig) {
         this.weChatService = weChatService;
         this.authService = authService;
         this.dMSService = dMSService;
         this.alyOCRService = alyOCRService;
         this.messageService = messageService;
+        this.dMSColumnConfig = dMSColumnConfig;
     }
 
     @RequestMapping(value = "/wxacode", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@@ -135,7 +138,7 @@ public class OtherController {
     public String lcxm(@RequestParam Map<String,String> map, HttpServletRequest request) {
         String token = request.getHeader("token");
         if (!authService.checkToken(token)) {return MessageManage.error(-1,"不可用的token");}
-        boolean success = dMSService.insertToDms(map, token, DMSColumn.LCXM);
+        boolean success = dMSService.insertToDms(map, token,DMSColumn.LCXM);
         if (success) {
             String type = map.get("c_service_type");
             String[] types = type.split(",");

+ 4 - 2
src/main/java/com/skyversation/xjcy/controller/SerialNumberController.java

@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
+import java.util.stream.Collectors;
 
 
 @Slf4j
@@ -27,9 +28,10 @@ public class SerialNumberController {
             String prefix = request.getParameter("prefix");
             SerialNumberGenerator.Prefix p = null;
             try {
-                p = SerialNumberGenerator.Prefix.valueOf(prefix);
+                p = serialNumberGenerator.getPrefix(prefix);
             } catch (IllegalArgumentException e) {
-                return MessageManage.getInstance().getResultContent(-1,"可用前缀: " + Arrays.toString(SerialNumberGenerator.Prefix.values()),"可用前缀: " + Arrays.toString(SerialNumberGenerator.Prefix.values()));
+                String prefixes = serialNumberGenerator.getPrefixList().stream().map(SerialNumberGenerator.Prefix::toString).collect(Collectors.joining(","));
+                return MessageManage.getInstance().getResultContent(-1,"可用前缀: " +prefixes ,"可用前缀: " + prefixes);
             }
             String value = serialNumberGenerator.generate(p);
             return MessageManage.getInstance().getResultContent(200, value, "成功生成流水号");

+ 22 - 18
src/main/java/com/skyversation/xjcy/dms/DMSColumn.java

@@ -2,29 +2,33 @@ package com.skyversation.xjcy.dms;
 
 import lombok.Getter;
 
-public enum DMSColumn {
-    INDUSTRIAL_PARK("1580","1525"),
-    ENTERPRISE("1593","1537"),
-    ENTERPRISE_ECONOMIC("1594","1538"),
-    ORDER("1587","1531"),
-    LEASE_DETAIL("1574","1520"),
-    INVESTMENT_TARGET("1578","1523"),
-    CLUE("1576","1521"),
-    CLUE_FOLLOW("1577","1522"),
-    ENTERPRISE_HEALTH("1643","1643"),
-    WECHAT_ARTICLE("1599","1544"),
-    MESSAGE("1646","1649" ),
-    USER("1579","1524" ),
-    MESSAGE_TARGET("1661","1671"),
-    LCXM("1660","1669"),;
+public class DMSColumn {
+    public static String INDUSTRIAL_PARK = "INDUSTRIAL_PARK";
+    public static String ENTERPRISE = "ENTERPRISE";
+    public static String ENTERPRISE_ECONOMIC = "ENTERPRISE_ECONOMIC";
+    public static String ORDER = "ORDER";
+    public static String LEASE_DETAIL = "LEASE_DETAIL";
+    public static String INVESTMENT_TARGET = "INVESTMENT_TARGET";
+    public static String CLUE = "CLUE";
+    public static String CLUE_FOLLOW = "CLUE_FOLLOW";
+    public static String ENTERPRISE_HEALTH = "ENTERPRISE_HEALTH";
+    public static String WECHAT_ARTICLE = "WECHAT_ARTICLE";
+    public static String MESSAGE = "MESSAGE";
+    public static String USER = "USER";
+    public static String MESSAGE_TARGET = "MESSAGE_TARGET";
+    public static String LCXM = "LCXM";
+    public static String INSPECTION_TASK = "INSPECTION_TASK";
+    public static String ENTERPRISE_PRODUCT = "ENTERPRISE_PRODUCT";
+    public static String ENTERPRISE_PURCHASE = "ENTERPRISE_PURCHASE";
+    public static String INDUSTRIAL_MANAGE = "INDUSTRIAL_MANAGE";
+    
     @Getter
-    private final String id;
+    private String id;
     @Getter
-    private final String modelId;
+    private String modelId;
 
     DMSColumn(String id , String modelId) {
         this.id = id;
         this.modelId = modelId;
     }
-
 }

+ 37 - 0
src/main/java/com/skyversation/xjcy/dms/DMSColumnConfig.java

@@ -0,0 +1,37 @@
+package com.skyversation.xjcy.dms;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class DMSColumnConfig {
+    @Value("${app.dms.column.data}")
+    private String data;
+
+    @Getter
+    private Map<String, DMSColumn> dmsColumns;
+    
+    @PostConstruct
+    public void init() {
+        System.out.println("初始化dms配置");
+        JSONObject jsonObject = JSONObject.parseObject(data);
+        Map<String,DMSColumn> dmsColumns = new HashMap<>();
+        for (String key : jsonObject.keySet()) {
+            JSONObject value = jsonObject.getJSONObject(key);
+            dmsColumns.put(key,new DMSColumn(value.getString("id"),value.getString("modelId")));
+        }
+        this.dmsColumns = Collections.unmodifiableMap(dmsColumns);
+        System.out.println("从配置读取了"+dmsColumns.size()+"条栏目");
+    }
+    
+    public DMSColumn getDMSColumn(String columnName) {
+        return dmsColumns.get(columnName);
+    }
+}

+ 2 - 2
src/main/java/com/skyversation/xjcy/dms/DMSImport.java

@@ -18,13 +18,13 @@ public enum DMSImport {
             true, true);
     private final String relation;
     private final String mainKey;
-    private final DMSColumn column;
+    private final String column;
     private final String title;
     private final String content;
     private final boolean updatable;
     private final boolean insertable;
 
-    DMSImport(String relation, String mainKey, DMSColumn column, String title, String content, boolean isUpdate, boolean insertable) {
+    DMSImport(String relation, String mainKey, String column, String title, String content, boolean isUpdate, boolean insertable) {
         this.relation = relation;
         this.mainKey = mainKey;
         this.column = column;

+ 1 - 4
src/main/java/com/skyversation/xjcy/dms/DMSQuery.java

@@ -95,12 +95,9 @@ public enum DMSQuery {
         }
     };
 
-    private final DMSColumn column;
+    private final String column;
     private final Class<? extends FromJSON> resultType;
 
     abstract DMSQueryRequest preRequest(LocalDate now);
 
-    public String getColumnId() {
-        return column.getId();
-    }
 }

+ 104 - 15
src/main/java/com/skyversation/xjcy/dms/DMSService.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.skyversation.xjcy.bean.*;
+import com.skyversation.xjcy.dms.complex.DMSComplexQueryRequest;
+import com.skyversation.xjcy.dms.complex.selectItem.SelectItem;
 import com.skyversation.xjcy.util.HttpUtil;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.Resource;
@@ -17,12 +19,18 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 public class DMSService {
+    private final DMSColumnConfig dMSColumnConfig;
     @Value("${app.dms.path}")
     private String path;
 
+    public DMSService(DMSColumnConfig dMSColumnConfig) {
+        this.dMSColumnConfig = dMSColumnConfig;
+    }
+
     private static final class QueryResult {
         final LocalDateTime time = LocalDateTime.now();
         final List<JSONObject> dmsResult;
@@ -164,7 +172,7 @@ public class DMSService {
         List<JSONObject> dmsResult;
         dmsResult = getQueryCache(query);
         if (dmsResult == null) {
-            dmsResult = queryDmsList(query.preRequest(now), token, query.getColumnId());
+            dmsResult = queryDmsList(query.preRequest(now), token, dMSColumnConfig.getDMSColumn(query.getColumn()).getId());
             queryCache.put(query, new QueryResult(dmsResult));
         }
 
@@ -183,9 +191,13 @@ public class DMSService {
         HttpUtil.requestPost(path + "/content/updateContentByJson", params, headers);
     }
 
+    public void updateToDms(Collection<JSONObject> objs, String token, String column) {
+        updateToDms(objs, token, dMSColumnConfig.getDMSColumn(column));
+    }
+
     public String importToDms(Resource resource, String token, DMSImport importType) {
         MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
-        params.add("columnId", importType.getColumn().getId());
+        params.add("columnId", dMSColumnConfig.getDMSColumn(importType.getColumn()).getId());
         params.add("contentParam", importType.getContent());
         params.add("titleParam", importType.getTitle());
         params.add("parseArray", importType.getRelation());
@@ -198,7 +210,8 @@ public class DMSService {
         headers.put("token", token);
         return HttpUtil.requestPost(path + "/content/importBeautifiedExcel", params, headers);
     }
-    public String uploadFile(Resource resource, String token, DMSColumn column ,String paramName,FileType fileType) {
+
+    public String uploadFile(Resource resource, String token, DMSColumn column, String paramName, FileType fileType) {
         MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
         params.add("columnId", column.getId());
         params.add("contentId", "uploadFile");
@@ -211,14 +224,19 @@ public class DMSService {
         JSONObject jsonObject = JSON.parseObject(json);
         if (jsonObject.getString("code").equals("200")) {
             return jsonObject.getString("content");
-        }else {
+        } else {
             throw new RuntimeException("上传失败");
         }
     }
+
+    public String uploadFile(Resource resource, String token, String column, String paramName, FileType fileType) {
+        return uploadFile(resource, token, dMSColumnConfig.getDMSColumn(column), paramName, fileType);
+    }
+
     public boolean insertToDms(Object objs, String token, DMSColumn column) {
 
         MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
-        params.add("modelId",column.getModelId());
+        params.add("modelId", column.getModelId());
         params.add("columnId", column.getId());
         params.add("content", objs);
         Map<String, String> headers = new HashMap<>();
@@ -228,21 +246,25 @@ public class DMSService {
         return jsonObject.getString("code").equals("200");
     }
 
+    public boolean insertToDms(Object objs, String token, String column) {
+        return insertToDms(objs, token, dMSColumnConfig.getDMSColumn(column));
+    }
+
     public List<JSONObject> queryBeautifiedClue(String token, String cClueName, String cEnterpriseName, String constructionMethod, String timeStart, String timeEnd) {
         DMSQueryRequest request = new DMSQueryRequest();
         request.type = DMSQueryRequest.DMSRequestType.Beautified;
         if (cClueName != null) request.addWhere("c_clue_name", "2", cClueName);
         if (cEnterpriseName != null) request.addWhere("c_enterprise_name", "2", cEnterpriseName);
         if (constructionMethod != null) request.addWhere("construction_method", "2", constructionMethod);
-        if (timeStart != null&&timeEnd!=null) request.addWhere("create_time", "3", timeStart,timeEnd);
-        return queryDmsList(request, token, DMSColumn.CLUE.getId());
+        if (timeStart != null && timeEnd != null) request.addWhere("create_time", "3", timeStart, timeEnd);
+        return queryDmsList(request, token, dMSColumnConfig.getDMSColumn(DMSColumn.CLUE).getId());
     }
 
-    public List<JSONObject> getUserJSONByCode(String userCode,String token) {
+    public List<JSONObject> getUserJSONByCode(String userCode, String token) {
         DMSQueryRequest request = new DMSQueryRequest();
         request.type = DMSQueryRequest.DMSRequestType.List;
         request.addWhere("c_usercode", "1", userCode);
-        List<JSONObject> result = queryDmsList(request, token, DMSColumn.USER.getId());
+        List<JSONObject> result = queryDmsList(request, token, dMSColumnConfig.getDMSColumn(DMSColumn.USER).getId());
         return result;
     }
 
@@ -251,31 +273,98 @@ public class DMSService {
     public List<JSONObject> getAllParkByLy(String lyCode, String token) {
         DMSQueryRequest requestChildren = new DMSQueryRequest();
         requestChildren.addWhere("parent_cyy_code", "1", lyCode);
-        List<JSONObject> result = queryDmsList(requestChildren, token, DMSColumn.INDUSTRIAL_PARK.getId());
+        List<JSONObject> result = queryDmsList(requestChildren, token, dMSColumnConfig.getDMSColumn(DMSColumn.INDUSTRIAL_PARK).getId());
         DMSQueryRequest requestFarther = new DMSQueryRequest();
         requestFarther.addWhere("c_park_code", "1", lyCode);
-        result.addAll(queryDmsList(requestFarther, token, DMSColumn.INDUSTRIAL_PARK.getId()));
+        result.addAll(queryDmsList(requestFarther, token, dMSColumnConfig.getDMSColumn(DMSColumn.INDUSTRIAL_PARK).getId()));
         return result;
     }
 
     public List<JSONObject> getAllPark(String token) {
         DMSQueryRequest request = new DMSQueryRequest();
-        return queryDmsList(request, token, DMSColumn.INDUSTRIAL_PARK.getId());
+        return queryDmsList(request, token, dMSColumnConfig.getDMSColumn(DMSColumn.INDUSTRIAL_PARK).getId());
     }
 
     public List<JSONObject> getAllLeaseByRooms(Set<String> roomString, String token) {
         DMSQueryRequest request = new DMSQueryRequest();
         request.addWhere("c_room_code", "5", roomString);
-        return queryDmsList(request, token, DMSColumn.LEASE_DETAIL.getId());
+        return queryDmsList(request, token, dMSColumnConfig.getDMSColumn(DMSColumn.LEASE_DETAIL).getId());
     }
 
     public List<JSONObject> getAllLease(String token) {
         DMSQueryRequest request = new DMSQueryRequest();
-        return queryDmsList(request, token, DMSColumn.LEASE_DETAIL.getId());
+        return queryDmsList(request, token, dMSColumnConfig.getDMSColumn(DMSColumn.LEASE_DETAIL).getId());
     }
 
     public List<JSONObject> getAllInvestmentTarget(String token) {
         DMSQueryRequest request = new DMSQueryRequest();
-        return queryDmsList(request, token, DMSColumn.INVESTMENT_TARGET.getId());
+        return queryDmsList(request, token, dMSColumnConfig.getDMSColumn(DMSColumn.INVESTMENT_TARGET).getId());
+    }
+
+    public JSONObject queryByComplex(DMSComplexQueryRequest request,String token){
+        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(request));
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+            params.add(entry.getKey(), entry.getValue());
+        }
+        Map<String, String> headers = new HashMap<>();
+        headers.put("token", token);
+        String json = HttpUtil.requestPost(path + "/content/multipleFormsOfJointInvestigation", params, headers);
+        JSONObject result = JSON.parseObject(json);
+        if (result.getString("code").equals("200")) {
+            return result.getJSONObject("content");
+        }else {
+            throw new RuntimeException(result.getString("message"));
+        }
+    }
+    public JSONArray queryAllByComplex(DMSComplexQueryRequest request,String token){
+        int page = 1;
+        int allDataCount =-1;
+        int pageSize = 10000;
+        request.setPageSize(pageSize);
+        request.setOrderBy("main", "id", true);
+        JSONArray data = new JSONArray();
+        do {
+            request.setPage(page++);
+
+            JSONObject obj = queryByComplex(request, token);
+
+            allDataCount = obj.getInteger("count");
+            data.addAll(obj.getJSONArray("data"));
+
+        }while (allDataCount>page*pageSize);
+        return  data;
+
+    }
+    public List<Enterprise> queryEnterpriseByComplex(String token){
+        DMSComplexQueryRequest request = new DMSComplexQueryRequest();
+        request.setMainColumn(dMSColumnConfig.getDMSColumn(DMSColumn.ENTERPRISE).getId(), "main");
+        request.setSelectItem(Arrays.asList(
+                SelectItem.of("c_unified_social_credit_code"),
+                SelectItem.of("c_enterprise_name"),
+                SelectItem.of("reg_type"),
+                SelectItem.of("household_unit_id"),
+                SelectItem.of("c_ssxq_code"),
+                SelectItem.of("is_gsqy"),
+                SelectItem.of("operation_status"),
+                SelectItem.of("industry"),
+                SelectItem.of("company_level"),
+                SelectItem.of("c_investment_unit_id"),
+                SelectItem.of("c_certificate_date"),
+                SelectItem.of("c_move_out_date"),
+                SelectItem.of("revocation_time"),
+                SelectItem.of("cancellation_time"),
+                SelectItem.of("risk_exempt"),
+                SelectItem.of("c_is_key_project_qp"),
+                SelectItem.of("gsqy_time"),
+                SelectItem.of("c_national_industry_code"),
+                SelectItem.of("c_national_industry")
+        ));
+        JSONArray data = queryAllByComplex(request, token);
+        List<Enterprise> result = new ArrayList<>();
+        for (int i = 0; i < data.size(); i++){
+            result.add( data.getJSONObject(i).toJavaObject(Enterprise.class));
+        }
+        return result;
     }
 }

+ 124 - 0
src/main/java/com/skyversation/xjcy/dms/complex/DMSComplexQueryRequest.java

@@ -0,0 +1,124 @@
+package com.skyversation.xjcy.dms.complex;
+
+import com.alibaba.fastjson.JSON;
+import com.skyversation.xjcy.dms.complex.condition.ConditionList;
+import com.skyversation.xjcy.dms.complex.groupBy.GroupByItem;
+import com.skyversation.xjcy.dms.complex.join.JoinColumn;
+import com.skyversation.xjcy.dms.complex.selectItem.SelectItem;
+import com.skyversation.xjcy.dms.complex.subQuery.SubQuery;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Collection;
+
+@Getter
+public class DMSComplexQueryRequest {
+    String columnId;
+    String columnAlias;
+    String orderBy;
+    String distinctOn;
+    @Setter
+    boolean autoSelectItem =true;
+    @Setter
+    int page = 1;
+    @Setter
+    int pageSize =200;
+
+    String conditionsList;
+    String subQuery;
+    String joinColumn;
+    String selectItem;
+    String groupBy;
+
+    public void setMainColumn(String columnId, String columnAlias) {
+        this.columnId = columnId;
+        this.columnAlias = columnAlias;
+    }
+
+    public void setOrderBy(String table, String field, boolean asc) {
+        orderBy = String.format("%s,%s,%s", table, field, asc ? "asc" : "desc");
+    }
+
+    public void setDistinctOn(String table, String field) {
+        distinctOn = String.format("%s,%s", table, field);
+    }
+
+    public void setConditionsList(ConditionList conditionsList) {
+        this.conditionsList = conditionsList.toJSONString();
+    }
+
+    public void setSubQuery(Collection<SubQuery> subQuery) {
+        this.subQuery = JSON.toJSONString(subQuery);
+    }
+
+    public void setJoinColumn(Collection<JoinColumn> joinColumn) {
+        this.joinColumn = JSON.toJSONString(joinColumn);
+    }
+
+    public void setSelectItem(Collection<SelectItem> selectItem) {
+        this.selectItem = JSON.toJSONString(selectItem);
+    }
+
+    public void setGroupBy(Collection<GroupByItem> groupBy) {
+        this.groupBy = JSON.toJSONString(groupBy);
+    }
+//
+//    public static void main(String[] args) {
+//        DMSComplexQueryRequest request = new DMSComplexQueryRequest();
+//        request.setMainColumn("123", "main");
+//        request.setOrderBy("main", "id", true);
+//        request.setDistinctOn("main", "name");
+//
+//        ConditionItem conditionItem = new ConditionItem();
+//        conditionItem.setColumnId("main");
+//        conditionItem.setCondition("=");
+//        conditionItem.setColumnName("type");
+//        conditionItem.pushValue("3");
+//
+//        ConditionItem conditionItem2 = new ConditionItem();
+//        conditionItem2.setColumnId("main");
+//        conditionItem2.setCondition("between");
+//        conditionItem2.setColumnName("time");
+//        conditionItem2.pushValue("sub", "start");
+//        conditionItem2.pushValue("sub", "end");
+//
+//        ConditionList conditionsList1 = new ConditionList();
+//        conditionsList1.setLink("and");
+//        conditionsList1.push(conditionItem);
+//
+//        ConditionList conditionList2 = new ConditionList();
+//        conditionList2.setLink("or");
+//        conditionList2.push(conditionItem2);
+//        conditionList2.push(conditionsList1);
+//
+//        request.setConditionsList(conditionList2);
+//
+//        SubQuery subQuery = new SubQuery();
+//        subQuery.setAlias("main");
+//        subQuery.setColumn("a123");
+//
+//        request.setSubQuery(Collections.singleton(subQuery));
+//
+//        JoinColumn joinColumn = new JoinColumn();
+//        joinColumn.setColumnAlias("sub");
+//        joinColumn.setConditionSop(conditionsList1);
+//
+//        request.setJoinColumn(Collections.singleton(joinColumn));
+//
+//        SelectItem selectItem = new SelectItem();
+//        selectItem.setAlias("awd");
+//
+//        request.setSelectItem(Collections.singleton(selectItem));
+//
+//        GroupByItem groupByItem = new GroupByItem();
+//        groupByItem.setColumn("awdawd");
+//
+//        request.setGroupBy(Collections.singleton(groupByItem));
+//
+//        request.setPage(15);
+//
+//        request.setAutoSelectItem(true);
+//
+//        System.out.println(JSON.toJSONString(request));
+//    }
+}

+ 63 - 0
src/main/java/com/skyversation/xjcy/dms/complex/condition/ConditionItem.java

@@ -0,0 +1,63 @@
+package com.skyversation.xjcy.dms.complex.condition;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class ConditionItem {
+    @Getter
+    List<Object> value =new ArrayList<>();
+    @Setter @Getter
+    String columnId;
+    @Setter @Getter
+    String columnName;
+    @Setter @Getter
+    String condition;
+
+    public void pushValue(Integer value) {
+        this.value.add(value);
+    }
+
+    public void pushValue(String value) {
+        this.value.add(value);
+    }
+
+    public void pushValue(Boolean value) {
+        this.value.add(value);
+    }
+
+    public void pushValue(Double value) {this.value.add(value);}
+
+    public void pushValue(String columnName, String field) {
+        FieldValue fv = new FieldValue();
+        fv.setColumnId(columnName);
+        fv.setColumnName(field);
+        pushValue(fv);
+    }
+
+    public void pushValue(FieldValue fieldValue) {
+        this.value.add(fieldValue);
+    }
+
+    public void pushFieldValue(FieldValue value) {this.value.add(value);}
+
+    public void pushIntValues(Collection<Integer> value) {
+        this.value.addAll(value);
+    }
+
+    public void pushStringValues(Collection<String> value) {
+        this.value.addAll(value);
+    }
+
+    public void pushBoolValues(Collection<Boolean> value) {
+        this.value.addAll(value);
+    }
+
+    public void pushDoubleValues(Collection<Double> value) {
+        this.value.addAll(value);
+    }
+
+}

+ 38 - 0
src/main/java/com/skyversation/xjcy/dms/complex/condition/ConditionList.java

@@ -0,0 +1,38 @@
+package com.skyversation.xjcy.dms.complex.condition;
+
+import com.alibaba.fastjson.JSONArray;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class ConditionList {
+    List<Object> items = new ArrayList<>();
+    @Setter
+    String link;
+
+    public ConditionList(Collection<ConditionItem> items, String link) {
+        this.link = link;
+        this.items.addAll(items);
+    }
+    public ConditionList(Collection<ConditionItem> items) {
+        this(items,"and");
+    }
+    public void push(ConditionItem item) {
+        this.items.add(item);
+    }
+    public void push(ConditionList item) {
+        this.items.add(item.getItems());
+    }
+    public String toJSONString(){
+        JSONArray jsonArray = new JSONArray(items);
+        jsonArray.add(link);
+        return jsonArray.toJSONString();
+    }
+    public List<Object> getItems(){
+        List<Object> list = new ArrayList<>(items);
+        list.add(link);
+        return list;
+    }
+}

+ 12 - 0
src/main/java/com/skyversation/xjcy/dms/complex/condition/Conditions.java

@@ -0,0 +1,12 @@
+package com.skyversation.xjcy.dms.complex.condition;
+
+public class Conditions {
+    public static ConditionItem equalField(String table1,String field1,String table2,String field2){
+        ConditionItem item = new ConditionItem();
+        item.setColumnId(table1);
+        item.setColumnName(field1);
+        item.pushValue(table2,field2);
+        item.setCondition("=");
+        return item;
+    }
+}

+ 10 - 0
src/main/java/com/skyversation/xjcy/dms/complex/condition/FieldValue.java

@@ -0,0 +1,10 @@
+package com.skyversation.xjcy.dms.complex.condition;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter @Getter
+public class FieldValue {
+    String columnName;
+    String columnId;
+}

+ 9 - 0
src/main/java/com/skyversation/xjcy/dms/complex/groupBy/GroupByItem.java

@@ -0,0 +1,9 @@
+package com.skyversation.xjcy.dms.complex.groupBy;
+
+import lombok.Data;
+
+@Data
+public class GroupByItem {
+   private String table;
+   private String column;
+}

+ 22 - 0
src/main/java/com/skyversation/xjcy/dms/complex/join/JoinColumn.java

@@ -0,0 +1,22 @@
+package com.skyversation.xjcy.dms.complex.join;
+
+import com.skyversation.xjcy.dms.complex.condition.ConditionList;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+public class JoinColumn {
+    @Getter @Setter
+    private String columnId;
+    @Getter @Setter
+    private String columnAlias;
+    @Getter @Setter
+    private String type;
+    @Getter
+    private List<Object> conditionSop;
+
+    public void setConditionSop(ConditionList conditionSop) {
+        this.conditionSop = conditionSop.getItems();
+    }
+}

+ 4 - 0
src/main/java/com/skyversation/xjcy/dms/complex/join/JoinColumns.java

@@ -0,0 +1,4 @@
+package com.skyversation.xjcy.dms.complex.join;
+
+public class JoinColumns {
+}

+ 19 - 0
src/main/java/com/skyversation/xjcy/dms/complex/selectItem/SelectItem.java

@@ -0,0 +1,19 @@
+package com.skyversation.xjcy.dms.complex.selectItem;
+
+import lombok.Data;
+
+@Data
+public class SelectItem {
+   private String table;
+   private String column;
+   private String function;
+   private String distinct;
+   private String alias;
+   public static SelectItem of(String column) {
+      SelectItem selectItem = new SelectItem();
+      selectItem.setTable("main");
+      selectItem.setColumn(column);
+      selectItem.setAlias(column);
+      return selectItem;
+   }
+}

+ 19 - 0
src/main/java/com/skyversation/xjcy/dms/complex/subQuery/SubQuery.java

@@ -0,0 +1,19 @@
+package com.skyversation.xjcy.dms.complex.subQuery;
+
+import lombok.Data;
+
+@Data
+public class SubQuery {
+    private String mainTableId;
+    private String subTableId;
+    private String subTableAlias;
+    private String joinColumn;
+    private String function;
+    private String column;
+    private String columnFrom;
+    private String mainTableColumn;
+    private String subTableColumn;
+    private boolean distinct;
+    private String conditions;
+    private String alias;
+}

+ 77 - 7
src/main/java/com/skyversation/xjcy/service/AuthService.java

@@ -9,6 +9,7 @@ import com.skyversation.xjcy.util.HashBasedLockManager;
 import com.skyversation.xjcy.util.HttpUtil;
 import com.skyversation.xjcy.util.MessageManage;
 import com.skyversation.xjcy.util.ObfuscationUtils;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -128,6 +129,11 @@ public class AuthService {
      */
     private static final String RESPONSE_FIELD_ROLE_ID = "roleId";
 
+    @Value("${app.oauth.role-config}")
+    private String roleConfigJson;
+
+    private final Map<String, List<Role>> ROLE_CONFIG_MAP = new HashMap<>();
+
     /**
      * yyyy-MM-dd HH:mm:ss
      */
@@ -175,6 +181,13 @@ public class AuthService {
         }
     }
 
+    @Getter
+    @AllArgsConstructor
+    public final static class Role{
+        private final String roleId;
+        private final String serviceId;
+    }
+
     // ============================ 实例变量 ============================
 
     /**
@@ -235,6 +248,29 @@ public class AuthService {
             throw new IllegalStateException("OAuth配置不完整: oauth.path必须配置");
         }
         account = new Account(loginName, password);
+        
+        initRoleConfigMap();
+    }
+
+    /**
+     * 从JSON配置初始化角色映射
+     */
+    private void initRoleConfigMap() {
+        try {
+            JSONObject config = JSON.parseObject(roleConfigJson);
+            for (String key : config.keySet()) {
+                List<JSONObject> roleList = config.getJSONArray(key).toJavaList(JSONObject.class);
+                List<Role> roles = new ArrayList<>();
+                for (JSONObject roleJson : roleList) {
+                    String roleId = roleJson.getString("roleId");
+                    String serviceId = roleJson.getString("serviceId");
+                    roles.add(new Role(roleId, serviceId));
+                }
+                ROLE_CONFIG_MAP.put(key, roles);
+            }
+        } catch (Exception e) {
+            throw new IllegalStateException("角色配置JSON解析失败: " + e.getMessage(), e);
+        }
     }
 
     // ============================ 公共方法 ============================
@@ -350,16 +386,18 @@ public class AuthService {
      * 升级用户为企业用户权限组
      */
     public void upgradeRoleEnterprise(JSONObject userContent) {
-        updateRole(userContent, Collections.singletonList("40"), Collections.emptyList(), "11");
-        updateRole(userContent, Collections.singletonList("44"), Collections.emptyList(), "12");
+        updateRoles(userContent, ROLE_CONFIG_MAP.get("ENTERPRISE_ROLE"), Collections.emptyList());
     }
 
     /**
      * 降级用户使其失去企业用户权限组
      */
     public void deUpgradeRoleEnterprise(JSONObject userContent) {
-        updateRole(userContent, Collections.emptyList(), Collections.singletonList("40"), "11");
-        updateRole(userContent, Collections.emptyList(), Collections.singletonList("44"), "12");
+        List<Role> removeRoles = Arrays.asList(
+            new Role("40", "11"),
+            new Role("44", "12")
+        );
+        updateRoles(userContent, ROLE_CONFIG_MAP.get("ENTERPRISE_ROLE"), removeRoles);
     }
 
     /**
@@ -450,6 +488,39 @@ public class AuthService {
         return isSuccess(JSONObject.parseObject(response));
     }
 
+    private boolean updateRoles(JSONObject userContent, Collection<Role> addRoleIds, Collection<Role> removeRoleIds){
+        Map<String, List<String>> addRolesByService = new HashMap<>();
+        Map<String, List<String>> removeRolesByService = new HashMap<>();
+        
+        if (addRoleIds != null) {
+            for (Role role : addRoleIds) {
+                addRolesByService.computeIfAbsent(role.getServiceId(), k -> new ArrayList<>())
+                        .add(role.getRoleId());
+            }
+        }
+        
+        if (removeRoleIds != null) {
+            for (Role role : removeRoleIds) {
+                removeRolesByService.computeIfAbsent(role.getServiceId(), k -> new ArrayList<>())
+                        .add(role.getRoleId());
+            }
+        }
+        
+        Set<String> allServiceIds = new HashSet<>();
+        allServiceIds.addAll(addRolesByService.keySet());
+        allServiceIds.addAll(removeRolesByService.keySet());
+        
+        boolean allSuccess = true;
+        for (String serviceId : allServiceIds) {
+            List<String> addIds = addRolesByService.getOrDefault(serviceId, Collections.emptyList());
+            List<String> removeIds = removeRolesByService.getOrDefault(serviceId, Collections.emptyList());
+            boolean success = updateRole(userContent, addIds, removeIds, serviceId);
+            allSuccess = allSuccess && success;
+        }
+        
+        return allSuccess;
+    }
+
     private void deleteUser(String userId) {
         MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
         params.add("userId", userId);
@@ -480,9 +551,8 @@ public class AuthService {
                 allSuccess = false;
             }
         }
-        allSuccess = allSuccess && updateRole(userContent, Collections.singletonList("41"), Collections.emptyList(), "11");
-        allSuccess = allSuccess && updateRole(userContent, Collections.singletonList("45"), Collections.emptyList(), "12");
-        allSuccess = allSuccess && updateRole(userContent, Collections.singletonList("48"), Collections.emptyList(), "2");
+
+        allSuccess = allSuccess && updateRoles(userContent, ROLE_CONFIG_MAP.get("INIT_ROLE"), Collections.emptyList());
         return allSuccess;
     }
 

+ 137 - 43
src/main/java/com/skyversation/xjcy/service/DataCountService.java

@@ -48,6 +48,62 @@ public class DataCountService {
     MultiValueMap<String, IndustrialPark> buildMap = new LinkedMultiValueMap<>();
     List<IndustrialPark> allPark = new ArrayList<>();
 
+    private Map<String,String> nationalIndustryToMerged = new HashMap<>();
+    private Map<String,String> nationalIndustryMap = new HashMap<>();
+    private Map<String,String> regTypeMap = new HashMap<>();
+
+    @PostConstruct
+    public void init() {
+        initNationalIndustryToMerged();
+        initRegType();
+        initNationalIndustry();
+    }
+    private void initNationalIndustryToMerged () {
+        Map<String,String> map = new HashMap<>();
+        map.put("F", "批发和零售业");
+        map.put("I", "信息传输、软件和信息技术服务业");
+        map.put("L", "租赁和商务服务业");
+        map.put("M", "科学研究和技术服务业");
+        map.put("C", "制造业");
+        map.put("R", "文化、体育和娱乐业");
+        nationalIndustryToMerged = map;
+    }
+
+    private void initRegType(){
+        Map<String,String> map = new HashMap<>();
+        map.put("1", "注册实体型");
+        map.put("2", "注册非实体型");
+        map.put("3", "实体非注册型");
+        map.put("4", "临时流动");
+        regTypeMap = map;
+    }
+
+
+    private void initNationalIndustry() {
+        Map<String,String> map = new HashMap<>();
+        map.put("A", "农、林、牧、渔业");
+        map.put("B", "采矿业");
+        map.put("C", "制造业");
+        map.put("D", "电力、热力、燃气及水生产和供应业");
+        map.put("E", "建筑业");
+        map.put("F", "批发和零售业");
+        map.put("G", "交通运输、仓储和邮政业");
+        map.put("H", "住宿和餐饮业");
+        map.put("I", "信息传输、软件和信息技术服务业");
+        map.put("J", "金融业");
+        map.put("K", "房地产业");
+        map.put("L", "租赁和商务服务业");
+        map.put("M", "科学研究和技术服务业");
+        map.put("N", "水利、环境和公共设施管理业");
+        map.put("O", "居民服务、修理和其他服务业");
+        map.put("P", "教育");
+        map.put("Q", "卫生和社会工作");
+        map.put("R", "文化、体育和娱乐业");
+        map.put("S", "公共管理、社会保障和社会组织");
+        map.put("T", "国际组织");
+        nationalIndustryMap = map;
+    }
+
     //简单限制统计频率
     @Value("${app.count-cache-length}")
     private long INTERVAL_MILLIS ;
@@ -90,7 +146,7 @@ public class DataCountService {
 
         public EnterpriseEconomicCount(List<EnterpriseEconomic> enterpriseEconomicList) {
             for (EnterpriseEconomic enterpriseEconomic : enterpriseEconomicList) {
-                tax = tax.add(Optional.ofNullable(enterpriseEconomic.getCApprovedOutputValue()).orElse(BigDecimal.ZERO));
+                tax = tax.add(Optional.ofNullable(enterpriseEconomic.getCApprovedTax()).orElse(BigDecimal.ZERO));
                 product = product.add(Optional.ofNullable(enterpriseEconomic.getCApprovedOutputValue()).orElse(BigDecimal.ZERO));
                 revenue = revenue.add(Optional.ofNullable(enterpriseEconomic.getCApprovedRevenue()).orElse(BigDecimal.ZERO));
             }
@@ -118,7 +174,7 @@ public class DataCountService {
 
         //数据量大不了所以不做流式
         List<IndustrialPark> allIndustrialPark = dmsService.query(authService.getTokenOfServiceAccount(), DMSQuery.INDUSTRIAL_PARK, IndustrialPark.class, now);
-        List<Enterprise> allEnterprise = dmsService.query(authService.getTokenOfServiceAccount(), DMSQuery.ENTERPRISE, Enterprise.class, now);
+        List<Enterprise> allEnterprise = dmsService.queryEnterpriseByComplex(authService.getTokenOfServiceAccount());
         List<EnterpriseEconomic> inDateEnterpriseEconomic = dmsService.query(authService.getTokenOfServiceAccount(), DMSQuery.ECONOMIC_ALL_INDEED, EnterpriseEconomic.class, now);
         List<Order> allOrder = dmsService.query(authService.getTokenOfServiceAccount(), DMSQuery.ORDER, Order.class, now);
         List<LeaseDetail> lastLeaseDetail = dmsService.query(authService.getTokenOfServiceAccount(), DMSQuery.LAST_LEASE_DETAIL, LeaseDetail.class, now);
@@ -252,7 +308,6 @@ public class DataCountService {
 
             int enterPriceCount = 0;
             int enterPriceGsCount = 0;
-            Map<String, Integer> industryCount = new HashMap<>();
             Set<String> inParkEnterpriseCode = new HashSet<>();
             List<String> aliveEnterprise = new ArrayList<>();
             int usedRoomCount = 0;
@@ -267,8 +322,6 @@ public class DataCountService {
 
                 Set<String> buildEnterpriseCode = new HashSet<>();
                 JSONObject buildData = new JSONObject();
-                int buildEnterpriseCount = 0;
-                int buildGsEnterpriseCount = 0;
                 int buildRoomCount = 0;
                 int buildUsedRoomCount = 0;
 
@@ -312,14 +365,20 @@ public class DataCountService {
                     floorData.put("floorName", floor.getCResourceName());
                     floors.add(floorData);
                 }
+                int buildEnterpriseCount = 0;
+                int buildGsEnterpriseCount = 0;
                 for (String enterpriseCode : buildEnterpriseCode) {
+                    boolean isGsqy = false;
                     if (aliveEnterpriseMap.containsKey(enterpriseCode)) {
                         Enterprise enterprise = aliveEnterpriseMap.get(enterpriseCode);
-                        buildEnterpriseCount++;
                         if ("2".equals(enterprise.getIsGsqy())) {
-                            buildGsEnterpriseCount++;
+                            isGsqy = true;
                         }
                     }
+                    buildEnterpriseCount++;
+                    if (isGsqy) {
+                        buildGsEnterpriseCount++;
+                    }
                 }
                 buildData.put("enterpriseCount", buildEnterpriseCount);
                 buildData.put("gsEnterpriseCount", buildGsEnterpriseCount);
@@ -335,10 +394,16 @@ public class DataCountService {
             for (EnterpriseLevel value : EnterpriseLevel.values()) {
                 enterPriceLevelCountByPark.get(value).put(industrialPark.getCResourceName(), 0);
             }
+            Map<String, Integer> enterPriceIndustryCount = new HashMap<>();
             for (String enterpriseCode : inParkEnterpriseCode) {
+                boolean isGsqy = false;
+                String nationalIndustryCode = null;
                 if (aliveEnterpriseMap.containsKey(enterpriseCode)) {
                     Enterprise enterprise = aliveEnterpriseMap.get(enterpriseCode);
 
+                    isGsqy = "2".equals(enterprise.getIsGsqy());
+                    nationalIndustryCode = enterprise.getCNationalIndustryCode();
+
                     EnterpriseLevel.ofJsonValue(enterprise.getCompanyLevel()).ifPresent(level -> {
                         Map<String, Integer> map = enterPriceLevelCountByPark.get(level);
                         map.put(industrialPark.getCResourceName(), map.get(industrialPark.getCResourceName()) + 1);
@@ -349,30 +414,35 @@ public class DataCountService {
                     allTaxByYtdThisYear = allTaxByYtdThisYear.add(ytdThisYear.tax);
                     allTaxByYtdLastYear = allTaxByYtdLastYear.add(ytdLastYear.tax);
 
-                    if ("2".equals(enterprise.getIsGsqy())) {
+                    if (isGsqy) {
                         allGsProductByYtdThisYear = allGsProductByYtdThisYear.add(ytdThisYear.product);
                         allGsProductByYtdLastYear = allGsProductByYtdLastYear.add(ytdLastYear.product);
-                        enterPriceGsCount++;
+
                     }
 
-                    enterPriceCount++;
                     aliveEnterprise.add(enterpriseCode);
+                    enterPriceCount++;
+                    if (isGsqy) {
+                        enterPriceGsCount++;
+                    }
 
-                    String industry = enterprise.getIndustry();
-                    if (industry != null) {
-                        if (industryCount.containsKey(industry)) {
-                            industryCount.put(industry, industryCount.get(industry) + 1);
-                        } else {
-                            industryCount.put(industry, 1);
-                        }
+                }
+                enterPriceCount++;
+                if (isGsqy) {
+                    enterPriceGsCount++;
+                }
+                if (nationalIndustryCode != null) {
+                    String prefix = nationalIndustryCode.substring(0, 1);
+                    String nationalIndustry = nationalIndustryMap.get(prefix);
+
+                    if (enterPriceIndustryCount.containsKey(nationalIndustry)) {
+                        enterPriceIndustryCount.put(nationalIndustry, enterPriceIndustryCount.get(nationalIndustry) + 1);
+                    } else {
+                        enterPriceIndustryCount.put(nationalIndustry, 1);
                     }
                 }
+
             }
-            List<String> sortedEnterprise = aliveEnterprise.stream().sorted((a, b) -> {
-                BigDecimal ar = economicCountBy12Month.get(a).revenue;
-                BigDecimal br = economicCountBy12Month.get(b).revenue;
-                return ar.compareTo(br) * -1;
-            }).limit(10).collect(Collectors.toList());
 
             JSONObject parkDataCount = new JSONObject();
             parkDataCount.put("totalTax", allTaxByYtdThisYear);
@@ -385,15 +455,25 @@ public class DataCountService {
             parkDataCount.put("enterpriseCount", enterPriceCount);
             parkDataCount.put("enterpriseGsCount", enterPriceGsCount);
             parkDataCount.put("parkVacantArea", industrialPark.getCVacantArea());
-            parkDataCount.put("enterPriseIndustry", industryCount);
+            parkDataCount.put("enterPriseIndustry", enterPriceIndustryCount);
 
             JSONArray topRevenue = new JSONArray();
+            List<String> sortedEnterprise = aliveEnterprise.stream().sorted((a, b) -> {
+                BigDecimal ar = economicCountBy12Month.get(a).revenue;
+                BigDecimal br = economicCountBy12Month.get(b).revenue;
+                return ar.compareTo(br) * -1;
+            }).limit(10).collect(Collectors.toList());
             for (String enterPriseCode : sortedEnterprise) {
                 JSONObject outPut = new JSONObject();
                 Enterprise enterPrice = aliveEnterpriseMap.get(enterPriseCode);
+                BigDecimal product = economicCountBy12Month.get(enterPriseCode).product;
                 outPut.put("enterPriceCode", enterPriseCode);
                 outPut.put("enterPriceName", enterPrice.getCEnterpriseName());
-                outPut.put("enterPriceRevenue", economicCountBy12Month.get(enterPriseCode).revenue);
+                if (product.compareTo(BigDecimal.ZERO)==0){
+                    outPut.put("enterPriceRevenue","暂无");
+                }else {
+                    outPut.put("enterPriceRevenue",product);
+                }
                 topRevenue.add(outPut);
             }
 
@@ -423,9 +503,6 @@ public class DataCountService {
 
     private void simpleCountPark(List<IndustrialPark> allIndustrialPark) {
         int parkCount = 0;
-        BigDecimal totalFloorArea = BigDecimal.ZERO;
-        BigDecimal totalBuildArea = BigDecimal.ZERO;
-        BigDecimal totalVacantArea = BigDecimal.ZERO;
 
         Map<String, Integer> parkTypeCount = new HashMap<>();
         for (IndustrialPark industrialPark : allIndustrialPark) {
@@ -455,18 +532,6 @@ public class DataCountService {
                         } else {
                             parkTypeCount.put(industrialPark.getCLandUse(), 1);
                         }
-                        try {
-                            totalFloorArea = totalFloorArea.add(industrialPark.getCFloorArea());
-                        } catch (NumberFormatException ignore) {
-                        }
-                        try {
-                            totalBuildArea = totalBuildArea.add(industrialPark.getCBuildingArea());
-                        } catch (NumberFormatException ignore) {
-                        }
-                        try {
-                            totalVacantArea = totalVacantArea.add(industrialPark.getCVacantArea());
-                        } catch (NumberFormatException ignore) {
-                        }
                     }
                     default: {
                         //do nothing
@@ -477,6 +542,10 @@ public class DataCountService {
             }
         }
 
+        BigDecimal totalFloorArea = allPark.stream().map(IndustrialPark::getCFloorArea).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add);
+        BigDecimal totalBuildArea = allPark.stream().map(IndustrialPark::getCBuildingArea).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add);
+        BigDecimal totalVacantArea = allPark.stream().map(IndustrialPark::getCVacantArea).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add);
+
         tempCacheTownData.put("parkCount", parkCount);
         tempCacheTownData.put("parkType", parkTypeCount);
         tempCacheTownData.put("areaBuild", totalBuildArea);
@@ -490,11 +559,13 @@ public class DataCountService {
         int gsqyCount = 0;
         int aliveCount = 0;
         Map<String, Integer> industryCount = new HashMap<>();
+        Map<String, Integer> nationalIndustryCount = new HashMap<>();
+        Map<String, Integer> regTypeCount = new HashMap<>();
 
         for (Enterprise enterPrise : allEnterprise) {
-            boolean isInTown = "1".equals(Optional.ofNullable(enterPrise.getRegType()).orElse("1"));
+            boolean isInTown =Arrays.asList("1","3","4").contains(Optional.ofNullable(enterPrise.getRegType()).orElse("1"));
             boolean isGsqy = "2".equals(Optional.ofNullable(enterPrise.getIsGsqy()).orElse("1"));
-            boolean isAlive = "存续".equals(Optional.ofNullable(enterPrise.getOperationStatus()).orElse("存续"));
+            boolean isAlive = true;
 
             if (isAlive) {
                 aliveCount++;
@@ -505,13 +576,34 @@ public class DataCountService {
                     gsqyCount++;
                 }
 
-                String industry = enterPrise.getIndustry();
-                if (industry != null) {
+                String nationalIndustryCode = enterPrise.getCNationalIndustryCode();
+                String mergedNationalIndustry = null;
+                if (nationalIndustryCode!=null&& !nationalIndustryCode.isEmpty()) {
+                    String prefix = nationalIndustryCode.substring(0, 1);
+                    String industry = nationalIndustryMap.get(prefix);
                     if (industryCount.containsKey(industry)) {
                         industryCount.put(industry, industryCount.get(industry) + 1);
                     } else {
                         industryCount.put(industry, 1);
                     }
+                    mergedNationalIndustry = nationalIndustryToMerged.get(prefix);
+                }
+                if (mergedNationalIndustry==null)mergedNationalIndustry = "其他";
+                if (nationalIndustryCount.containsKey(mergedNationalIndustry)) {
+                    nationalIndustryCount.put(mergedNationalIndustry, nationalIndustryCount.get(mergedNationalIndustry) + 1);
+                } else {
+                    nationalIndustryCount.put(mergedNationalIndustry, 1);
+                }
+                String regType = enterPrise.getRegType();
+                String regTypeChinese = null;
+                if (regType!=null&& !regType.isEmpty()){
+                    regTypeChinese = regTypeMap.get(regType);
+                }
+                if (regTypeChinese == null) regTypeChinese = "其他";
+                if (regTypeCount.containsKey(regTypeChinese)) {
+                    regTypeCount.put(regTypeChinese, regTypeCount.get(regTypeChinese) + 1);
+                } else {
+                    regTypeCount.put(regTypeChinese, 1);
                 }
 
                 String enterPriceCode = enterPrise.getCUnifiedSocialCreditCode();
@@ -551,6 +643,8 @@ public class DataCountService {
         tempCacheTownData.put("enterPriseGsCount", gsqyCount);
 
         tempCacheTownData.put("enterPriseIndustry", industryCount);
+        tempCacheTownData.put("mergedEnterPriseIndustry", nationalIndustryCount);
+        tempCacheTownData.put("enterPriseRegType", regTypeCount);
     }
 
     private void countOrder(List<Order> allOrder) {

+ 49 - 20
src/main/java/com/skyversation/xjcy/service/SerialNumberGenerator.java

@@ -1,14 +1,18 @@
 package com.skyversation.xjcy.service;
 
+import com.skyversation.xjcy.dms.DMSColumn;
+import com.skyversation.xjcy.dms.DMSColumnConfig;
 import com.skyversation.xjcy.dms.DMSService;
 import lombok.Getter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.EnumMap;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -20,41 +24,66 @@ public class SerialNumberGenerator {
     private DMSService dmsService;
     @Resource
     private AuthService authService;
+    @Autowired
+    private DMSColumnConfig dMSColumnConfig;
 
-    // 前缀枚举定义(可根据需要扩展)
+    // 前缀配置类(替代原来的枚举)
     @Getter
-    public enum Prefix {
-        XS("XS", "1576", "c_clue_code"),
-        PT("PT", "1616", "c_task_code"),
-        ED("ED", "1587", "c_work_order_code"),
-        EP("EP", "1592", "c_product_code"),
-        PR("PR", "1591", "c_requirement_code"),
-        ZL("ZL", "1645", "code");
+    public static class Prefix {
         private final String code;
-        private final String columId;
+        private final DMSColumn column;
         private final String codeColumn;
 
-        Prefix(String code, String columId, String codeColumn) {
+        public Prefix(String code, DMSColumn column, String codeColumn) {
             this.code = code;
-            this.columId = columId;
+            this.column = column;
             this.codeColumn = codeColumn;
         }
 
+        @Override
+        public String toString() {
+            return code;
+        }
     }
 
+    // 存储所有前缀配置的列表
+    @Getter
+    private List<Prefix> prefixList;
+
     // 存储每个前缀的当前状态
     private final Map<Prefix, SerialState> stateMap = new ConcurrentHashMap<>();
     // 用于初始化时的同步锁
-    private final Map<Prefix, ReentrantLock> initLocks = new EnumMap<>(Prefix.class);
+    private final Map<Prefix, ReentrantLock> initLocks = new ConcurrentHashMap<>();
 
     // 日期格式化器(线程安全)
     private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.BASIC_ISO_DATE;
 
-    public SerialNumberGenerator() {
+    public Prefix getPrefix(String prefix) {
+        return prefixList.stream()
+                .filter(p -> p.code.equals(prefix))
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * Spring初始化方法,在Bean创建后自动执行
+     */
+    @PostConstruct
+    public void init() {
+        // 初始化前缀配置列表
+        prefixList = new ArrayList<>();
+        prefixList.add(new Prefix("XS", dMSColumnConfig.getDMSColumn(DMSColumn.CLUE), "c_clue_code"));
+        prefixList.add(new Prefix("PT", dMSColumnConfig.getDMSColumn(DMSColumn.INSPECTION_TASK), "c_task_code"));
+        prefixList.add(new Prefix("ED", dMSColumnConfig.getDMSColumn(DMSColumn.ORDER), "c_work_order_code"));
+        prefixList.add(new Prefix("EP", dMSColumnConfig.getDMSColumn(DMSColumn.ENTERPRISE_PRODUCT), "c_product_code"));
+        prefixList.add(new Prefix("PR", dMSColumnConfig.getDMSColumn(DMSColumn.ENTERPRISE_PURCHASE), "c_requirement_code"));
+        prefixList.add(new Prefix("ZL", dMSColumnConfig.getDMSColumn(DMSColumn.INDUSTRIAL_MANAGE), "code"));
+
         // 为每个前缀初始化锁
-        for (Prefix prefix : Prefix.values()) {
+        for (Prefix prefix : prefixList) {
             initLocks.put(prefix, new ReentrantLock());
         }
+
     }
 
     public void autoInit() {
@@ -64,10 +93,10 @@ public class SerialNumberGenerator {
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
-        for (Prefix prefix : Prefix.values()) {
+        for (Prefix prefix : prefixList) {
             try {
                 String today = currentDate();
-                int max = dmsService.getLargestCode(token, prefix.getColumId(), prefix.getCodeColumn(), today);
+                int max = dmsService.getLargestCode(token, prefix.getColumn().getId(), prefix.getCodeColumn(), today);
                 initPrefix(prefix, max + 1, today);
             } catch (Exception e) {
                 System.out.println(prefix + "流水号初始化失败");
@@ -79,7 +108,7 @@ public class SerialNumberGenerator {
     /**
      * 生成流水号
      *
-     * @param prefix 前缀枚举
+     * @param prefix 前缀
      * @return 生成的流水号字符串
      * @throws IllegalStateException 如果前缀未初始化
      */
@@ -100,7 +129,7 @@ public class SerialNumberGenerator {
     /**
      * 初始化指定前缀的流水号
      *
-     * @param prefix       前缀枚举
+     * @param prefix       前缀
      * @param initialValue 初始值(1-999)
      * @param today        初始化数据的时间
      * @throws IllegalArgumentException 初始值不在有效范围
@@ -140,7 +169,7 @@ public class SerialNumberGenerator {
             if (currentState == null) {
                 // 首次初始化:从DMS查询当天最大流水号
                 String token = authService.getTokenOfServiceAccount();
-                int max = dmsService.getLargestCode(token, prefix.getColumId(), prefix.getCodeColumn(), today);
+                int max = dmsService.getLargestCode(token, prefix.getColumn().getId(), prefix.getCodeColumn(), today);
                 // max为当天已使用的最大序号(无记录时为0),计数器设为max
                 SerialState newState = new SerialState(today, new AtomicInteger(max));
                 stateMap.put(prefix, newState);

+ 11 - 9
src/main/java/com/skyversation/xjcy/service/WeChatService.java

@@ -45,14 +45,16 @@ public class WeChatService {
     private String secretKey;
     @Value("${app.wechat.appid}")
     private String appid;
+    @Value("${app.wechat.api-base-url:https://api.weixin.qq.com}")
+    private String apiBaseUrl;
 
     private String accessToken;
     private LocalDateTime accessTokenExpireTime;
 
-    private static final String WX_AUTH_PATH = "https://api.weixin.qq.com/sns/jscode2session";
-    private static final String WX_ACCESS_KEY_PATH = "https://api.weixin.qq.com/cgi-bin/token";
-    private static final String WX_ACODE_PATH = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
-    private static final String WX_PHONE_PATH = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
+    private static final String WX_AUTH_PATH = "/sns/jscode2session";
+    private static final String WX_ACCESS_KEY_PATH = "/cgi-bin/token";
+    private static final String WX_ACODE_PATH = "/wxa/getwxacodeunlimit?access_token=";
+    private static final String WX_PHONE_PATH = "/wxa/business/getuserphonenumber?access_token=";
 
     public Result wxLogin(String code) {
         MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
@@ -60,7 +62,7 @@ public class WeChatService {
         params.add("secret", secretKey);
         params.add("js_code", code);
         params.add("grant_type", "authorization_code");
-        String body = HttpUtil.requestGet(WX_AUTH_PATH, params, null);
+        String body = HttpUtil.requestGet(apiBaseUrl + WX_AUTH_PATH, params, null);
         try {
             JSONObject jsonObject = JSONObject.parseObject(body);
             String openId = jsonObject.getString("openid");
@@ -77,7 +79,7 @@ public class WeChatService {
     }
 
     public PhoneResult wxPhoneLogin(String jsCode) {
-        String currectUrl = WX_PHONE_PATH + getAccessToken();
+        String currectUrl = apiBaseUrl + WX_PHONE_PATH + getAccessToken();
 
         Map<String, String> params = new HashMap<>();
         params.put("code", jsCode);
@@ -104,7 +106,7 @@ public class WeChatService {
         body.put("page", path);
         body.put("scene", scene);
         ResponseEntity<byte[]> res = HttpUtil.requestPostWithJson(
-                WX_ACODE_PATH + getAccessToken(),
+                apiBaseUrl + WX_ACODE_PATH + getAccessToken(),
                 body,
                 null
         );
@@ -117,7 +119,7 @@ public class WeChatService {
                 if (errcode != null && errcode.equals("40001")) {
                     refreshAccessToken();
                     res = HttpUtil.requestPostWithJson(
-                            WX_ACODE_PATH + getAccessToken(),
+                            apiBaseUrl + WX_ACODE_PATH + getAccessToken(),
                             body,
                             null
                     );
@@ -158,7 +160,7 @@ public class WeChatService {
         params.add("appid", appid);
         params.add("secret", secretKey);
         params.add("grant_type", "client_credential");
-        String body = HttpUtil.requestGet(WX_ACCESS_KEY_PATH, params, null);
+        String body = HttpUtil.requestGet(apiBaseUrl + WX_ACCESS_KEY_PATH, params, null);
         try {
             JSONObject jsonObject = JSONObject.parseObject(body);
             String accessToken = jsonObject.getString("access_token");

+ 8 - 1
src/main/resources/application.yml

@@ -3,6 +3,8 @@ server:
   servlet:
     context-path: /xjcy/
 spring:
+  config:
+    import: file:${catalina.base}/conf/apps/xjcy/
   application:
     name: xjcy
   mvc:
@@ -20,20 +22,24 @@ logging:
           web:
             servlet: DEBUG
 app:
-  count-cache-length: ${COUNT_CACHE_LENGTH:5000}
+  count-cache-length: ${COUNT_CACHE_LENGTH:500000}
   execute-startup-tasks: ${EXECUTE_STARTUP_TASKS:false}
   dms:
     #    path: http://127.0.0.1:10081/dms
     path: ${DMS_PATH:http://121.43.55.7:10081/dms}
+    column:
+      data: '{"INDUSTRIAL_PARK":{"id":"1580","modelId":"1525"},"ENTERPRISE":{"id":"1593","modelId":"1537"},"ENTERPRISE_ECONOMIC":{"id":"1594","modelId":"1538"},"ORDER":{"id":"1587","modelId":"1531"},"LEASE_DETAIL":{"id":"1574","modelId":"1520"},"INVESTMENT_TARGET":{"id":"1578","modelId":"1523"},"CLUE":{"id":"1576","modelId":"1521"},"CLUE_FOLLOW":{"id":"1577","modelId":"1522"},"ENTERPRISE_HEALTH":{"id":"1643","modelId":"1643"},"WECHAT_ARTICLE":{"id":"1599","modelId":"1544"},"MESSAGE":{"id":"1646","modelId":"1649"},"USER":{"id":"1579","modelId":"1524"},"MESSAGE_TARGET":{"id":"1661","modelId":"1671"},"LCXM":{"id":"1660","modelId":"1669"},"INSPECTION_TASK":{"id":"1616","modelId":"1576"},"ENTERPRISE_PRODUCT":{"id":"1592","modelId":"1536"},"ENTERPRISE_PURCHASE":{"id":"1591","modelId":"1535"},"INDUSTRIAL_MANAGE":{"id":"1645","modelId":"1647"}}'
   oauth:
     login-name: ${DMS_LOGIN_NAME:user_hj}
     password: ${DMS_PASSWORD:Hj@123456}
     path: ${OAUTH_LOGIN_PATH:http://121.43.55.7:10086/oauth}
+    role-config: '{"ENTERPRISE_ROLE":[{"roleId":"40","serviceId":"11","comment":"企业用户权限,pc端"},{"roleId":"44","serviceId":"12","comment":"企业用户权限,wx小程序端"}],"INIT_ROLE":[{"roleId":"41","serviceId":"11","comment":"普通游客权限,pc端"},{"roleId":"45","serviceId":"12","comment":"普通游客权限,wx小程序端"},{"roleId":"48","serviceId":"2","comment":"徐泾一般用户,dms"}]}'
   ows:
     path: ${OWS_PATH:http://121.43.55.7:8889/geoserver/xjxm/ows}
   wechat:
     appid: ${XJCY_WECHAT_APPID:wx125843453562c86c}
     secret-key: ${XJCY_WECHAT_SECRET:6028cc345cfdbc76224d750a13519762}
+    api-base-url: ${WECHAT_API_BASE_URL:https://api.weixin.qq.com}
     enable: true
   aly:
     key: ${ALIBABA_CLOUD_ACCESS_KEY_ID:LTAI5tGkCWh7nvNzY5vKNWdZ}
@@ -59,6 +65,7 @@ app:
   wechat:
     appid: ungiven
     secret-key: ungiven
+    api-base-url: ${WECHAT_API_BASE_URL:https://api.weixin.qq.com}
     enable: false
 
 #  wechat: