Browse Source

Merge branch 'dev' of ssh://10.10.100.21/source/saas-platform into dev

zhuth 7 years ago
parent
commit
01e13e2c68
100 changed files with 1991 additions and 207 deletions
  1. 1 1
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  2. 1 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/MaxnumberController.java
  3. 2 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/MaxnumberService.java
  4. 0 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java
  5. 34 38
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/MaxnumberServiceImpl.java
  6. 3 0
      applications/commons/commons-server/src/main/resources/application.yml
  7. 3 0
      applications/commons/commons-server/src/main/resources/config/application-docker-prod.yml
  8. 1 2
      applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductDTO.java
  9. 14 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/BankinformationServiceImpl.java
  10. 14 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/BomServiceImpl.java
  11. 8 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java
  12. 9 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/EmployeeServiceImpl.java
  13. 8 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  14. 14 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/VendorServiceImpl.java
  15. 14 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/WarehouseServiceImpl.java
  16. 11 10
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  17. 8 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/FundtransferServiceImpl.java
  18. 8 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthreceiptsServiceImpl.java
  19. 8 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthspendingsServiceImpl.java
  20. 8 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/PaybalanceServiceImpl.java
  21. 8 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/RecbalanceServiceImpl.java
  22. 14 3
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/VerificationServiceImpl.java
  23. 5 0
      applications/purchase/purchase-server/pom.xml
  24. 0 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/PurchaseApplication.java
  25. 4 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/ProdInOutList.java
  26. 7 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  27. 7 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  28. 3 0
      applications/purchase/purchase-server/src/main/resources/application.yml
  29. 3 0
      applications/purchase/purchase-server/src/main/resources/config/application-docker-prod.yml
  30. 33 4
      applications/purchase/purchase-server/src/main/resources/mapper/ProdInOutListMapper.xml
  31. 2 2
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseReportMapper.xml
  32. 0 45
      applications/purchase/purchase-server/src/test/PurchaseTest.java
  33. 33 0
      applications/purchase/purchase-server/src/test/java/com/usoftchina/saas/purchase/controller/PurchaseControllerTest.java
  34. 9 3
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  35. 8 1
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  36. 3 0
      applications/sale/sale-server/src/main/resources/application.yml
  37. 3 0
      applications/sale/sale-server/src/main/resources/config/application-docker-prod.yml
  38. 7 1
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/MakeServiceImpl.java
  39. 8 1
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/ProdInOutServiceImpl.java
  40. 8 1
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/StocktakingServiceImpl.java
  41. 3 0
      applications/storage/storage-server/src/main/resources/application.yml
  42. 3 0
      applications/storage/storage-server/src/main/resources/config/application-docker-prod.yml
  43. 1 1
      applications/storage/storage-server/src/main/resources/mapper/ProdInOutMapper.xml
  44. 77 0
      base-servers/account/account-api/src/main/java/com/usoftchina/saas/account/cache/CompanyCache.java
  45. 9 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountDTO.java
  46. 10 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyBaseDTO.java
  47. 14 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyDTO.java
  48. 12 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Company.java
  49. 10 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/vo/CompanyBaseVO.java
  50. 15 4
      base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml
  51. 32 0
      base-servers/datacenter/datacenter-api/pom.xml
  52. 26 0
      base-servers/datacenter/datacenter-api/src/main/java/com/usoftchina/saas/dc/api/DataSourceApi.java
  53. 69 0
      base-servers/datacenter/datacenter-api/src/main/java/com/usoftchina/saas/dc/cache/DataSourceCache.java
  54. 35 0
      base-servers/datacenter/datacenter-client/pom.xml
  55. 28 0
      base-servers/datacenter/datacenter-client/src/main/java/com/usoftchina/saas/dc/client/configuration/DataCenterAutoConfiguration.java
  56. 52 0
      base-servers/datacenter/datacenter-client/src/main/java/com/usoftchina/saas/dc/client/interceptor/DataSourceInterceptor.java
  57. 3 0
      base-servers/datacenter/datacenter-client/src/main/resources/META-INF/spring.factories
  58. 22 0
      base-servers/datacenter/datacenter-dto/pom.xml
  59. 109 0
      base-servers/datacenter/datacenter-dto/src/main/java/com/usoftchina/saas/dc/dto/DataSourceInfoDTO.java
  60. 65 0
      base-servers/datacenter/datacenter-server/pom.xml
  61. 6 0
      base-servers/datacenter/datacenter-server/src/main/docker/Dockerfile
  62. 20 0
      base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/DatacenterApplication.java
  63. 28 0
      base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/controller/DataSourceInfoController.java
  64. 21 0
      base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/mapper/DataSourceInfoMapper.java
  65. 82 0
      base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/po/DataSourceInfo.java
  66. 19 0
      base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/service/DataSourceInfoService.java
  67. 23 0
      base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/service/impl/DataSourceInfoServiceImpl.java
  68. 81 0
      base-servers/datacenter/datacenter-server/src/main/resources/application.yml
  69. 12 0
      base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker-dev.yml
  70. 23 0
      base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker-prod.yml
  71. 12 0
      base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker-test.yml
  72. 10 0
      base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker.yml
  73. 131 0
      base-servers/datacenter/datacenter-server/src/main/resources/logback-spring.xml
  74. 20 0
      base-servers/datacenter/datacenter-server/src/main/resources/mapper/DataSourceInfoMapper.xml
  75. 22 0
      base-servers/datacenter/pom.xml
  76. 1 0
      base-servers/pom.xml
  77. 1 1
      base-servers/ui-server/src/main/resources/application.yml
  78. 16 0
      framework/core/src/main/java/com/usoftchina/saas/jdbc/Connectable.java
  79. 143 0
      framework/core/src/main/java/com/usoftchina/saas/jdbc/DynamicDataSource.java
  80. 25 0
      framework/core/src/main/java/com/usoftchina/saas/jdbc/DynamicDataSourceContextHolder.java
  81. 42 0
      framework/core/src/main/java/com/usoftchina/saas/jdbc/DynamicDataSourceRegister.java
  82. 60 0
      framework/core/src/main/java/com/usoftchina/saas/jdbc/JdbcUrl.java
  83. 5 0
      framework/server-starter/pom.xml
  84. 4 1
      framework/server-starter/src/main/java/com/usoftchina/saas/server/ServerAutoConfiguration.java
  85. 1 1
      framework/server-starter/src/main/java/com/usoftchina/saas/server/error/DefaultErrorConfig.java
  86. 140 0
      framework/server-starter/src/main/java/com/usoftchina/saas/server/jdbc/DynamicDataSourceConfig.java
  87. 17 0
      framework/server-starter/src/main/java/com/usoftchina/saas/server/jdbc/EnableDynamicDataSource.java
  88. 29 2
      frontend/saas-web/app/view/document/product/FormPanel.js
  89. 2 2
      frontend/saas-web/app/view/money/fundtransfer/QueryPanel.js
  90. 4 8
      frontend/saas-web/app/view/money/fundtransfer/QueryPanelController.js
  91. 2 2
      frontend/saas-web/app/view/money/othreceipts/QueryPanel.js
  92. 4 8
      frontend/saas-web/app/view/money/othreceipts/QueryPanelController.js
  93. 2 2
      frontend/saas-web/app/view/money/othspendings/QueryPanel.js
  94. 4 8
      frontend/saas-web/app/view/money/othspendings/QueryPanelController.js
  95. 18 2
      frontend/saas-web/app/view/money/payBalance/QueryPanel.js
  96. 4 8
      frontend/saas-web/app/view/money/payBalance/QueryPanelController.js
  97. 18 2
      frontend/saas-web/app/view/money/recBalance/QueryPanel.js
  98. 4 6
      frontend/saas-web/app/view/money/recBalance/QueryPanelController.js
  99. 2 2
      frontend/saas-web/app/view/money/verification/QueryPanel.js
  100. 4 8
      frontend/saas-web/app/view/money/verification/QueryPanelController.js

+ 1 - 1
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java

@@ -36,7 +36,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     BIZ_RELUPDATE_AMOUNT(79312,"存在关联单据,不允许更新期初应收,期初预收,期初日期"),
     BIZ_BANNED(79313, "只能禁用已开启的单据"),
     BIZ_ENABLE(79314, "只能开启已禁用的单据"),
-
+    BIZ_NULLCALLER(79315, "该单据的定义不存在"),
 
     NO_OPRATIONDATA(79400,"无可操作单据"),
     NULL_DATA(23232,"无数据"),

+ 1 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/MaxnumberController.java

@@ -31,7 +31,7 @@ public class MaxnumberController {
     @PostMapping("/pushMaxnubmer")
     public Result<String> pushMaxnubmer(@RequestParam("count") Integer count, @RequestParam("code") String code,
                                 @RequestParam("caller") String caller) {
-        return Result.success(maxnumberService.pushMaxnubmer(count, code, caller));
+        return maxnumberService.pushMaxnubmer(count, code, caller);
     }
 
     @GetMapping("/list")

+ 2 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/MaxnumberService.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.commons.service;
 
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseService;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
@@ -15,7 +16,7 @@ import com.usoftchina.saas.page.PageRequest;
 public interface MaxnumberService extends CommonBaseService<MaxnumbersMapper, Maxnumbers> {
     String getMaxnumner(String caller, boolean update);
 
-    String pushMaxnubmer(Integer count, String code, String caller);
+    Result pushMaxnubmer(Integer count, String code, String caller);
 
     PageInfo<Maxnumbers> getListData(PageRequest page, ListReqDTO listReqDTO);
 

+ 0 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java

@@ -209,7 +209,6 @@ public class ExcelServiceImpl implements ExcelService{
                                        break;
                                    }
                                }
-
                            }
                            //插入主表数据
                            if (null != mainData) {

+ 34 - 38
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/MaxnumberServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.commons.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
@@ -52,7 +53,7 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
     @Override
     public String getMaxnumner(String caller, boolean update) {
         if (null == caller) {
-            return null;
+            throw new BizException(BizExceptionCode.BIZ_NULLCALLER);
         }
         //单号
         String maxcode = null;
@@ -67,35 +68,32 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
         Long companyId = BaseContextHolder.getCompanyId();
         Long userId = BaseContextHolder.getUserId();
         //查询编号规则
-        Maxnumbers maxnumbers = getMaxnumbers(caller);
-        if (null != maxnumbers) {
-           rulecode = getRulecode(maxnumbers);
-           length = maxnumbers.getMn_number();
-            //查询从表是否存在该规则数据
-            Maxnumbersdetail detail = getMaxDetail(caller, rulecode);
-            if (null == detail) {
-                //不存在则插入
-                detail = new Maxnumbersdetail();
-                detail.setMd_caller(caller);
-                detail.setMd_leadcode(rulecode);
-                detail.setMd_maxno(maxno);
-                detail.setCompanyId(companyId);
-                detail.setCreateTime(new Date());
-                detail.setCreatorId(userId);
-                maxnumbersdetailMapper.insertSelective(detail);
-            } else {
-                //存在则取最大值
-                maxno = detail.getMd_maxno() + 1;
-            }
-            maxcode = rulecode + createSerialNum(length, maxno);
-            //如果以更新方式取编号
-            if (update) {
-                /*detail.setUpdateTime(new Date());
-                detail.setUpdaterId(userId);
-                detail.setMd_maxno(maxno);
-                maxnumbersdetailMapper.updateByPrimaryKeySelective(detail);*/
-                maxnumbersdetailMapper.updateMaxno(detail.getId(), maxno, BaseContextHolder.getCompanyId());
-            }
+        Maxnumbers maxnumbers = findMaxnumbers(caller);
+        if (maxnumbers == null) {
+            throw new BizException(BizExceptionCode.NULL_CODERULE);
+        }
+       rulecode = getRulecode(maxnumbers);
+       length = maxnumbers.getMn_number();
+        //查询从表是否存在该规则数据
+        Maxnumbersdetail detail = getMaxDetail(caller, rulecode);
+        if (null == detail) {
+            //不存在则插入
+            detail = new Maxnumbersdetail();
+            detail.setMd_caller(caller);
+            detail.setMd_leadcode(rulecode);
+            detail.setMd_maxno(maxno);
+            detail.setCompanyId(companyId);
+            detail.setCreateTime(new Date());
+            detail.setCreatorId(userId);
+            maxnumbersdetailMapper.insertSelective(detail);
+        } else {
+            //存在则取最大值
+            maxno = detail.getMd_maxno() + 1;
+        }
+        maxcode = rulecode + createSerialNum(length, maxno);
+        //如果以更新方式取编号
+        if (update) {
+            maxnumbersdetailMapper.updateMaxno(detail.getId(), maxno, BaseContextHolder.getCompanyId());
         }
         return maxcode;
     }
@@ -108,7 +106,7 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
     * @Date: 2018/10/18
     */
     @Override
-    public String pushMaxnubmer(Integer count, String code, String caller) {
+    public Result<String> pushMaxnubmer(Integer count, String code, String caller) {
         //单号
         String maxcode =  code;
         //公司Id
@@ -120,7 +118,7 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
         //流水位数
         Integer length = 0;
         //查询编号规则
-        Maxnumbers maxnumbers = getMaxnumbers(caller);
+        Maxnumbers maxnumbers = findMaxnumbers(caller);
         if (null == maxnumbers) {
             throw new BizException(BizExceptionCode.NULL_CODERULE);
         }
@@ -130,11 +128,11 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
             if (count > 0) {
                 throw new BizException(BizExceptionCode.CODE_EXISTS);
             }
-            return maxcode;
+            return  Result.success(rulecode);
         }
         //与规则匹配的编号
         if (count > 0) {
-            return getMaxnumner(caller, true);
+            return Result.success(getMaxnumner(caller, true));
         }
 
         //查询从表是否存在该规则数据
@@ -152,7 +150,7 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
             }
 
         }
-        return maxcode;
+        return Result.success(maxcode);
     }
 
     @Override
@@ -247,7 +245,7 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
     * @Author: guq
     * @Date: 2018/10/19
     */
-    private Maxnumbers getMaxnumbers(String caller) {
+    private Maxnumbers findMaxnumbers(String caller) {
        Long companyId = BaseContextHolder.getCompanyId();
         return maxnumbersMapper.selectByCaller(caller, companyId);
     }
@@ -292,8 +290,6 @@ public class MaxnumberServiceImpl extends CommonBaseServiceImpl<MaxnumbersMapper
         } else {
             date = "";
         }
-/*        String date = "YYYYMM".equals(mn_rule) ? DateUtils.format(new Date(), "yyyyMM") :
-                DateUtils.format(new Date(), "yyyyMMdd");*/
         return rulecode += date;
     }
 

+ 3 - 0
applications/commons/commons-server/src/main/resources/application.yml

@@ -34,6 +34,9 @@ spring:
   sleuth:
     sampler:
       probability: 1.0
+  redis:
+    host: 192.168.0.182
+    port: 6379
 management:
   endpoints:
     web:

+ 3 - 0
applications/commons/commons-server/src/main/resources/config/application-docker-prod.yml

@@ -16,5 +16,8 @@ spring:
     url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: saas
     password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
 logging:
   destination: 10.10.100.160:5000

+ 1 - 2
applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductDTO.java

@@ -39,6 +39,5 @@ public class ProductDTO implements Serializable {
     //productonhand
     private Double po_onhand;
 
-
-
+    private Double po_avprice;
 }

+ 14 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/BankinformationServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.document.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -242,8 +243,18 @@ public class BankinformationServiceImpl extends CommonBaseServiceImpl<Bankinform
             throw new BizException(BizExceptionCode.NULL_CODE);
         }
         Long companyId = BaseContextHolder.getCompanyId();
-        Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
-                getMapper().validateCodeWhenUpdate(code, id, companyId);
-        return maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.BANKINFORMATION.getCaller()).getData();
+        String billCode = null;
+        synchronized (BankinformationServiceImpl.class) {
+            Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
+                    getMapper().validateCodeWhenUpdate(code, id, companyId);
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.BANKINFORMATION.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+           //  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.BANKINFORMATION.getCaller()).getData();
+        }
+        return billCode;
     }
 }

+ 14 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/BomServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.document.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -310,8 +311,18 @@ public class BomServiceImpl extends CommonBaseServiceImpl<BomMapper, Bom> implem
             throw new BizException(BizExceptionCode.NULL_CODE);
         }
         Long companyId = BaseContextHolder.getCompanyId();
-        Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
-                getMapper().validateCodeWhenUpdate(code, id, companyId);
-        return maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.BOM.getCaller()).getData();
+        String billCode= null;
+        synchronized (BomServiceImpl.class) {
+            Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
+                    getMapper().validateCodeWhenUpdate(code, id, companyId);
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.BOM.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.BOM.getCaller()).getData();
+        }
+        return billCode;
     }
 }

+ 8 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.document.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -608,7 +609,13 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
         synchronized (CustomerServiceImpl.class){
             Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
                     getMapper().validateCodeWhenUpdate(code, id, companyId);
-            cu_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.CUSTOMER.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.CUSTOMER.getCaller());
+            if (res.isSuccess()) {
+                cu_code = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //cu_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.CUSTOMER.getCaller()).getData();
         }
         return cu_code;
     }

+ 9 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/EmployeeServiceImpl.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.account.api.AccountApi;
 import com.usoftchina.saas.account.dto.AccountDTO;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -211,10 +212,16 @@ public class EmployeeServiceImpl extends CommonBaseServiceImpl<EmployeeMapper, E
         synchronized (EmployeeServiceImpl.class){
             Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
                     getMapper().validateCodeWhenUpdate(code, id, companyId);
-            em_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.EMPLOYEE.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.EMPLOYEE.getCaller());
+            if (res.isSuccess()) {
+                em_code = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            /*em_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.EMPLOYEE.getCaller()).getData();
             if (em_code==null){
                 em_code = code;
-            }
+            }*/
         }
         return em_code;
     }

+ 8 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -688,7 +689,13 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         synchronized (ProductServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
                     getMapper().validateCodeWhenUpdate(code, id, companyId);
-            billCode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PRODUCT.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PRODUCT.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //billCode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PRODUCT.getCaller()).getData();
         }
         return billCode;
     }

+ 14 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/VendorServiceImpl.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.document.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -525,9 +526,19 @@ public class VendorServiceImpl extends CommonBaseServiceImpl<VendorMapper, Vendo
             throw new BizException(BizExceptionCode.NULL_CODE);
         }
         Long companyId = BaseContextHolder.getCompanyId();
-        Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
-                getMapper().validateCodeWhenUpdate(code, id, companyId);
-        return maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.VENDOR.getCaller()).getData();
+        String billcode = null;
+        synchronized (VendorServiceImpl.class) {
+            Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
+                    getMapper().validateCodeWhenUpdate(code, id, companyId);
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.VENDOR.getCaller());
+            if (res.isSuccess()) {
+                billcode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+           //billcode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.VENDOR.getCaller()).getData();
+        }
+        return billcode;
     }
 
     /**

+ 14 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/WarehouseServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.document.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -297,9 +298,19 @@ public class WarehouseServiceImpl extends CommonBaseServiceImpl<WarehouseMapper,
             throw new BizException(BizExceptionCode.NULL_CODE);
         }
         Long companyId = BaseContextHolder.getCompanyId();
-        Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
-                getMapper().validateCodeWhenUpdate(code, id, companyId);
-        return maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.WAREHOUSE.getCaller()).getData();
+        String billCode = null;
+        synchronized (WarehouseServiceImpl.class) {
+            Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
+                    getMapper().validateCodeWhenUpdate(code, id, companyId);
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.WAREHOUSE.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            // maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.WAREHOUSE.getCaller()).getData();
+        }
+       return billCode;
     }
 
     /**

+ 11 - 10
applications/document/document-server/src/main/resources/mapper/ProductMapper.xml

@@ -43,6 +43,7 @@
         <result column="pr_whname" property="pr_whname" jdbcType="VARCHAR"/>
         <!--productonhand-->
         <result column="po_onhand" property="po_onhand" jdbcType="DOUBLE"/>
+        <result column="po_avprice" property="po_avprice" jdbcType="DOUBLE"/>
         <!--productonhand-->
         <result column="pr_kind" property="pr_kind" jdbcType="VARCHAR"/>
         <result column="pr_orispeccode" property="pr_orispeccode" jdbcType="VARCHAR"/>
@@ -459,36 +460,36 @@
         <result column="pr_unit" property="rc_prodUnit" jdbcType="VARCHAR"/>
         <result column="wh_code" property="rc_whCode" jdbcType="VARCHAR"/>
         <result column="wh_description" property="rc_whName" jdbcType="VARCHAR"/>
-        <result column="pw_onhand" property="rc_number" jdbcType="DOUBLE"/>
-        <result column="pw_avprice" property="rc_price" jdbcType="DOUBLE"/>
-        <result column="pw_amount" property="rc_amount" jdbcType="DOUBLE"/>
+        <result column="onhand" property="rc_number" jdbcType="DOUBLE"/>
+        <result column="po_avprice" property="rc_price" jdbcType="DOUBLE"/>
+        <result column="po_amount" property="rc_amount" jdbcType="DOUBLE"/>
     </resultMap>
     <select id="selectReserveCost" resultMap="ProdReserveCostResultMap">
-        select * from productWH tab left join Product on pw_prodid=pr_id left join warehouse on pw_whid=wh_id
+        select pr_code,pr_spec,pr_detail,pr_unit,wh_code,wh_description,pw_onhand onhand
+        from productWH left join Product on pw_prodid=pr_id left join warehouse on pw_whid=wh_id
         <where>
             <if test="con!=null">
                 ${con}
             </if>
             <if test="companyId!=null">
-                and tab.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
+                and productWH.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
                 and pw_onhand!=0
             </if>
         </where>
         ORDER BY PR_ID DESC
     </select>
     <select id="selectReserveCostByIgnoreWarehouse" resultMap="ProdReserveCostResultMap">
-        select pr_code,pr_spec,pr_detail,pr_unit,sum(pw_onhand) pw_onhand,sum(pw_amount) pw_amount
-        from productWH tab left join Product on pw_prodid=pr_id left join warehouse on pw_whid=wh_id
+        select pr_code,pr_spec,pr_detail,pr_unit,po_onhand onhand,po_avprice,po_amount
+        from productonhand  left join product on pr_id = po_prodid and productonhand.companyId = product.companyId
         <where>
             <if test="con!=null">
                 ${con}
             </if>
             <if test="companyId!=null">
-                and tab.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
-                and pw_onhand!=0
+                and productonhand.companyId=#{companyId}
+                and po_onhand != 0
             </if>
         </where>
-        group by pr_code,pr_spec,pr_detail,pr_unit,pr_id
         ORDER BY PR_ID DESC
     </select>
     <select id="selectCalculateFields" resultType="string">

+ 8 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/FundtransferServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -362,7 +363,13 @@ public class FundtransferServiceImpl extends CommonBaseServiceImpl<FundtransferM
         synchronized(FundtransferServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? fundtransferMapper.validateCodeWhenInsert(code, companyId) :
                     fundtransferMapper.validateCodeWhenUpdate(code, id, companyId);
-            codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.FUNDTRANSFER.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.FUNDTRANSFER.getCaller());
+            if (res.isSuccess()) {
+                codeString = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.FUNDTRANSFER.getCaller()).getData();
         }
         return codeString;
     }

+ 8 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthreceiptsServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.CommonService;
 import com.usoftchina.saas.commons.api.MaxnumberService;
@@ -382,7 +383,13 @@ public class OthreceiptsServiceImpl extends CommonBaseServiceImpl<OthreceiptsMap
         synchronized(OthreceiptsServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? othreceiptsMapper.validateCodeWhenInsert(code, companyId) :
                     othreceiptsMapper.validateCodeWhenUpdate(code, id, companyId);
-            codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.OTHRECEIPTS.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.OTHRECEIPTS.getCaller());
+            if (res.isSuccess()) {
+                codeString = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.OTHRECEIPTS.getCaller()).getData();
         }
         return codeString;
     }

+ 8 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthspendingsServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -377,7 +378,13 @@ public class OthspendingsServiceImpl extends CommonBaseServiceImpl<OthspendingsM
         synchronized(OthspendingsServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? othspendingsMapper.validateCodeWhenInsert(code, companyId) :
                     othspendingsMapper.validateCodeWhenUpdate(code, id, companyId);
-            codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.OTHSPENDINGS.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.OTHSPENDINGS.getCaller());
+            if (res.isSuccess()) {
+                codeString = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.OTHSPENDINGS.getCaller()).getData();
         }
         return codeString;
     }

+ 8 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/PaybalanceServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.CommonService;
 import com.usoftchina.saas.commons.api.MaxnumberService;
@@ -510,7 +511,13 @@ public class PaybalanceServiceImpl extends CommonBaseServiceImpl<PaybalanceMappe
         synchronized(PaybalanceServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? paybalanceMapper.validateCodeWhenInsert(code, companyId) :
                     paybalanceMapper.validateCodeWhenUpdate(code, id, companyId);
-            codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PAYBALANCE.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PAYBALANCE.getCaller());
+            if (res.isSuccess()) {
+                codeString = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PAYBALANCE.getCaller()).getData();
         }
         return codeString;
     }

+ 8 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/RecbalanceServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.CommonService;
 import com.usoftchina.saas.commons.api.MaxnumberService;
@@ -521,7 +522,13 @@ public class RecbalanceServiceImpl extends CommonBaseServiceImpl<RecbalanceMappe
         synchronized(RecbalanceServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? recbalanceMapper.validateCodeWhenInsert(code, companyId) :
                     recbalanceMapper.validateCodeWhenUpdate(code, id, companyId);
-            codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.RECBALANCE.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.RECBALANCE.getCaller());
+            if (res.isSuccess()) {
+                codeString = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //codeString = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.RECBALANCE.getCaller()).getData();
         }
         return codeString;
     }

+ 14 - 3
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/VerificationServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.money.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -1081,8 +1082,18 @@ public class VerificationServiceImpl extends CommonBaseServiceImpl<VerificationM
         if (null == code) {
             throw new BizException(BizExceptionCode.NULL_CODE);
         }
-        Integer count = "0".equals(String.valueOf(id)) ? verificationMapper.validateCodeWhenInsert(code) :
-                verificationMapper.validateCodeWhenUpdate(code, id);
-        return maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.VERIFICATION.getCaller()).getData();
+        String billCode = null;
+        synchronized (VerificationServiceImpl.class) {
+            Integer count = "0".equals(String.valueOf(id)) ? verificationMapper.validateCodeWhenInsert(code) :
+                    verificationMapper.validateCodeWhenUpdate(code, id);
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.VERIFICATION.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+        }
+        return billCode;
+       // return maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.VERIFICATION.getCaller()).getData();
     }
 }

+ 5 - 0
applications/purchase/purchase-server/pom.xml

@@ -81,6 +81,11 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>commons-api</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>datacenter-client</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 0 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/PurchaseApplication.java

@@ -1,6 +1,5 @@
 package com.usoftchina.saas.purchase;
 
-
 import com.usoftchina.saas.auth.client.EnableAuthClient;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;

+ 4 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/ProdInOutList.java

@@ -173,4 +173,8 @@ public class ProdInOutList extends CommonBaseEntity{
     private String pr_text3;
     private String pr_text4;
 
+    //关联验收
+    private String iocode;
+
+    private Integer iodetno;
 }

+ 7 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java

@@ -646,7 +646,13 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             }else if("采购验退单".equals(pi_class)) {
                 caller = BillCodeSeq.PURCHASEOUT.getCaller();
             }
-            billCode = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller);
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //billCode = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
         }
         return billCode;
     }

+ 7 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java

@@ -607,7 +607,13 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         synchronized (PurchaseServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? purchaseMapper.validateCodeWhenInsert(code, companyId) :
                     purchaseMapper.validateCodeWhenUpdate(code, id, companyId);
-            billCode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PURCHASE.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PURCHASE.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+           // billCode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.PURCHASE.getCaller()).getData();
         }
         return billCode;
     }

+ 3 - 0
applications/purchase/purchase-server/src/main/resources/application.yml

@@ -35,6 +35,9 @@ spring:
   sleuth:
     sampler:
       probability: 1.0
+  redis:
+    host: 192.168.0.182
+    port: 6379
 eureka:
   instance:
     leaseRenewalIntervalInSeconds: 10

+ 3 - 0
applications/purchase/purchase-server/src/main/resources/config/application-docker-prod.yml

@@ -16,5 +16,8 @@ spring:
     url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: saas
     password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
 logging:
   destination: 10.10.100.160:5000

+ 33 - 4
applications/purchase/purchase-server/src/main/resources/mapper/ProdInOutListMapper.xml

@@ -100,6 +100,8 @@
     <result column="pr_text2" property="pr_text2"/>
     <result column="pr_text3" property="pr_text3"/>
     <result column="pr_text4" property="pr_text4"/>
+    <result column="iocode" jdbcType="VARCHAR" property="iocode" />
+    <result column="iodetno" jdbcType="INTEGER" property="iodetno" />
   </resultMap>
 
   <resultMap id="homePageList" type="com.usoftchina.saas.purchase.po.ProdHomePageList">
@@ -231,10 +233,37 @@
     </where>
     order by pi_id desc,pd_pdno desc
   </select>
-
+  <sql id="Prodinout_Column_List" >
+    prodinout.pi_id pi_id,prodinout.pi_inoutno pi_inoutno,prodinout.pi_class pi_class,prodinout.pi_date pi_date,prodinout.pi_vendid pi_vendid,prodinout.pi_vendcode pi_vendcode,prodinout.pi_vendname pi_vendname,prodinout.pi_custid pi_custid,prodinout.pi_custcode pi_custcode,prodinout.pi_custname pi_custname,prodinout.pi_puid pi_puid,prodinout.pi_pucode pi_pucode,prodinout.pi_said pi_said,prodinout.pi_sacode pi_sacode,prodinout.pi_total pi_total,prodinout.pi_address pi_address,prodinout.pi_ioid pi_ioid,prodinout.pi_status pi_status,prodinout.pi_statuscode pi_statuscode,prodinout.pi_printstatus pi_printstatus,prodinout.pi_printstatuscode pi_printstatuscode,prodinout.companyid companyid,prodinout.updaterId updaterId,prodinout.updatetime updatetime,prodinout.pi_text1 pi_text1,prodinout.pi_text2 pi_text2,prodinout.pi_text3 pi_text3,prodinout.pi_text4 pi_text4,prodinout.pi_text5 pi_text5,prodinout.pi_nettotal pi_nettotal,prodinout.pi_auditdate pi_auditdate,prodinout.pi_auditman pi_auditman,prodinout.pi_remark pi_remark,
+prodinout.creatorName creatorName,prodinout.creatorId creatorId,prodinout.createTime createTime,prodinout.updaterName updaterName,prodinout.pi_macode pi_macode,prodinout.pi_maid pi_maid,prodinout.pi_prstatuscode pi_prstatuscode,prodinout.pi_prstatus pi_prstatus,prodinout.pi_iocode pi_iocode,
+  </sql>
+  <sql id="Prodiodetail_Column_List" >
+    prodiodetail.pd_id pd_id,prodiodetail.pd_piid pd_piid,prodiodetail.pd_inoutno pd_inoutno,prodiodetail.pd_piclass pd_piclass,prodiodetail.pd_pdno pd_pdno,prodiodetail.pd_ordercode pd_ordercode,prodiodetail.pd_orderdetno pd_orderdetno,prodiodetail.pd_prodid pd_prodid,prodiodetail.pd_prodcode pd_prodcode,prodiodetail.pd_unit pd_unit,prodiodetail.pd_inqty pd_inqty,prodiodetail.pd_outqty pd_outqty,prodiodetail.pd_orderprice pd_orderprice,prodiodetail.pd_sendprice pd_sendprice,prodiodetail.pd_price pd_price,prodiodetail.pd_total pd_total,prodiodetail.pd_taxrate pd_taxrate,prodiodetail.pd_netprice pd_netprice,prodiodetail.pd_nettotal pd_nettotal,prodiodetail.pd_whid pd_whid,prodiodetail.pd_whcode pd_whcode,prodiodetail.pd_whname pd_whname,prodiodetail.pd_inwhid pd_inwhid,prodiodetail.pd_inwhcode pd_inwhcode,prodiodetail.pd_inwhname pd_inwhname,prodiodetail.pd_orderid pd_orderid,prodiodetail.pd_sdid pd_sdid,prodiodetail.pd_status pd_status,prodiodetail.pd_remark pd_remark,prodiodetail.pd_text1 pd_text1,prodiodetail.pd_text2 pd_text2,prodiodetail.pd_text3 pd_text3,
+    prodiodetail.pd_text4 pd_text4,prodiodetail.pd_text5 pd_text5,prodiodetail.pd_ym pd_ym,prodiodetail.pd_yqty pd_yqty,prodiodetail.pd_ioid pd_ioid,prodiodetail.pd_ordertotal pd_ordertotal
+    ,prodiodetail.pd_profit pd_profit,
+    prodiodetail.pd_profitpresent pd_profitpresent,
+  </sql>
+  <sql id="Vendor_Column_List" >
+    vendor.ve_id ve_id,vendor.ve_code ve_code,vendor.ve_shortname ve_shortname,vendor.ve_name ve_name,vendor.ve_uu ve_uu,vendor.ve_type ve_type,vendor.ve_begindate ve_begindate,vendor.ve_beginapamount ve_beginapamount,vendor.ve_beginprepayamount ve_beginprepayamount,vendor.ve_promisedays ve_promisedays,vendor.ve_taxrate ve_taxrate,vendor.ve_nsrzh ve_nsrzh,vendor.ve_bankaccount ve_bankaccount,vendor.ve_bankcode ve_bankcode,vendor.ve_status ve_status,vendor.ve_statuscode ve_statuscode,vendor.ve_text1 ve_text1,vendor.ve_text2 ve_text2,vendor.ve_text3 ve_text3,vendor.ve_text4 ve_text4,vendor.ve_text5 ve_text5,vendor.ve_payamount ve_payamount,vendor.ve_leftamount ve_leftamount,vendor.ve_beginym ve_beginym,vendor.ve_preamount ve_preamount,vendor.ve_remark ve_remark,vendor.ve_buyerid ve_buyerid,vendor.ve_buyercode ve_buyercode,vendor.ve_buyername ve_buyername,
+  </sql>
+  <sql id="Product_Column_List" >
+    product.pr_id pr_id,product.pr_code pr_code,product.pr_detail pr_detail,product.pr_spec pr_spec,product.pr_unit pr_unit,product.pr_kind pr_kind,product.pr_orispeccode pr_orispeccode,product.pr_whid pr_whid,product.pr_whcode pr_whcode,product.pr_whname pr_whname,product.pr_zxbzs pr_zxbzs,product.pr_leadtime pr_leadtime,product.pr_brand pr_brand,product.pr_standardprice pr_standardprice,product.pr_purcprice pr_purcprice,product.pr_saleprice pr_saleprice,product.pr_vendid pr_vendid,product.pr_vendcode pr_vendcode,product.pr_vendname pr_vendname,product.pr_status pr_status,product.pr_statuscode pr_statuscode,product.pr_text1 pr_text1,product.pr_text2 pr_text2,product.pr_text3 pr_text3,product.pr_text4 pr_text4,product.pr_text5 pr_text5,
+  </sql>
+  <sql id="Iopd_Column_List" >
+    iopd.pd_inoutno iocode,iopd.pd_pdno iodetno
+  </sql>
   <select id="selectProdInOutListByCondition"  resultMap="BaseResultMap">
-    select  *  from prodinout left join prodiodetail on pi_id = pd_piid left join vendor on pi_vendid=ve_id
-    left join product on pd_prodid=pr_id
+    select
+    <include refid="Prodinout_Column_List" />
+    <include refid="Prodiodetail_Column_List" />
+    <include refid="Vendor_Column_List" />
+    <include refid="Product_Column_List" />
+    <include refid="Iopd_Column_List" />
+    from prodinout
+    left join prodiodetail on pi_id = prodiodetail.pd_piid
+    left join vendor on pi_vendid=ve_id
+    left join product on prodiodetail.pd_prodid=pr_id
+    left join prodiodetail iopd on iopd.pd_id = prodiodetail.pd_ioid
     <where>
       <if test="con != null">
         ${con}
@@ -243,6 +272,6 @@
         and  prodinout.companyid = #{companyId}
       </if>
     </where>
-    order by pi_id desc,pd_pdno desc
+    order by pi_id desc,prodiodetail.pd_pdno asc
   </select>
 </mapper>

+ 2 - 2
applications/purchase/purchase-server/src/main/resources/mapper/PurchaseReportMapper.xml

@@ -16,8 +16,8 @@
     <result column="companyid" property="companyId" jdbcType="BIGINT" />
 
     <result column="creatorid" property="creatorId" jdbcType="INTEGER"/>
-    <result column="createtime" property="createTime" jdbcType="TIMESTAMP" />
-    <result column="creator" property="creatorName" jdbcType="VARCHAR" />
+    <result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
+    <result column="creatorName" property="creatorName" jdbcType="VARCHAR" />
   </resultMap>
   <resultMap id="ListMap" type="com.usoftchina.saas.purchase.po.report.PurchaseReportDetail">
     <id column="pu_id" property="pu_id" jdbcType="INTEGER" />

+ 0 - 45
applications/purchase/purchase-server/src/test/PurchaseTest.java

@@ -1,45 +0,0 @@
-import com.usoftchina.saas.purchase.PurchaseApplication;
-import com.usoftchina.saas.purchase.mapper.ProdIODetailMapper;
-import com.usoftchina.saas.purchase.po.ProdIODetail;
-import com.usoftchina.saas.purchase.service.ProdInOutService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = PurchaseApplication.class)
-@EnableAutoConfiguration
-public class PurchaseTest {
-
-    @Autowired
-    private ProdInOutService prodInOutService;
-    @Autowired
-    private ProdIODetailMapper prodIODetailMapper;
-
-
-    @Test
-    public void test(){
-        List<ProdIODetail> list = new ArrayList<>();
-        ProdIODetail prodIODetail1 = new ProdIODetail();
-        prodIODetail1.setPd_piid(new Long(1));
-        prodIODetail1.setCompanyId(-1);
-        prodIODetail1.setPd_inoutno("test01");
-
-
-        ProdIODetail prodIODetail2 = new ProdIODetail();
-        prodIODetail2.setPd_piid(new Long(1));
-        prodIODetail2.setCompanyId(-1);
-        prodIODetail2.setPd_inoutno("test02");
-
-        list.add(prodIODetail1);
-        list.add(prodIODetail2);
-
-        prodIODetailMapper.batchInsert(list);
-    }
-}

+ 33 - 0
applications/purchase/purchase-server/src/test/java/com/usoftchina/saas/purchase/controller/PurchaseControllerTest.java

@@ -0,0 +1,33 @@
+package com.usoftchina.saas.purchase.controller;
+
+import com.usoftchina.saas.account.cache.AccountCache;
+import com.usoftchina.saas.account.cache.CompanyCache;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.purchase.dto.PurchaseFormDTO;
+import com.usoftchina.saas.test.BaseControllerTest;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MvcResult;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class PurchaseControllerTest extends BaseControllerTest {
+
+    @Test
+    public void testA_getFormData() throws Exception {
+        CompanyCache.of(2L).clear();
+        MvcResult mvcResult = mockMvc.perform(get("/purchase/read/200")
+                // 测试登录演示账套后,自动切换数据源
+                .header("Authorization","eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ2aXJ0dWFsMDUxNDA1IiwiYXBwSWQiOiJ0cmFkZS1hcHAiLCJ1c2VySWQiOi05OTk5OSwiY29tcGFueUlkIjoyLCJ1c2VyTmFtZSI6InZpcnR1YWwwNTE0MDUiLCJyZWFsTmFtZSI6Iua4uOWuojA1MTQwNSIsImV4cCI6MTU0NjMxOTY0NX0.kLfFDiHUT4Dc1X9DFDDBBl3BFYKEZz_uTHefc9bP1l-7eLsluGwFGDQyD6LjT67NWQrr1pZIEmk-ySOZyBbMmArW-7I2bXBo-OXlq-KIUGI3w5DhP_zHJGT3ctrR9R_O6vmOIzC-9rB7FowXQWEPLAtRqrcOSmqnXpmeuXNk4Z8"))
+                .andExpect(isSuccess())
+                .andReturn();
+        Result<PurchaseFormDTO> result = result(mvcResult, PurchaseFormDTO.class);
+        System.out.println(result.getData());
+    }
+
+}

+ 9 - 3
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java

@@ -636,13 +636,19 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         synchronized (ProdInOutServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? prodInOutMapper.validateCodeWhenInsert(code,pi_class) :
                     prodInOutMapper.validateCodeWhenUpdate(code, id);
-            String caller ="";
-            if(pi_class.equals("出货单")){
+            String caller = "出货单".equals(pi_class) ? BillCodeSeq.SALEOUT.getCaller() : BillCodeSeq.SALEIN.getCaller();
+           /* if(pi_class.equals("出货单")){
                 caller = BillCodeSeq.SALEOUT.getCaller();
             }else {//销售退货单
                 caller = BillCodeSeq.SALEIN.getCaller();
+            }*/
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, caller);
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
             }
-            billCode = maxnumberService.pushMaxnubmer(count, code, caller).getData();
+            //billCode = maxnumberService.pushMaxnubmer(count, code, caller).getData();
         }
         return billCode;
     }

+ 8 - 1
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.sale.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.api.CommonService;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -669,7 +670,13 @@ public class SaleServiceImpl implements SaleService{
         synchronized(SaleServiceImpl.class) {
             Integer count = "0".equals(String.valueOf(id)) ? saleMapper.validateCodeWhenInsert(code, companyId) :
                     saleMapper.validateCodeWhenUpdate(code, id, companyId);
-            billCode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.SALE.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.SALE.getCaller());
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //billCode = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.SALE.getCaller()).getData();
         }
         return billCode;
     }

+ 3 - 0
applications/sale/sale-server/src/main/resources/application.yml

@@ -34,6 +34,9 @@ spring:
   sleuth:
     sampler:
       probability: 1.0
+  redis:
+    host: 192.168.0.182
+    port: 6379
 eureka:
   instance:
     leaseRenewalIntervalInSeconds: 10

+ 3 - 0
applications/sale/sale-server/src/main/resources/config/application-docker-prod.yml

@@ -16,5 +16,8 @@ spring:
     url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: saas
     password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
 logging:
   destination: 10.10.100.160:5000

+ 7 - 1
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/MakeServiceImpl.java

@@ -807,7 +807,13 @@ public class MakeServiceImpl extends CommonBaseServiceImpl<MakeMapper, Make> imp
         synchronized (MakeServiceImpl.class){
             Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
                     getMapper().validateCodeWhenUpdate(code, id, companyId);
-            ma_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.MAKE.getCaller()).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.MAKE.getCaller());
+            if (res.isSuccess()) {
+                ma_code = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+           // ma_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.MAKE.getCaller()).getData();
         }
         return ma_code;
     }

+ 8 - 1
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/ProdInOutServiceImpl.java

@@ -224,6 +224,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
                 baseDTO = saveFormData(formData);
                 id = baseDTO.getId();
             }
+            formData.getMain().setId(id);
             singleAudit(formData.getMain());
             baseDTO = getBaseDTOById(id,formData.getMain().getPi_class(),formData.getMain().getPi_inoutno());
         }
@@ -460,7 +461,13 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             }else if("调拨单".equals(pi_class)) {
                 caller = BillCodeSeq.APPROPRIATIONINOUT.getCaller();
             }
-            code = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller);
+            if (res.isSuccess()) {
+                code = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //code = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
         }
         return code;
     }

+ 8 - 1
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/StocktakingServiceImpl.java

@@ -2,6 +2,7 @@ package com.usoftchina.saas.storage.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
@@ -216,7 +217,13 @@ public class StocktakingServiceImpl extends CommonBaseServiceImpl<StockTakingMap
             }else if("其它出库单".equals(pi_class)) {
                 caller = BillCodeSeq.OTHEROUT.getCaller();
             }
-            billCode = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
+            Result<String> res = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller);
+            if (res.isSuccess()) {
+                billCode = res.getData();
+            } else {
+                throw new BizException(123456, res.getMessage());
+            }
+            //billCode = maxnumberService.pushMaxnubmer(count, pi_inoutno, caller).getData();
         }
         return billCode;
     }

+ 3 - 0
applications/storage/storage-server/src/main/resources/application.yml

@@ -35,6 +35,9 @@ spring:
   sleuth:
     sampler:
       probability: 1.0
+  redis:
+    host: 192.168.0.182
+    port: 6379
 eureka:
   instance:
     leaseRenewalIntervalInSeconds: 10

+ 3 - 0
applications/storage/storage-server/src/main/resources/config/application-docker-prod.yml

@@ -16,5 +16,8 @@ spring:
     url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: saas
     password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
 logging:
   destination: 10.10.100.160:5000

+ 1 - 1
applications/storage/storage-server/src/main/resources/mapper/ProdInOutMapper.xml

@@ -415,7 +415,7 @@
   </delete>
 
   <update id="updateCreator">
-    update prodinout set creatorId = #{userId} , creatorName=#{userName} where pi_id=#{id}
+    update prodinout set creatorId = #{userId} , creatorName=#{userName},createTime=NOW() where pi_id=#{id}
   </update>
 
 

+ 77 - 0
base-servers/account/account-api/src/main/java/com/usoftchina/saas/account/cache/CompanyCache.java

@@ -0,0 +1,77 @@
+package com.usoftchina.saas.account.cache;
+
+import com.usoftchina.saas.account.api.CompanyApi;
+import com.usoftchina.saas.account.dto.CompanyDTO;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.cache.RedisHashCache;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.context.SpringContextHolder;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.utils.JsonUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.Optional;
+import java.util.function.Supplier;
+
+/**
+ * @author yingp
+ * @date 2018/11/1
+ */
+public class CompanyCache extends RedisHashCache<String, String, String> {
+
+    private final Long companyId;
+
+    private static final RedisTemplate<String, String> REDIS_TEMPLATE = SpringContextHolder.getBean("redisTemplate", RedisTemplate.class);
+    private CompanyApi companyApi;
+
+    private CompanyCache(Long companyId) {
+        super(() -> REDIS_TEMPLATE);
+        this.companyId = companyId;
+    }
+
+    public static CompanyCache of(Long companyId) {
+        return new CompanyCache(companyId);
+    }
+
+    /**
+     * 当前登录公司的缓存
+     *
+     * @return
+     */
+    public static CompanyCache current() {
+        return new CompanyCache(BaseContextHolder.getCompanyId());
+    }
+
+    @Override
+    protected String field() {
+        return String.valueOf(companyId);
+    }
+
+    @Override
+    protected String key() {
+        return generatePublicKey("account", "company");
+    }
+
+    @Override
+    protected Supplier<String> getSupplier() {
+        return () -> {
+			if (null == companyApi) {
+                companyApi = SpringContextHolder.getBean(CompanyApi.class);
+			}
+            Result<CompanyDTO> result = companyApi.getCompanyById(companyId);
+            if (result.isSuccess()) {
+                return JsonUtils.toJsonString(result.getData());
+            }
+            throw new BizException(result.getCode(), result.getMessage());
+        };
+    }
+
+    public CompanyDTO getCompany() {
+        Optional<String> value = get();
+        if (value.isPresent()) {
+            return JsonUtils.fromJsonString(value.get(), CompanyDTO.class);
+        }
+        return null;
+    }
+
+}

+ 9 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountDTO.java

@@ -167,6 +167,15 @@ public class AccountDTO implements Serializable {
         return null;
     }
 
+    @JsonIgnore
+    public CompanyBaseDTO getCompany(Long companyId) {
+        if (null != companies) {
+            return companies.stream().filter(company -> company.getId().equals(companyId))
+                    .findFirst().orElse(null);
+        }
+        return null;
+    }
+
     @Override
     public String toString() {
         return "AccountDTO{" +

+ 10 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyBaseDTO.java

@@ -11,6 +11,7 @@ import java.io.Serializable;
 public class CompanyBaseDTO implements Serializable{
     private Long id;
     private String name;
+    private String dcName;
     private String logoUrl;
 
     public Long getId() {
@@ -29,6 +30,14 @@ public class CompanyBaseDTO implements Serializable{
         this.name = name;
     }
 
+    public String getDcName() {
+        return dcName;
+    }
+
+    public void setDcName(String dcName) {
+        this.dcName = dcName;
+    }
+
     public String getLogoUrl() {
         return logoUrl;
     }
@@ -42,6 +51,7 @@ public class CompanyBaseDTO implements Serializable{
         return "CompanyBaseDTO{" +
                 "id=" + id +
                 ", name='" + name + '\'' +
+                ", dcName='" + dcName + '\'' +
                 ", logoUrl='" + logoUrl + '\'' +
                 '}';
     }

+ 14 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyDTO.java

@@ -24,6 +24,7 @@ public class CompanyDTO implements Serializable{
     private String businessCode;
     private String address;
     private String logoUrl;
+    private String dcName;
     private String tel;
     private String fax;
     private String signet;      //电子章
@@ -37,6 +38,14 @@ public class CompanyDTO implements Serializable{
         this.fileInfoList = fileInfoList;
     }
 
+    public String getDcName() {
+        return dcName;
+    }
+
+    public void setDcName(String dcName) {
+        this.dcName = dcName;
+    }
+
     public String getTel() {
         return tel;
     }
@@ -118,6 +127,11 @@ public class CompanyDTO implements Serializable{
                 ", businessCode='" + businessCode + '\'' +
                 ", address='" + address + '\'' +
                 ", logoUrl='" + logoUrl + '\'' +
+                ", dcName='" + dcName + '\'' +
+                ", tel='" + tel + '\'' +
+                ", fax='" + fax + '\'' +
+                ", signet='" + signet + '\'' +
+                ", fileInfoList=" + fileInfoList +
                 ", uu=" + uu +
                 '}';
     }

+ 12 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Company.java

@@ -31,6 +31,10 @@ public class Company implements Serializable {
      * 所属行业
      */
     private String type;
+    /**
+     * 数据中心
+     */
+    private String dcName;
 
     public String getType() {
         return type;
@@ -149,4 +153,12 @@ public class Company implements Serializable {
     public void setUu(Long uu) {
         this.uu = uu;
     }
+
+    public String getDcName() {
+        return dcName;
+    }
+
+    public void setDcName(String dcName) {
+        this.dcName = dcName;
+    }
 }

+ 10 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/vo/CompanyBaseVO.java

@@ -7,6 +7,7 @@ package com.usoftchina.saas.account.vo;
 public class CompanyBaseVO {
     private Long id;
     private String name;
+    private String dcName;
     private String logoUrl;
 
     public Long getId() {
@@ -25,6 +26,14 @@ public class CompanyBaseVO {
         this.name = name;
     }
 
+    public String getDcName() {
+        return dcName;
+    }
+
+    public void setDcName(String dcName) {
+        this.dcName = dcName;
+    }
+
     public String getLogoUrl() {
         return logoUrl;
     }
@@ -38,6 +47,7 @@ public class CompanyBaseVO {
         return "CompanyBaseVO{" +
                 "id=" + id +
                 ", name='" + name + '\'' +
+                ", dcName='" + dcName + '\'' +
                 ", logoUrl='" + logoUrl + '\'' +
                 '}';
     }

+ 15 - 4
base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml

@@ -17,14 +17,16 @@
         <result column="signet" jdbcType="VARCHAR" property="signet"/>
         <result column="uu" jdbcType="VARCHAR" property="uu"/>
         <result column="logo_url" jdbcType="VARCHAR" property="logoUrl"/>
+        <result column="dc_name" jdbcType="VARCHAR" property="dcName"/>
     </resultMap>
     <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.vo.CompanyBaseVO">
         <id column="id" jdbcType="BIGINT" property="id"/>
         <result column="name" jdbcType="VARCHAR" property="name"/>
         <result column="logo_url" jdbcType="VARCHAR" property="logoUrl"/>
+        <result column="dc_name" jdbcType="VARCHAR" property="dcName"/>
     </resultMap>
     <sql id="baseColumns">
-        id,name,business_code,address,uu,creator_id,create_time,updater_id,update_time,fax,tel,signet,uu,logo_url
+        id,name,business_code,address,uu,creator_id,create_time,updater_id,update_time,fax,tel,signet,uu,logo_url,dc_name
     </sql>
     <insert id="insert" parameterType="com.usoftchina.saas.account.po.Company"
             useGeneratedKeys="true" keyProperty="id">
@@ -32,12 +34,12 @@
             SELECT LAST_INSERT_ID() AS ID
         </selectKey>
         insert into ac_company(name, business_code, address, logo_url, creator_id, create_time, updater_id, update_time,
-        tel, fax, signet, uu, type)
+        tel, fax, signet, uu, type, dc_name)
         values (#{name,jdbcType=VARCHAR}, #{businessCode,jdbcType=VARCHAR},
         #{address,jdbcType=VARCHAR}, #{logoUrl,jdbcType=VARCHAR}, #{creatorId,jdbcType=BIGINT},
         #{createTime,jdbcType=TIMESTAMP}, #{updaterId,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP},
         #{tel,jdbcType=VARCHAR}, #{fax,jdbcType=VARCHAR}, #{signet,jdbcType=VARCHAR}, #{uu,jdbcType=VARCHAR},
-        #{type,jdbcType=VARCHAR})
+        #{type,jdbcType=VARCHAR}, #{dcName,jdbcType=VARCHAR})
     </insert>
     <insert id="insertSelective" parameterType="com.usoftchina.saas.account.po.Company"
             useGeneratedKeys="true" keyProperty="id">
@@ -55,6 +57,9 @@
             <if test="logoUrl != null">
                 logo_url,
             </if>
+            <if test="dcName != null">
+                dc_name,
+            </if>
             <if test="uu != null">
                 uu,
             </if>
@@ -84,6 +89,9 @@
             <if test="logoUrl != null">
                 #{logoUrl,jdbcType=VARCHAR},
             </if>
+            <if test="dcName != null">
+                #{dcName,jdbcType=VARCHAR},
+            </if>
             <if test="uu != null">
                 #{uu,jdbcType=BIGINT},
             </if>
@@ -114,7 +122,7 @@
         select <include refid="baseColumns"/> from ac_company where business_code=#{businessCode,jdbcType=VARCHAR}
     </select>
     <select id="selectBaseByAccountId" parameterType="java.lang.Long" resultMap="BaseResultMap">
-        select ac_company.id,ac_company.name,ac_company.logo_url from ac_account_company,ac_company
+        select ac_company.id,ac_company.name,ac_company.logo_url,ac_company.dc_name from ac_account_company,ac_company
         where ac_account_company.company_id=ac_company.id and ac_account_company.account_id=#{accountId,jdbcType=BIGINT}
     </select>
     <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
@@ -144,6 +152,9 @@
             <if test="type != null">
                 type = #{type,jdbcType=VARCHAR}
             </if>
+            <if test="dcName != null">
+                dc_name = #{dcName,jdbcType=VARCHAR}
+            </if>
         </set>
         where id = #{id}
     </update>

+ 32 - 0
base-servers/datacenter/datacenter-api/pom.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datacenter</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datacenter-api</artifactId>
+    <description>datacenter api</description>
+    <dependencies>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>datacenter-dto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 26 - 0
base-servers/datacenter/datacenter-api/src/main/java/com/usoftchina/saas/dc/api/DataSourceApi.java

@@ -0,0 +1,26 @@
+package com.usoftchina.saas.dc.api;
+
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.dc.dto.DataSourceInfoDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+@FeignClient("datacenter-server")
+public interface DataSourceApi {
+
+    /**
+     * 获取数据源配置
+     *
+     * @param dcName datacenter name
+     * @param dbName database name
+     * @return
+     */
+    @GetMapping("/ds")
+    Result<DataSourceInfoDTO> getDataSourceInfo(@RequestParam("dcName") String dcName,
+                                            @RequestParam("dbName") String dbName);
+}

+ 69 - 0
base-servers/datacenter/datacenter-api/src/main/java/com/usoftchina/saas/dc/cache/DataSourceCache.java

@@ -0,0 +1,69 @@
+package com.usoftchina.saas.dc.cache;
+
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.cache.RedisHashCache;
+import com.usoftchina.saas.context.SpringContextHolder;
+import com.usoftchina.saas.dc.api.DataSourceApi;
+import com.usoftchina.saas.dc.dto.DataSourceInfoDTO;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.utils.JsonUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.Optional;
+import java.util.function.Supplier;
+
+/**
+ * @author yingp
+ * @date 2018/11/1
+ */
+public class DataSourceCache extends RedisHashCache<String, String, String> {
+
+    private final String dcName;
+    private final String dbName;
+
+    private static final RedisTemplate<String, String> REDIS_TEMPLATE = SpringContextHolder.getBean("redisTemplate", RedisTemplate.class);
+    private DataSourceApi dataSourceApi;
+
+    private DataSourceCache(String dcName, String dbName) {
+        super(() -> REDIS_TEMPLATE);
+        this.dcName = dcName;
+        this.dbName = dbName;
+    }
+
+    public static DataSourceCache of(String dcName, String dbName) {
+        return new DataSourceCache(dcName, dbName);
+    }
+
+    @Override
+    protected String field() {
+        return dcName + ":" + dbName;
+    }
+
+    @Override
+    protected String key() {
+        return generatePublicKey("datasource");
+    }
+
+    @Override
+    protected Supplier<String> getSupplier() {
+        return () -> {
+			if (null == dataSourceApi) {
+                dataSourceApi = SpringContextHolder.getBean(DataSourceApi.class);
+			}
+            Result<DataSourceInfoDTO> result = dataSourceApi.getDataSourceInfo(dcName, dbName);
+            if (result.isSuccess()) {
+                return JsonUtils.toJsonString(result.getData());
+            }
+            throw new BizException(result.getCode(), result.getMessage());
+        };
+    }
+
+    public DataSourceInfoDTO getDataSourceInfo() {
+        Optional<String> value = get();
+        if (value.isPresent()) {
+            return JsonUtils.fromJsonString(value.get(), DataSourceInfoDTO.class);
+        }
+        return null;
+    }
+
+}

+ 35 - 0
base-servers/datacenter/datacenter-client/pom.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datacenter</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datacenter-client</artifactId>
+    <description>datacenter client</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>datacenter-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>account-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+</project>

+ 28 - 0
base-servers/datacenter/datacenter-client/src/main/java/com/usoftchina/saas/dc/client/configuration/DataCenterAutoConfiguration.java

@@ -0,0 +1,28 @@
+package com.usoftchina.saas.dc.client.configuration;
+
+import com.usoftchina.saas.dc.client.interceptor.DataSourceInterceptor;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author yingp
+ * @date 2018/12/11
+ */
+@Configuration
+@EnableFeignClients("com.usoftchina.saas.dc.api")
+public class DataCenterAutoConfiguration implements WebMvcConfigurer {
+
+    @Bean
+    public DataSourceInterceptor dataSourceInterceptor() {
+        return new DataSourceInterceptor();
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(dataSourceInterceptor()).order(1);
+        // order顺序在AuthRestInterceptor后面
+    }
+}

+ 52 - 0
base-servers/datacenter/datacenter-client/src/main/java/com/usoftchina/saas/dc/client/interceptor/DataSourceInterceptor.java

@@ -0,0 +1,52 @@
+package com.usoftchina.saas.dc.client.interceptor;
+
+import com.usoftchina.saas.account.cache.CompanyCache;
+import com.usoftchina.saas.account.dto.CompanyDTO;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.dc.cache.DataSourceCache;
+import com.usoftchina.saas.dc.dto.DataSourceInfoDTO;
+import com.usoftchina.saas.jdbc.DynamicDataSourceContextHolder;
+import com.usoftchina.saas.jdbc.DynamicDataSourceRegister;
+import com.usoftchina.saas.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author yingp
+ * @date 2018/12/11
+ */
+public class DataSourceInterceptor extends HandlerInterceptorAdapter {
+
+    @Autowired
+    private DynamicDataSourceRegister dataSourceRegister;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        long companyId = BaseContextHolder.getCompanyId();
+        if (companyId > 0) {
+            CompanyDTO company = CompanyCache.current().getCompany();
+            String dcName = company.getDcName();
+            // 该公司绑定到了指定数据中心
+            if (StringUtils.hasText(dcName)) {
+                String dbName = dataSourceRegister.getDefaultDatabaseName();
+                DataSourceInfoDTO dataSourceInfoDTO = DataSourceCache.of(dcName, dbName).getDataSourceInfo();
+                if (null != dataSourceInfoDTO) {
+                    // 如果不存在数据源则自动创建
+                    dataSourceRegister.createDataSource(dataSourceInfoDTO);
+                    DynamicDataSourceContextHolder.set(dataSourceInfoDTO);
+                }
+            }
+        }
+        return super.preHandle(request, response, handler);
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
+        DynamicDataSourceContextHolder.clear();
+        super.afterCompletion(request, response, handler, ex);
+    }
+}

+ 3 - 0
base-servers/datacenter/datacenter-client/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,3 @@
+# Auto Configuration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.usoftchina.saas.dc.client.configuration.DataCenterAutoConfiguration

+ 22 - 0
base-servers/datacenter/datacenter-dto/pom.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datacenter</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datacenter-dto</artifactId>
+    <description>datacenter data transfer object</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 109 - 0
base-servers/datacenter/datacenter-dto/src/main/java/com/usoftchina/saas/dc/dto/DataSourceInfoDTO.java

@@ -0,0 +1,109 @@
+package com.usoftchina.saas.dc.dto;
+
+import com.usoftchina.saas.jdbc.Connectable;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+public class DataSourceInfoDTO implements Connectable, Serializable{
+    private String dcName;
+    private String dbName;
+    private String dbHost;
+    private int dbPort;
+    private String dbRealName;
+    private String dbUserName;
+    private String dbPassword;
+
+    public String getDcName() {
+        return dcName;
+    }
+
+    public void setDcName(String dcName) {
+        this.dcName = dcName;
+    }
+
+    public String getDbName() {
+        return dbName;
+    }
+
+    public void setDbName(String dbName) {
+        this.dbName = dbName;
+    }
+
+    public String getDbHost() {
+        return dbHost;
+    }
+
+    public void setDbHost(String dbHost) {
+        this.dbHost = dbHost;
+    }
+
+    public int getDbPort() {
+        return dbPort;
+    }
+
+    public void setDbPort(int dbPort) {
+        this.dbPort = dbPort;
+    }
+
+    public String getDbRealName() {
+        return dbRealName;
+    }
+
+    public void setDbRealName(String dbRealName) {
+        this.dbRealName = dbRealName;
+    }
+
+    public String getDbUserName() {
+        return dbUserName;
+    }
+
+    public void setDbUserName(String dbUserName) {
+        this.dbUserName = dbUserName;
+    }
+
+    public String getDbPassword() {
+        return dbPassword;
+    }
+
+    public void setDbPassword(String dbPassword) {
+        this.dbPassword = dbPassword;
+    }
+
+    @Override
+    public String toString() {
+        return "DataSourceInfoDTO{" +
+                "dcName='" + dcName + '\'' +
+                ", dbName='" + dbName + '\'' +
+                ", dbHost='" + dbHost + '\'' +
+                ", dbPort=" + dbPort +
+                ", dbRealName='" + dbRealName + '\'' +
+                ", dbUserName='" + dbUserName + '\'' +
+                ", dbPassword='" + dbPassword + '\'' +
+                '}';
+    }
+
+    @Override
+    public String qualifier() {
+        return this.dcName + ":" + this.dbName;
+    }
+
+    @Override
+    public String url() {
+        return String.format("jdbc:mysql://%s:%s/%s?characterEncoding=utf-8&useSSL=false",
+                dbHost, dbPort, dbRealName);
+    }
+
+    @Override
+    public String username() {
+        return this.dbUserName;
+    }
+
+    @Override
+    public String password() {
+        return this.dbPassword;
+    }
+}

+ 65 - 0
base-servers/datacenter/datacenter-server/pom.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datacenter</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datacenter-server</artifactId>
+    <description>datacenter server</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>server-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>datacenter-dto</artifactId>
+        </dependency>
+        <!-- db -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+        <!-- sleuth -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-zipkin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-rabbit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+        <!-- test -->
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>test-starter</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 6 - 0
base-servers/datacenter/datacenter-server/src/main/docker/Dockerfile

@@ -0,0 +1,6 @@
+FROM frolvlad/alpine-oraclejdk8:slim
+VOLUME /tmp
+ADD datacenter-server-1.0.0-SNAPSHOT.jar app.jar
+RUN sh -c 'touch /app.jar'
+ENV JAVA_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

+ 20 - 0
base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/DatacenterApplication.java

@@ -0,0 +1,20 @@
+package com.usoftchina.saas.dc;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+@EnableEurekaClient
+@SpringBootApplication
+@MapperScan("com.usoftchina.saas.dc.mapper")
+public class DatacenterApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(DatacenterApplication.class, args);
+    }
+}

+ 28 - 0
base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/controller/DataSourceInfoController.java

@@ -0,0 +1,28 @@
+package com.usoftchina.saas.dc.controller;
+
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.dc.dto.DataSourceInfoDTO;
+import com.usoftchina.saas.dc.service.DataSourceInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+@RestController
+@RequestMapping("/ds")
+public class DataSourceInfoController {
+
+    @Autowired
+    private DataSourceInfoService dataSourceInfoService;
+
+    @GetMapping
+    public Result<DataSourceInfoDTO> getDataSourceInfo(@RequestParam("dcName") String dcName,
+                                                @RequestParam("dbName") String dbName) {
+        return Result.success(dataSourceInfoService.findDataSourceInfo(dcName, dbName));
+    }
+}

+ 21 - 0
base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/mapper/DataSourceInfoMapper.java

@@ -0,0 +1,21 @@
+package com.usoftchina.saas.dc.mapper;
+
+import com.usoftchina.saas.dc.po.DataSourceInfo;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+public interface DataSourceInfoMapper {
+
+    /**
+     * 查找
+     *
+     * @param dcName datacenter name
+     * @param dbName database name
+     * @return
+     */
+    DataSourceInfo selectByDcNameAndDbName(@Param("dcName") String dcName, @Param("dbName") String dbName);
+}

+ 82 - 0
base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/po/DataSourceInfo.java

@@ -0,0 +1,82 @@
+package com.usoftchina.saas.dc.po;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+public class DataSourceInfo implements Serializable{
+    private Integer id;
+    private String dcName;
+    private String dbName;
+    private String dbRealName;
+    private String dbHost;
+    private Integer dbPort;
+    private String dbUserName;
+    private String dbPassword;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getDcName() {
+        return dcName;
+    }
+
+    public void setDcName(String dcName) {
+        this.dcName = dcName;
+    }
+
+    public String getDbName() {
+        return dbName;
+    }
+
+    public void setDbName(String dbName) {
+        this.dbName = dbName;
+    }
+
+    public String getDbRealName() {
+        return dbRealName;
+    }
+
+    public void setDbRealName(String dbRealName) {
+        this.dbRealName = dbRealName;
+    }
+
+    public String getDbHost() {
+        return dbHost;
+    }
+
+    public void setDbHost(String dbHost) {
+        this.dbHost = dbHost;
+    }
+
+    public Integer getDbPort() {
+        return dbPort;
+    }
+
+    public void setDbPort(Integer dbPort) {
+        this.dbPort = dbPort;
+    }
+
+    public String getDbUserName() {
+        return dbUserName;
+    }
+
+    public void setDbUserName(String dbUserName) {
+        this.dbUserName = dbUserName;
+    }
+
+    public String getDbPassword() {
+        return dbPassword;
+    }
+
+    public void setDbPassword(String dbPassword) {
+        this.dbPassword = dbPassword;
+    }
+}

+ 19 - 0
base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/service/DataSourceInfoService.java

@@ -0,0 +1,19 @@
+package com.usoftchina.saas.dc.service;
+
+import com.usoftchina.saas.dc.po.DataSourceInfo;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+public interface DataSourceInfoService {
+
+    /**
+     * 查找
+     *
+     * @param dcName datacenter name
+     * @param dbName database name
+     * @return
+     */
+    DataSourceInfo findDataSourceInfo(String dcName, String dbName);
+}

+ 23 - 0
base-servers/datacenter/datacenter-server/src/main/java/com/usoftchina/saas/dc/service/impl/DataSourceInfoServiceImpl.java

@@ -0,0 +1,23 @@
+package com.usoftchina.saas.dc.service.impl;
+
+import com.usoftchina.saas.dc.mapper.DataSourceInfoMapper;
+import com.usoftchina.saas.dc.po.DataSourceInfo;
+import com.usoftchina.saas.dc.service.DataSourceInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+@Service
+public class DataSourceInfoServiceImpl implements DataSourceInfoService{
+
+    @Autowired
+    private DataSourceInfoMapper dataSourceInfoMapper;
+
+    @Override
+    public DataSourceInfo findDataSourceInfo(String dcName, String dbName) {
+        return dataSourceInfoMapper.selectByDcNameAndDbName(dcName, dbName);
+    }
+}

+ 81 - 0
base-servers/datacenter/datacenter-server/src/main/resources/application.yml

@@ -0,0 +1,81 @@
+spring:
+  profiles:
+    active: dev
+  application:
+    name: datacenter-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  rabbitmq:
+    host: 192.168.0.176
+    port: 5672
+    virtual-host: dev
+    username: saas
+    password: select123***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.0.172:3306/saas_manage?characterEncoding=utf-8&useSSL=false
+    username: root
+    password: select111***
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
+  messages:
+    basename: i18n/messages
+  redis:
+    host: 192.168.0.182
+    port: 6379
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    prefer-ip-address: true
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+server:
+  port: 8720
+  tomcat:
+    uri-encoding: UTF-8
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+    shutdown:
+      enabled: true
+    restart:
+      enabled: true
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+mybatis:
+  type-aliases-package: com.usoftchina.saas.dc.po
+  mapper-locations: classpath:mapper/*.xml

+ 12 - 0
base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker-dev.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-datacenter-server-dev
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-dev:8510/eureka/
+spring:
+  rabbitmq:
+    virtual-host: dev
+server:
+  port: 8730

+ 23 - 0
base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,23 @@
+eureka:
+  instance:
+    hostname: saas-datacenter-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_manage?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 12 - 0
base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-datacenter-server-test
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-test:8515/eureka/
+spring:
+  rabbitmq:
+    virtual-host: test
+server:
+  port: 8735

+ 10 - 0
base-servers/datacenter/datacenter-server/src/main/resources/config/application-docker.yml

@@ -0,0 +1,10 @@
+eureka:
+  instance:
+    hostname: saas-datacenter-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    virtual-host: docker

+ 131 - 0
base-servers/datacenter/datacenter-server/src/main/resources/logback-spring.xml

@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/base.xml" />
+    <jmxConfigurator/>
+
+    <!--
+    %m
+    输出代码中指定的消息
+    %p
+    输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
+    %r
+    输出自应用启动到输出该log信息耗费的毫秒数
+    %c
+    输出所属的类目,通常就是所在类的全名
+    %t
+    输出产生该日志事件的线程名
+    %n
+    输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
+    %d
+    输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},
+    输出类似:2002年10月18日 22:10:28,921
+    %l
+    输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
+    -->
+
+    <springProperty scope="context" name="log.path" source="logging.path" defaultValue="/var/log/saas/datacenter-server"/>
+    <springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="datacenter-server"/>
+    <springProperty scope="context" name="spring.profiles.active" source="spring.profiles.active" defaultValue="dev"/>
+    <springProperty scope="context" name="common-pattern" source="logging.common-pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS}:[%5p] [%t:%r] [%C{1}:%M:%L] --> %m%n"/>
+    <springProperty scope="context" name="log.level.console" source="logging.level.console" defaultValue="INFO"/>
+    <springProperty scope="context" name="log.destination" source="logging.destination" defaultValue="192.168.0.63:5000"/>
+
+    <contextName>${spring.application.name}-${spring.profiles.active}-logback</contextName>
+
+    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>${log.level.console}</level>
+        </filter>
+        <encoder>
+            <pattern>${common-pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="ROOT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/root.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM}/root-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
+            <maxFileSize>128MB</maxFileSize>
+            <maxHistory>7</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${common-pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- Appender to log in a JSON format -->
+    <appender name="JSON_APPENDER" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>${log.destination}</destination>
+        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                <pattern>
+                    <pattern>
+                        {
+                        "severity": "%level",
+                        "service": "${spring.application.name:-}",
+                        "trace": "%X{X-B3-TraceId:-}",
+                        "span": "%X{X-B3-SpanId:-}",
+                        "parent": "%X{X-B3-ParentSpanId:-}",
+                        "exportable": "%X{X-Span-Export:-}",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "rest": "%message"
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>
+
+    <logger name="org.springframework" level="INFO"/>
+    <logger name="com.usoftchina.saas" level="INFO"/>
+
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="ROOT_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-test">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-prod">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+</configuration>

+ 20 - 0
base-servers/datacenter/datacenter-server/src/main/resources/mapper/DataSourceInfoMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.dc.mapper.DataSourceInfoMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.dc.po.DataSourceInfo">
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="dc_name" jdbcType="VARCHAR" property="dcName"/>
+        <result column="db_name" jdbcType="VARCHAR" property="dbName"/>
+        <result column="db_realname" jdbcType="VARCHAR" property="dbRealName"/>
+        <result column="db_host" jdbcType="VARCHAR" property="dbHost"/>
+        <result column="db_port" jdbcType="INTEGER" property="dbPort"/>
+        <result column="db_username" jdbcType="VARCHAR" property="dbUserName"/>
+        <result column="db_password" jdbcType="VARCHAR" property="dbPassword"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,dc_name,db_name,db_realname,db_host,db_port,db_username,db_password
+    </sql>
+    <select id="selectByDcNameAndDbName" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from datasource where dc_name=#{dcName} and db_name=#{dbName}
+    </select>
+</mapper>

+ 22 - 0
base-servers/datacenter/pom.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>base-servers</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datacenter</artifactId>
+    <packaging>pom</packaging>
+    <description>datacenter</description>
+    <modules>
+        <module>datacenter-api</module>
+        <module>datacenter-server</module>
+        <module>datacenter-dto</module>
+        <module>datacenter-client</module>
+    </modules>
+
+</project>

+ 1 - 0
base-servers/pom.xml

@@ -23,6 +23,7 @@
         <module>account</module>
         <module>ui-server</module>
         <module>socket</module>
+        <module>datacenter</module>
     </modules>
 
 </project>

+ 1 - 1
base-servers/ui-server/src/main/resources/application.yml

@@ -44,7 +44,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
 management:
   endpoints:
     web:

+ 16 - 0
framework/core/src/main/java/com/usoftchina/saas/jdbc/Connectable.java

@@ -0,0 +1,16 @@
+package com.usoftchina.saas.jdbc;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ */
+public interface Connectable {
+
+    String qualifier();
+
+    String url();
+
+    String username();
+
+    String password();
+
+}

+ 143 - 0
framework/core/src/main/java/com/usoftchina/saas/jdbc/DynamicDataSource.java

@@ -0,0 +1,143 @@
+package com.usoftchina.saas.jdbc;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.jdbc.datasource.AbstractDataSource;
+import org.springframework.jdbc.datasource.lookup.DataSourceLookup;
+import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;
+import org.springframework.util.Assert;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ * 基于{@AbstractRoutingDataSource},解决不能动态添加新数据源的问题
+ */
+public class DynamicDataSource extends AbstractDataSource implements InitializingBean {
+
+    private Map<Object, Object> targetDataSources;
+    private Object defaultTargetDataSource;
+    private boolean lenientFallback = true;
+    private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
+    private Map<Object, DataSource> resolvedDataSources;
+    private DataSource resolvedDefaultDataSource;
+
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        this.targetDataSources = targetDataSources;
+    }
+
+    public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
+        this.defaultTargetDataSource = defaultTargetDataSource;
+    }
+
+    public void setLenientFallback(boolean lenientFallback) {
+        this.lenientFallback = lenientFallback;
+    }
+
+    public void setDataSourceLookup(DataSourceLookup dataSourceLookup) {
+        this.dataSourceLookup = (DataSourceLookup)(dataSourceLookup != null?dataSourceLookup:new JndiDataSourceLookup());
+    }
+
+    @Override
+    public void afterPropertiesSet() {
+        if(this.targetDataSources == null) {
+            throw new IllegalArgumentException("Property \'targetDataSources\' is required");
+        } else {
+            this.resolvedDataSources = new HashMap(this.targetDataSources.size());
+            Iterator var1 = this.targetDataSources.entrySet().iterator();
+
+            while(var1.hasNext()) {
+                Map.Entry entry = (Map.Entry)var1.next();
+                Object lookupKey = this.resolveSpecifiedLookupKey(entry.getKey());
+                DataSource dataSource = this.resolveSpecifiedDataSource(entry.getValue());
+                this.resolvedDataSources.put(lookupKey, dataSource);
+            }
+
+            if(this.defaultTargetDataSource != null) {
+                this.resolvedDefaultDataSource = this.resolveSpecifiedDataSource(this.defaultTargetDataSource);
+            }
+
+        }
+    }
+
+    protected Object resolveSpecifiedLookupKey(Object lookupKey) {
+        return lookupKey;
+    }
+
+    protected DataSource resolveSpecifiedDataSource(Object dataSource) throws IllegalArgumentException {
+        if(dataSource instanceof DataSource) {
+            return (DataSource)dataSource;
+        } else if(dataSource instanceof String) {
+            return this.dataSourceLookup.getDataSource((String)dataSource);
+        } else {
+            throw new IllegalArgumentException("Illegal data source value - only [javax.sql.DataSource] and String supported: " + dataSource);
+        }
+    }
+
+    @Override
+    public Connection getConnection() throws SQLException {
+        return this.determineTargetDataSource().getConnection();
+    }
+
+    @Override
+    public Connection getConnection(String username, String password) throws SQLException {
+        return this.determineTargetDataSource().getConnection(username, password);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T unwrap(Class<T> iface) throws SQLException {
+        if (iface.isInstance(this)) {
+            return (T) this;
+        }
+        return determineTargetDataSource().unwrap(iface);
+    }
+
+    @Override
+    public boolean isWrapperFor(Class<?> iface) throws SQLException {
+        return (iface.isInstance(this) || determineTargetDataSource().isWrapperFor(iface));
+    }
+
+    protected DataSource determineTargetDataSource() {
+        Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
+        Object lookupKey = this.determineCurrentLookupKey();
+        DataSource dataSource = (DataSource)this.resolvedDataSources.get(lookupKey);
+        if(dataSource == null && (this.lenientFallback || lookupKey == null)) {
+            dataSource = this.resolvedDefaultDataSource;
+        }
+
+        if(dataSource == null) {
+            throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
+        } else {
+            return dataSource;
+        }
+    }
+
+    protected Object determineCurrentLookupKey() {
+        return DynamicDataSourceContextHolder.get();
+    }
+
+    public boolean containsDataSource(Object key) {
+        Object lookupKey = this.resolveSpecifiedLookupKey(key);
+        return this.resolvedDataSources.containsKey(lookupKey);
+    }
+
+    public void addDataSource(Object key, Object value) {
+        Object lookupKey = this.resolveSpecifiedLookupKey(key);
+        if (!containsDataSource(lookupKey)) {
+            DataSource dataSource = this.resolveSpecifiedDataSource(value);
+            this.resolvedDataSources.put(lookupKey, dataSource);
+        }
+    }
+
+    public void removeDataSource(Object key) {
+        Object lookupKey = this.resolveSpecifiedLookupKey(key);
+        if (!containsDataSource(lookupKey)) {
+            this.resolvedDataSources.remove(key);
+        }
+    }
+}

+ 25 - 0
framework/core/src/main/java/com/usoftchina/saas/jdbc/DynamicDataSourceContextHolder.java

@@ -0,0 +1,25 @@
+package com.usoftchina.saas.jdbc;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ */
+public class DynamicDataSourceContextHolder {
+
+    private static final ThreadLocal<String> contextHolder = new InheritableThreadLocal<>();
+
+    public static void set(String dataSource) {
+        contextHolder.set(dataSource);
+    }
+
+    public static void set(Connectable connectable) {
+        contextHolder.set(connectable.qualifier());
+    }
+
+    public static String get() {
+        return contextHolder.get();
+    }
+
+    public static void clear() {
+        contextHolder.remove();
+    }
+}

+ 42 - 0
framework/core/src/main/java/com/usoftchina/saas/jdbc/DynamicDataSourceRegister.java

@@ -0,0 +1,42 @@
+package com.usoftchina.saas.jdbc;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+
+/**
+ * Created by Pro1 on 2017/7/27.
+ */
+public class DynamicDataSourceRegister {
+
+    private DataSourceProperties defaultProperties;
+    private final String defaultDatabaseName;
+    private DynamicDataSource dynamicDataSource;
+
+    public DynamicDataSourceRegister(DataSourceProperties defaultProperties, DynamicDataSource dynamicDataSource) {
+        this.defaultProperties = defaultProperties;
+        this.defaultDatabaseName = JdbcUrl.getDatabaseName(defaultProperties.determineUrl());
+        this.dynamicDataSource = dynamicDataSource;
+    }
+
+    public void createDataSource(Connectable connectable) {
+        if (!dynamicDataSource.containsDataSource(connectable.qualifier())) {
+            HikariDataSource dataSource = DataSourceBuilder.create(defaultProperties.getClassLoader())
+                    .type(HikariDataSource.class)
+                    .driverClassName(defaultProperties.determineDriverClassName())
+                    .url(connectable.url())
+                    .username(connectable.username())
+                    .password(connectable.password())
+                    .build();
+            dynamicDataSource.addDataSource(connectable.qualifier(), dataSource);
+        }
+    }
+
+    public void unregister(Connectable connectable) {
+        dynamicDataSource.removeDataSource(connectable.qualifier());
+    }
+
+    public String getDefaultDatabaseName() {
+        return defaultDatabaseName;
+    }
+}

+ 60 - 0
framework/core/src/main/java/com/usoftchina/saas/jdbc/JdbcUrl.java

@@ -0,0 +1,60 @@
+package com.usoftchina.saas.jdbc;
+
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+public class JdbcUrl {
+
+    public static String getDatabaseName(String url) {
+        Type type = Type.fromJdbcUrl(url);
+        Pattern pattern = type.getNamePattern();
+        if (null != pattern) {
+            Matcher matcher = pattern.matcher(url);
+            if (matcher.find()) {
+                return matcher.group(1);
+            }
+        }
+        return null;
+    }
+
+    public enum Type {
+        MYSQL(".+\\/([^\\/]+)\\?.+"),
+        POSTGRESQL(null),
+        ORACLE(null),
+        UNKNOWN(null);
+
+        private Pattern namePattern;
+
+        Type(String nameRegexp) {
+            if (null != nameRegexp) {
+                this.namePattern = Pattern.compile(nameRegexp);
+            }
+        }
+
+        protected String getUrlPrefix() {
+            return this.name().toLowerCase(Locale.ENGLISH);
+        }
+
+        public static Type fromJdbcUrl(String url) {
+            if (null != url) {
+                String urlWithoutPrefix = url.substring("jdbc".length()).toLowerCase(Locale.ENGLISH);
+                for (Type type : Type.values()) {
+                    String prefix = ":" + type.getUrlPrefix() + ":";
+                    if (type != Type.UNKNOWN && urlWithoutPrefix.startsWith(prefix)) {
+                        return type;
+                    }
+                }
+            }
+            return Type.UNKNOWN;
+        }
+
+        public Pattern getNamePattern() {
+            return namePattern;
+        }
+    }
+}

+ 5 - 0
framework/server-starter/pom.xml

@@ -33,6 +33,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>

+ 4 - 1
framework/server-starter/src/main/java/com/usoftchina/saas/server/ServerAutoConfiguration.java

@@ -21,7 +21,10 @@ import org.springframework.context.annotation.Configuration;
  * @date 2018/10/13
  */
 @Configuration
-@ComponentScan(basePackages = {"com.usoftchina.saas.server"})
+@ComponentScan(basePackages = {
+        "com.usoftchina.saas.server.error",
+        "com.usoftchina.saas.server.web"
+})
 public class ServerAutoConfiguration {
 
 //    private Logger logger = LoggerFactory.getLogger(UnCaughtErrorFilter.class);

+ 1 - 1
framework/server-starter/src/main/java/com/usoftchina/saas/server/error/ErrorConfig.java → framework/server-starter/src/main/java/com/usoftchina/saas/server/error/DefaultErrorConfig.java

@@ -12,7 +12,7 @@ import javax.servlet.DispatcherType;
  * @date 2018/10/16
  */
 @Configuration
-public class ErrorConfig {
+public class DefaultErrorConfig {
 
     @Bean
     public FilterRegistrationBean<UnCaughtErrorFilter> unCaughtErrorFilter() {

+ 140 - 0
framework/server-starter/src/main/java/com/usoftchina/saas/server/jdbc/DynamicDataSourceConfig.java

@@ -0,0 +1,140 @@
+package com.usoftchina.saas.server.jdbc;
+
+import com.usoftchina.saas.jdbc.DynamicDataSource;
+import com.usoftchina.saas.jdbc.DynamicDataSourceRegister;
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.ibatis.mapping.DatabaseIdProvider;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
+import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
+import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yingp
+ * @date 2018/12/10
+ */
+@Configuration
+@ConditionalOnClass({HikariDataSource.class})
+@ConditionalOnMissingBean({DataSource.class})
+@EnableConfigurationProperties({
+        DataSourceProperties.class,
+        MybatisProperties.class
+})
+public class DynamicDataSourceConfig {
+
+    @Autowired
+    private DataSourceProperties properties;
+
+    @Autowired
+    private MybatisProperties mybatisProperties;
+
+    @Primary
+    @Bean(name = "defaultDataSource")
+    public HikariDataSource defaultDataSource() {
+        HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
+        if (StringUtils.hasText(properties.getName())) {
+            dataSource.setPoolName(properties.getName());
+        }
+
+        return dataSource;
+    }
+
+    @Bean(name = "dynamicDataSource")
+    public DynamicDataSource dynamicDataSource(@Qualifier("defaultDataSource") DataSource defaultDataSource) {
+        Map<Object, Object> targetDataSources = new HashMap<>(1);
+        targetDataSources.put("defaultDataSource", defaultDataSource);
+        DynamicDataSource dataSource = new DynamicDataSource();
+        dataSource.setDefaultTargetDataSource(defaultDataSource);
+        dataSource.setTargetDataSources(targetDataSources);
+        return dataSource;
+    }
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dataSource,
+                                               ObjectProvider<Interceptor[]> interceptorsProvider,
+                                               ResourceLoader resourceLoader,
+                                               ObjectProvider<DatabaseIdProvider> databaseIdProvider,
+                                               ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) throws Exception {
+        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
+        factory.setDataSource(dataSource);
+        factory.setVfs(SpringBootVFS.class);
+        if (StringUtils.hasText(mybatisProperties.getConfigLocation())) {
+            factory.setConfigLocation(resourceLoader.getResource(mybatisProperties.getConfigLocation()));
+        }
+        org.apache.ibatis.session.Configuration configuration = mybatisProperties.getConfiguration();
+        if (configuration == null && !StringUtils.hasText(mybatisProperties.getConfigLocation())) {
+            configuration = new org.apache.ibatis.session.Configuration();
+        }
+        List<ConfigurationCustomizer> configurationCustomizers = configurationCustomizersProvider.getIfAvailable();
+        if (configuration != null && !CollectionUtils.isEmpty(configurationCustomizers)) {
+            for (ConfigurationCustomizer customizer : configurationCustomizers) {
+                customizer.customize(configuration);
+            }
+        }
+        factory.setConfiguration(configuration);
+        if (mybatisProperties.getConfigurationProperties() != null) {
+            factory.setConfigurationProperties(mybatisProperties.getConfigurationProperties());
+        }
+        if (!ObjectUtils.isEmpty(interceptorsProvider)) {
+            factory.setPlugins(interceptorsProvider.getIfAvailable());
+        }
+        if (databaseIdProvider != null) {
+            factory.setDatabaseIdProvider(databaseIdProvider.getIfAvailable());
+        }
+        if (StringUtils.hasLength(mybatisProperties.getTypeAliasesPackage())) {
+            factory.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());
+        }
+        if (StringUtils.hasLength(mybatisProperties.getTypeHandlersPackage())) {
+            factory.setTypeHandlersPackage(mybatisProperties.getTypeHandlersPackage());
+        }
+        if (!ObjectUtils.isEmpty(mybatisProperties.resolveMapperLocations())) {
+            factory.setMapperLocations(mybatisProperties.resolveMapperLocations());
+        }
+
+        return factory.getObject();
+    }
+
+    @Bean
+    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
+        ExecutorType executorType = mybatisProperties.getExecutorType();
+        if (executorType != null) {
+            return new SqlSessionTemplate(sqlSessionFactory, executorType);
+        } else {
+            return new SqlSessionTemplate(sqlSessionFactory);
+        }
+    }
+
+    @Bean
+    public DataSourceTransactionManager transactionManager(@Qualifier("dynamicDataSource") DynamicDataSource dataSource) throws Exception {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+    @Bean
+    public DynamicDataSourceRegister dataSourceRegister(@Qualifier("dynamicDataSource") DynamicDataSource dataSource) {
+        return new DynamicDataSourceRegister(properties, dataSource);
+    }
+}

+ 17 - 0
framework/server-starter/src/main/java/com/usoftchina/saas/server/jdbc/EnableDynamicDataSource.java

@@ -0,0 +1,17 @@
+package com.usoftchina.saas.server.jdbc;
+
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+/**
+ * @author yingp
+ * @date 2018/12/11
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Import(DynamicDataSourceConfig.class)
+@Documented
+@Inherited
+public @interface EnableDynamicDataSource {
+}

+ 29 - 2
frontend/saas-web/app/view/document/product/FormPanel.js

@@ -219,7 +219,8 @@ Ext.define('saas.view.document.product.FormPanel', {
         allowEmpty:true,
         // hidden: true,
         deleteDetailUrl:'/api/document/product/deleteDetail',
-        columns : [{
+        columns : [
+        {
             text : "ID", 
             dataIndex : "id", 
             hidden : true,  
@@ -289,10 +290,11 @@ Ext.define('saas.view.document.product.FormPanel', {
             // xtype: 'numbercolumn',
             align: 'end',
             width : 110.0,
-            allowBlank : false,
+            allowBlank : true,
             editor : {
                 xtype : "numberfield",
                 decimalPrecision: 8,
+                allowDecimals: true,
                 minValue:0
             },
             listeners:{
@@ -370,5 +372,30 @@ Ext.define('saas.view.document.product.FormPanel', {
             viewModel.notify();
             form.getForm().findField('qcsz').resetOriginalValue();
         }
+    },
+    beforeSave:function(){
+        var me = this,
+        controller = me.getController(),
+        viewModel = me.getViewModel(),
+        store = viewModel.get('detail0').detailStore,
+        items  = store.getData().items,
+        controller = me.getController(),
+        str='';
+        Ext.Array.each(items, function(item, i) {
+            if(!item.get('pd_price')&&item.get('pd_whcode')){     
+                str=str+item.get('pd_detno')+','
+            }             
+         });
+        if(str!=''){
+            saas.util.BaseUtil.showConfirm('提示','行: '+str+'物料单位成本为0,是否继续保存?')
+            .then(function(y) {
+                if(y == 'yes') {
+                    controller.save();
+                }
+            });
+        }else{
+            controller.save();
+        }
+        return false;
     }
 });

+ 2 - 2
frontend/saas-web/app/view/money/fundtransfer/QueryPanel.js

@@ -51,7 +51,7 @@ Ext.define('saas.view.money.fundtransfer.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
         emptyText:'请输入人员编号或名称',
@@ -63,7 +63,7 @@ Ext.define('saas.view.money.fundtransfer.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'ft_auditman',
         fieldLabel: '审核人',
         emptyText:'请输入人员编号或名称'

+ 4 - 8
frontend/saas-web/app/view/money/fundtransfer/QueryPanelController.js

@@ -33,24 +33,20 @@ Ext.define('saas.view.money.fundtransfer.QueryPanelController', {
                     }) ;
 
                 }
-            },'employeeDbfindTrigger[name=creatorName]':{
+            },'accountDbfindTrigger[name=creatorName]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'creatorName'
+                            from:'realname',to:'creatorName'
                         }],
                     }) ;   
 
                 }
-            },'employeeDbfindTrigger[name=ft_auditman]':{
+            },'accountDbfindTrigger[name=ft_auditman]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'ft_auditman',
+                            from:'realname',to:'ft_auditman',
                         }],
                     }) ;   
 

+ 2 - 2
frontend/saas-web/app/view/money/othreceipts/QueryPanel.js

@@ -69,7 +69,7 @@ Ext.define('saas.view.money.othreceipts.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
         emptyText:'请输入人员编号或名称',
@@ -81,7 +81,7 @@ Ext.define('saas.view.money.othreceipts.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'or_auditman',
         fieldLabel: '审核人',
         emptyText:'请输入人员编号或名称'

+ 4 - 8
frontend/saas-web/app/view/money/othreceipts/QueryPanelController.js

@@ -25,24 +25,20 @@ Ext.define('saas.view.money.othreceipts.QueryPanelController', {
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=creatorName]':{
+            },'accountDbfindTrigger[name=creatorName]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'creatorName'
+                            from:'realname',to:'creatorName'
                         }],
                     }) ;   
 
                 }
-            },'employeeDbfindTrigger[name=or_auditman]':{
+            },'accountDbfindTrigger[name=or_auditman]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'or_auditman',
+                            from:'realname',to:'or_auditman',
                         }],
                     }) ;   
 

+ 2 - 2
frontend/saas-web/app/view/money/othspendings/QueryPanel.js

@@ -66,7 +66,7 @@ Ext.define('saas.view.money.othspendings.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
         emptyText:'请输入人员编号或名称',
@@ -78,7 +78,7 @@ Ext.define('saas.view.money.othspendings.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'os_auditman',
         fieldLabel: '审核人',
         emptyText:'请输入人员编号或名称'

+ 4 - 8
frontend/saas-web/app/view/money/othspendings/QueryPanelController.js

@@ -25,24 +25,20 @@ Ext.define('saas.view.money.othspendings.QueryPanelController', {
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=creatorName]':{
+            },'accountDbfindTrigger[name=creatorName]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'creatorName'
+                            from:'realname',to:'creatorName'
                         }],
                     }) ;   
 
                 }
-            },'employeeDbfindTrigger[name=os_auditman]':{
+            },'accountDbfindTrigger[name=os_auditman]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'os_auditman',
+                            from:'realname',to:'os_auditman',
                         }],
                     }) ;   
 

+ 18 - 2
frontend/saas-web/app/view/money/payBalance/QueryPanel.js

@@ -41,7 +41,7 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
         fieldLabel: '业务类型',
         showDetail: true
     }*/, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
         emptyText:'请输入人员编号或名称',
@@ -53,7 +53,7 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'pb_auditman',
         fieldLabel: '审核人',
         emptyText:'请输入人员编号或名称'
@@ -96,6 +96,14 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
                 text: '付款人',
                 dataIndex: 'pb_manname',
                 width: 110
+            }, {
+                text: '录入人',
+                dataIndex: 'creatorName',
+                width: 110
+            }, {
+                text: '审核人',
+                dataIndex: 'pb_auditman',
+                width: 110
             }, {
                 text: '备注',
                 dataIndex: 'pb_remark',
@@ -129,6 +137,14 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
             text: '付款人',
             dataIndex: 'pb_manname',
             width: 110
+        }, {
+            text: '录入人',
+            dataIndex: 'creatorName',
+            width: 110
+        }, {
+            text: '审核人',
+            dataIndex: 'pb_auditman',
+            width: 110
         },{
             text: '资金账户',
             dataIndex: 'pd_bankname',

+ 4 - 8
frontend/saas-web/app/view/money/payBalance/QueryPanelController.js

@@ -15,23 +15,19 @@ Ext.define('saas.view.money.paybalance.QueryPanelController', {
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=creatorName]':{
+            },'accountDbfindTrigger[name=creatorName]':{
                 beforerender: function (f) {
                     Ext.apply(f, {
                         dbfinds: [{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from: 'em_name', to: 'creatorName'
+                            from: 'realname', to: 'creatorName'
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=pb_auditman]':{
+            },'accountDbfindTrigger[name=pb_auditman]':{
                 beforerender: function (f) {
                     Ext.apply(f, {
                         dbfinds: [{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from: 'em_name', to: 'pb_auditman'
+                            from: 'realname', to: 'pb_auditman'
                         }],
                     });
                 }

+ 18 - 2
frontend/saas-web/app/view/money/recBalance/QueryPanel.js

@@ -33,7 +33,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
         fieldLabel: '业务类型',
         showDetail: true
     } */, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
         emptyText:'请输入人员编号或名称',
@@ -45,7 +45,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'rb_auditman',
         fieldLabel: '审核人',
         emptyText:'请输入人员编号或名称'
@@ -87,6 +87,14 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             text: '收款人',
             dataIndex: 'rb_manname',
             width: 110
+        }, {
+            text: '录入人',
+            dataIndex: 'creatorName',
+            width: 110
+        }, {
+            text: '审核人',
+            dataIndex: 'rb_auditman',
+            width: 110
         }, {
             text: '备注',
             dataIndex: 'rb_remark',
@@ -120,6 +128,14 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             text: '收款人',
             dataIndex: 'rb_manname',
             width: 100
+        }, {
+            text: '录入人',
+            dataIndex: 'creatorName',
+            width: 110
+        }, {
+            text: '审核人',
+            dataIndex: 'rb_auditman',
+            width: 110
         },{
             text: '资金账户',
             dataIndex: 'rd_bankname',

+ 4 - 6
frontend/saas-web/app/view/money/recBalance/QueryPanelController.js

@@ -15,21 +15,19 @@ Ext.define('saas.view.money.recBalance.QueryPanelController', {
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=creatorName]':{
+            },'accountDbfindTrigger[name=creatorName]':{
                 beforerender: function (f) {
                     Ext.apply(f, {
                         dbfinds: [{
-                            from: 'em_name',
-                            to: 'creatorName'
+                            from: 'realname', to: 'creatorName'
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=rb_auditman]':{
+            },'accountDbfindTrigger[name=rb_auditman]':{
                 beforerender: function (f) {
                     Ext.apply(f, {
                         dbfinds: [{
-                            from: 'em_name',
-                            to: 'rb_auditman'
+                            from: 'realname', to: 'rb_auditman'
                         }],
                     });
                 }

+ 2 - 2
frontend/saas-web/app/view/money/verification/QueryPanel.js

@@ -52,7 +52,7 @@ Ext.define('saas.view.money.verification.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
         emptyText:'请输入人员编号或名称',
@@ -64,7 +64,7 @@ Ext.define('saas.view.money.verification.QueryPanel', {
             }
         }
     }, {
-        xtype: 'employeeDbfindTrigger',
+        xtype: 'accountDbfindTrigger',
         name: 'vc_auditman',
         fieldLabel: '审核人',
         emptyText:'请输入人员编号或名称'

+ 4 - 8
frontend/saas-web/app/view/money/verification/QueryPanelController.js

@@ -26,24 +26,20 @@ Ext.define('saas.view.money.verification.QueryPanelController', {
                         }],
                     });
                 }
-            },'employeeDbfindTrigger[name=creatorName]':{
+            },'accountDbfindTrigger[name=creatorName]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'creatorName'
+                            from:'realname',to:'creatorName'
                         }],
                     }) ;   
 
                 }
-            },'employeeDbfindTrigger[name=vc_auditman]':{
+            },'accountDbfindTrigger[name=vc_auditman]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[{
-                            from:'em_code',to:'em_code'
-                        },{
-                            from:'em_name',to:'vc_auditman',
+                            from:'realname',to:'vc_auditman',
                         }],
                     }) ;   
 

Some files were not shown because too many files changed in this diff