Browse Source

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

chenw 7 years ago
parent
commit
443f2529a6
54 changed files with 853 additions and 146 deletions
  1. 12 0
      applications/commons/commons-server/src/main/resources/config/application-docker-test.yml
  2. 9 0
      applications/commons/commons-server/src/main/resources/logback-spring.xml
  3. 3 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/EmployeeServiceImpl.java
  4. 12 0
      applications/document/document-server/src/main/resources/config/application-docker-test.yml
  5. 9 0
      applications/document/document-server/src/main/resources/logback-spring.xml
  6. 12 0
      applications/money/money-server/src/main/resources/config/application-docker-test.yml
  7. 9 0
      applications/money/money-server/src/main/resources/logback-spring.xml
  8. 12 0
      applications/purchase/purchase-server/src/main/resources/config/application-docker-test.yml
  9. 9 0
      applications/purchase/purchase-server/src/main/resources/logback-spring.xml
  10. 12 0
      applications/sale/sale-server/src/main/resources/config/application-docker-test.yml
  11. 9 0
      applications/sale/sale-server/src/main/resources/logback-spring.xml
  12. 2 0
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/MakeServiceImpl.java
  13. 12 0
      applications/storage/storage-server/src/main/resources/config/application-docker-test.yml
  14. 9 0
      applications/storage/storage-server/src/main/resources/logback-spring.xml
  15. 12 0
      base-servers/account/account-server/src/main/resources/config/application-docker-test.yml
  16. 9 0
      base-servers/account/account-server/src/main/resources/logback-spring.xml
  17. 5 3
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/api/AccountCacheTest.java
  18. 12 0
      base-servers/admin-server/src/main/resources/config/application-docker-test.yml
  19. 9 0
      base-servers/admin-server/src/main/resources/logback-spring.xml
  20. 12 0
      base-servers/auth/auth-server/src/main/resources/config/application-docker-test.yml
  21. 9 0
      base-servers/auth/auth-server/src/main/resources/logback-spring.xml
  22. 20 0
      base-servers/auth/auth-server/src/test/java/com/usoftchina/saas/auth/controller/JwtTest.java
  23. 5 0
      base-servers/eureka-server/src/main/resources/config/application-docker-test.yml
  24. 9 0
      base-servers/eureka-server/src/main/resources/logback-spring.xml
  25. 12 0
      base-servers/file/file-server/src/main/resources/config/application-docker-test.yml
  26. 9 0
      base-servers/file/file-server/src/main/resources/logback-spring.xml
  27. 12 0
      base-servers/gateway-server/src/main/resources/config/application-docker-test.yml
  28. 9 0
      base-servers/gateway-server/src/main/resources/logback-spring.xml
  29. 12 0
      base-servers/mail/mail-server/src/main/resources/config/application-docker-test.yml
  30. 9 0
      base-servers/mail/mail-server/src/main/resources/logback-spring.xml
  31. 12 0
      base-servers/socket/socket-server/src/main/resources/config/application-docker-test.yml
  32. 9 0
      base-servers/socket/socket-server/src/main/resources/logback-spring.xml
  33. 12 0
      base-servers/ui-server/src/main/resources/config/application-docker-test.yml
  34. 9 0
      base-servers/ui-server/src/main/resources/logback-spring.xml
  35. 56 0
      base-servers/ui-server/src/test/java/com/usoftchina/saas/ui/controller/co/CoViewControllerTest.java
  36. 13 0
      base-servers/zipkin-server/src/main/resources/config/application-docker-test.yml
  37. 9 0
      base-servers/zipkin-server/src/main/resources/logback-spring.xml
  38. 10 4
      frontend/saas-portal-web/src/components/conenter/company.vue
  39. 1 7
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  40. 6 1
      frontend/saas-portal-web/src/components/conenter/home.vue
  41. 2 2
      frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue
  42. 0 1
      frontend/saas-portal-web/src/components/footer/footer.vue
  43. 1 1
      frontend/saas-portal-web/src/store/index.js
  44. 8 7
      frontend/saas-portal-web/static/js/mains.js
  45. 10 61
      frontend/saas-web/app/view/core/form/field/DetailGridField.js
  46. 15 46
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  47. 0 8
      frontend/saas-web/app/view/core/query/QueryPanel.js
  48. 9 1
      frontend/saas-web/app/view/core/report/ReportPanel.js
  49. 132 0
      frontend/saas-web/app/view/document/kind/KindModel.js
  50. 2 0
      frontend/saas-web/app/view/home/charts/MonthSale.scss
  51. 1 1
      frontend/saas-web/app/view/stock/report/ProdinoutCount.js
  52. 2 2
      frontend/saas-web/app/view/stock/report/ProdinoutCountController.js
  53. 190 0
      frontend/saas-web/ext/packages/ux/src/plugin/MenuClipboard.js
  54. 48 0
      pom.xml

+ 12 - 0
applications/commons/commons-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-commons-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: 8915

+ 9 - 0
applications/commons/commons-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

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

@@ -68,17 +68,19 @@ public class EmployeeServiceImpl extends CommonBaseServiceImpl<EmployeeMapper, E
         Long companyId = BaseContextHolder.getCompanyId();
         employee.setCompanyId(companyId);
         if(employee.getId() == 0){
-            String code = pushMaxnubmer(employee.getEm_code(), employee.getId());
+            String code = employee.getEm_code();
             //检查名称和编号
             int count = getMapper().validateNameAndCodeWhenInsert(code,employee.getEm_name(),companyId);
             if (count>0) {
                 throw new BizException(BizExceptionCode.REPEAT_EMNAMECODE);
             }
+            code = pushMaxnubmer(employee.getEm_code(), employee.getId());
             //检查电话号码
             count = getMapper().validatePhoneWhenInsert(employee.getEm_mobile(),BaseContextHolder.getCompanyId());
             if (count>0) {
                 throw new BizException(BizExceptionCode.REPEAT_TEL);
             }
+            employee.setEm_code(code);
             employee.setCreatorId(BaseContextHolder.getUserId());
             employee.setCreateTime(new Date());
             employee.setCreatorName(BaseContextHolder.getUserName());

+ 12 - 0
applications/document/document-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-document-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: 9495

+ 9 - 0
applications/document/document-server/src/main/resources/logback-spring.xml

@@ -104,6 +104,15 @@
         </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"/>

+ 12 - 0
applications/money/money-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-money-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: 8895

+ 9 - 0
applications/money/money-server/src/main/resources/logback-spring.xml

@@ -104,6 +104,15 @@
         </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"/>

+ 12 - 0
applications/purchase/purchase-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-purchase-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: 8815

+ 9 - 0
applications/purchase/purchase-server/src/main/resources/logback-spring.xml

@@ -104,6 +104,15 @@
         </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"/>

+ 12 - 0
applications/sale/sale-server/src/main/resources/config/application-docker-test.yml

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

+ 9 - 0
applications/sale/sale-server/src/main/resources/logback-spring.xml

@@ -104,6 +104,15 @@
         </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"/>

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

@@ -618,6 +618,8 @@ public class MakeServiceImpl extends CommonBaseServiceImpl<MakeMapper, Make> imp
         updateMake.setId(make.getId());
         updateMake.setMa_status(Status.UNAUDITED.getDisplay());
         updateMake.setMa_statuscode(Status.UNAUDITED.name());
+        commonService.commonResAudit("make", "ma_id=" + id, "ma_status",
+                "ma_statuscode", "ma_auditdate", "ma_auditman");
         updateMake.setUpdateTime(new Date());
         updateMake.setUpdaterId(BaseContextHolder.getUserId());
         getMapper().updateByPrimaryKeySelective(updateMake);

+ 12 - 0
applications/storage/storage-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-storage-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: 9015

+ 9 - 0
applications/storage/storage-server/src/main/resources/logback-spring.xml

@@ -104,6 +104,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-account-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: 8595

+ 9 - 0
base-servers/account/account-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

+ 5 - 3
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/api/AccountCacheTest.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.account.api;
 
 import com.usoftchina.saas.account.cache.AccountCache;
+import com.usoftchina.saas.account.cache.ResourceCache;
 import com.usoftchina.saas.context.BaseContextHolder;
 import org.junit.Assert;
 import org.junit.Test;
@@ -18,8 +19,9 @@ public class AccountCacheTest {
 
     @Test
     public void hdel() {
-//        AccountCache.of(43).hdel();
-        BaseContextHolder.setToken("eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzdWx5IiwiYXBwSWQiOiJ0cmFkZS1hcHAiLCJ1c2VySWQiOjQzLCJjb21wYW55SWQiOjEsInVzZXJOYW1lIjoic3VseSIsInJlYWxOYW1lIjoi6IuP54G16LCjIiwiZXhwIjoxNTQzNDg5NjM0fQ.oqOIqO97zAH2W1RZsofmCstKHNYsQlnMr_UkOw69zw175fhAefysux2njV1FEbldTQA62RiQ7JrnntWPqOmsNmrBsD0cwvy9xkUma3CNjIuZirbg09CYjUVIFnDpwz-WpmZMQFDIBVQYchCDRzDUgPYPB4phptCGNpTG6VpztPo");
-        System.out.println(AccountCache.of(43).getAccount());
+        ResourceCache.of("trade-app").hdel();
+        AccountCache.of(55).hdel();
+//        BaseContextHolder.setToken("eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxMzc5ODQ5MDU2NSIsImFwcElkIjoidHJhZGUtYXBwIiwidXNlcklkIjo2MSwiY29tcGFueUlkIjoyMSwidXNlck5hbWUiOiIxMzc5ODQ5MDU2NSIsInJlYWxOYW1lIjoi5bqU6bmPIiwiZXhwIjoxNTQzODIxMjkxfQ.DF5RT-g1Fi1czCb1-0EqI_Q9VTrwKskdzQtrpsdlcw-WyuN2xx2nqQqahLQIu836apeD3kptXxEtS2j3ArJKRzqrw4z6SFo-kFOl5cQpFLJxpVyrLl6i8ON33VO05uDRORWieNiWqSTDHFqqfOE5PaoocnCugOvweZaev7BmedQ");
+//        System.out.println(AccountCache.of(55).getAccount());
     }
 }

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-admin-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: 8535

+ 9 - 0
base-servers/admin-server/src/main/resources/logback-spring.xml

@@ -103,6 +103,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-auth-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: 8615

+ 9 - 0
base-servers/auth/auth-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

+ 20 - 0
base-servers/auth/auth-server/src/test/java/com/usoftchina/saas/auth/controller/JwtTest.java

@@ -0,0 +1,20 @@
+package com.usoftchina.saas.auth.controller;
+
+import com.usoftchina.saas.auth.common.jwt.JwtHelper;
+import com.usoftchina.saas.auth.common.jwt.JwtInfo;
+import com.usoftchina.saas.auth.common.jwt.JwtToken;
+import org.junit.Test;
+
+/**
+ * @author yingp
+ * @date 2018/12/3
+ */
+public class JwtTest {
+
+    @Test
+    public void generateToken() {
+        JwtInfo info = new JwtInfo("trade-app", 1L, 55L, "13907997999", "hey");
+        JwtToken jwtToken = JwtHelper.generateToken(info, "auth/pri.key", 18000);
+        System.out.println(jwtToken.getToken());
+    }
+}

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

@@ -0,0 +1,5 @@
+eureka:
+  instance:
+    hostname: saas-eureka-server-test
+server:
+  port: 8515

+ 9 - 0
base-servers/eureka-server/src/main/resources/logback-spring.xml

@@ -109,6 +109,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-file-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: 8655

+ 9 - 0
base-servers/file/file-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-gateway-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: 8575

+ 9 - 0
base-servers/gateway-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-mail-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: 8675

+ 9 - 0
base-servers/mail/mail-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-socket-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: 8695

+ 9 - 0
base-servers/socket/socket-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

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

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-ui-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: 8635

+ 9 - 0
base-servers/ui-server/src/main/resources/logback-spring.xml

@@ -110,6 +110,15 @@
         </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"/>

+ 56 - 0
base-servers/ui-server/src/test/java/com/usoftchina/saas/ui/controller/co/CoViewControllerTest.java

@@ -0,0 +1,56 @@
+package com.usoftchina.saas.ui.controller.co;
+
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.junit.Test;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.security.cert.X509Certificate;
+
+public class CoViewControllerTest {
+
+    public static RestTemplate buildRestTemplate() throws Exception {
+        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
+        // https
+        SSLContextBuilder builder = new SSLContextBuilder();
+        builder.loadTrustMaterial(null, (X509Certificate[] x509Certificates, String s) -> true);
+        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(builder.build(), new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
+        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
+                .register("http", new PlainConnectionSocketFactory())
+                .register("https", socketFactory).build();
+        PoolingHttpClientConnectionManager phccm = new PoolingHttpClientConnectionManager(registry);
+        phccm.setMaxTotal(200);
+        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).setConnectionManager(phccm).setConnectionManagerShared(true).build();
+        factory.setHttpClient(httpClient);
+
+        return new RestTemplate(factory);
+    }
+
+    @Test
+    public void getViewConfig() throws Exception {
+        RestTemplate restTemplate = buildRestTemplate();
+        MultiValueMap headers = new LinkedMultiValueMap();
+        headers.add("Authorization", "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxMzkwNzk5Nzk5OSIsImFwcElkIjoidHJhZGUtYXBwIiwidXNlcklkIjo1NSwiY29tcGFueUlkIjoxLCJ1c2VyTmFtZSI6IjEzOTA3OTk3OTk5IiwicmVhbE5hbWUiOiJoZXkiLCJleHAiOjE1NDM4NDUyMDB9.eKN7UZTdFfAQLj_FB80ifxYu8nF_j-UQtKXSxPGA706iaJyIjR_LM_vbp-ZXx2GLBvZaH89o1qTUxleCCCepl27lvJPgyMqoZWW1YXDfO3hT25DEQoe8zzLH2Dd4GIj8jZ8zEMOhaFsvwMKWNqfCS6ML7pqfhoeoDihyZcv165s");
+        HttpEntity entity = new HttpEntity(headers);
+        ResponseEntity<String> result = restTemplate.exchange("http://192.168.0.174:8560/api/purchase/purchase/list",
+                HttpMethod.GET, entity, String.class);
+        if (result.getStatusCodeValue() == 200) {
+            System.out.println(result.getBody());
+        }
+    }
+
+}

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

@@ -0,0 +1,13 @@
+eureka:
+  instance:
+    hostname: saas-zipkin-server-test
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-test:8515/eureka/
+zipkin:
+  collector:
+    rabbitmq:
+      uri: amqp://saas:select123***@192.168.0.176:5672/test
+server:
+  port: 8555

+ 9 - 0
base-servers/zipkin-server/src/main/resources/logback-spring.xml

@@ -103,6 +103,15 @@
         </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"/>

+ 10 - 4
frontend/saas-portal-web/src/components/conenter/company.vue

@@ -38,8 +38,8 @@
       <div>
         <div class="tc-okkaitong"><span>该企业已开通服务,联系管理员邀请加入</span></div>
         <div class="tc-context">
-          <p><span>saas服务管理员:</span><span>{{arr[0].admin}}</span></p>
-          <p><span>saas服务管理员手机号:</span><span>{{mytoken.account.mobile}}</span></p>
+          <p><span>saas服务管理员:</span><span>{{admin}}</span></p>
+          <p><span>saas服务管理员手机号:</span><span>{{adminMobile}}</span></p>
           <p><span>saas服务管理员邮箱:</span><span></span></p>
         </div>
       </div>
@@ -103,7 +103,9 @@
                 isAutoLogin: this.$store.state.isAutoLogin,
                 mytoken: JSON.parse(localStorage.getItem('app-state-session')),//本地储存的用户信息
                 arr: [],//企业列表信息
-                isheigh:true//是否添加默认高度
+                isheigh:true,//是否添加默认高度
+                admin: '',
+                adminMobile: ''
             }
         },
         computed :{
@@ -123,7 +125,7 @@
             let token = String(mytoken.token);
             //企业列表
             this.$ajax({
-                    url: this.$url.api+"/api/account/accountCenter/company/list",//http://192.168.253.31:8560
+                    url: this.$url.api+"/api/account/accountCenter/company/list",//http://192.168.253.29:8560
                     method: 'get',
                     params: {
                         mobile: mytoken.account.mobile
@@ -263,6 +265,10 @@
                         // this.ktsass = false;
                         this.$router.go(0);
                     } else {
+                        let msg = res.data.message
+                        let name = msg.split(" ")[1]
+                        this.admin = name.split('(')[0]
+                        this.adminMobile = name.split('(')[1].split(')')[0]
                         this.isokopensaas = true;
                     }
                 })

+ 1 - 7
frontend/saas-portal-web/src/components/conenter/enterprise.vue

@@ -61,7 +61,7 @@
                                     <span>UU号</span><span>{{mytoken.uu}}</span>
                                 </li>
                                 <li>
-                                    <span>邮箱</span><span>{{email}}</span>
+                                    <span>邮箱</span><span>{{mytoken.email}}</span>
                                 </li>
                                 <li>
                                     <span>手机号</span><span>{{mytoken.mobile}}</span>
@@ -123,12 +123,6 @@ import { setTimeout } from 'timers';
             setTokenPage() {
                 return this.$url.web + '/set-token.html'
             },
-            email(){
-                return this.$store.state.email
-            }
-        },
-        mounted(){
-            
         },
         methods: {
             // tab切换

+ 6 - 1
frontend/saas-portal-web/src/components/conenter/home.vue

@@ -280,6 +280,11 @@
       }
     },
     created(){
+      if (this.$route.query.isporblem == undefined) {
+        this.isproblem = true
+      } else {
+        this.isproblem = this.$route.query.isporblem
+      }
         this.$ajax({
           url: this.$url.api+'/api/auth/info',
           method: 'get',
@@ -425,7 +430,7 @@
       },
       gohome(e){
         this.$store.commit('problemtrue')
-        this.isproblem = true
+        // this.isproblem = true
       }
     }
   }

+ 2 - 2
frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue

@@ -24,7 +24,7 @@
                 <div class="qy-conent">
                     <ul>
                         <li><span class="qy-biaoti">姓名</span><span>{{content.admin}}</span></li>
-                        <li><span class="qy-biaoti">手机号</span><span>{{mytoken.account.mobile}}</span></li>
+                        <li><span class="qy-biaoti">手机号</span><span>{{content.adminMobile}}</span></li>
                         <li><span class="qy-biaoti">邮箱</span><span>{{content.adminEmail}}</span></li>
                     </ul>
                 </div>
@@ -83,7 +83,7 @@
                 <div class="qy-conent">
                     <ul>
                         <li><span class="qy-biaoti">姓名</span><span>{{content.admin}}</span></li>
-                        <li><span class="qy-biaoti">手机号</span><span>{{mytoken.account.mobile}}</span></li>
+                        <li><span class="qy-biaoti">手机号</span><span>{{content.adminMobile}}</span></li>
                         <li>
                             <span class="qy-biaoti">邮箱</span>
                             <input @change="email" ref="email" type="text" value="">

+ 0 - 1
frontend/saas-portal-web/src/components/footer/footer.vue

@@ -66,7 +66,6 @@
 		methods:{
 			problem(){
 				this.$router.push({path: '/name', query: {isporblem: false}})
-				// this.$router.go(0)
 				this.$store.commit("problemfalse")
 				document.documentElement.scrollTop = 0;
 			}

+ 1 - 1
frontend/saas-portal-web/src/store/index.js

@@ -7,7 +7,7 @@ export default new Vuex.Store({
         data: [],
         email:'',
         isAutoLogin: false,
-        isproblem: true,//常见问题
+        isproblem: '',//常见问题
     },
     mutations:{
          Logintrue(state) {

+ 8 - 7
frontend/saas-portal-web/static/js/mains.js

@@ -87,28 +87,29 @@ $(document).ready(function(){
 	/*	Menu item highlighting
 	/* ========================================================================= */
 
-	// jQuery('#nav').singlePageNav({
-	// 	offset: jQuery('#nav').outerHeight(),
+	// $('#nav').singlePageNav({
+	// 	offset: $('#nav').outerHeight(),
 	// 	filter: ':not(.external)',
-	// 	speed: 2000,
+	// 	speed: 2000,//动画时间
 	// 	currentClass: 'current',
 	// 	easing: 'easeInOutExpo',
 	// 	updateHash: true,
 	// 	beforeStart: function() {
-	// 		console.log('begin scrolling');
+	// 		console.log('开始滚动');
 	// 	},
 	// 	onComplete: function() {
-	// 		console.log('done scrolling');
+	// 		console.log('滚动结束');
 	// 	}
 	// });
 
     $(window).scroll(function () {
         if ($(window).scrollTop() > 10) {
             $(".navbar-brand a").css("color","#fff");
-            $("#navigation").removeClass("animated-header");
+            $("#navigation").addClass("animated-header");
+            
         } else {
             $(".navbar-brand a").css("color","inherit");
-            $("#navigation").addClass("animated-header");
+            $("#navigation").removeClass("animated-header");
         }
     });
 

+ 10 - 61
frontend/saas-web/app/view/core/form/field/DetailGridField.js

@@ -29,9 +29,7 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
 
     emptyRows: 5,
 
-    // Clearing selection disables the Actions.
     allowDeselect: true,
-    defaultActionType: 'button',
 
     initComponent: function() {
         var me = this;
@@ -46,45 +44,22 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
         };
 
         Ext.apply(me, {
-            actions: {
-                copy: {
-                    iconCls: 'x-fa fa-copy',
-                    text: '复制单元格',
-                    handler: function() {
-                        me.onCopy(me.selectedData);
-                    }
-                }
-            },
-            plugins: {
-                cellediting: {
-                    clicksToEdit: 1,
-                    listeners: {
-                        edit: function(editor, context, eOpts) {
-                            context.column.fireEvent('edit', context.value);
-                        }
+            plugins: [{
+                ptype: 'cellediting',
+                clicksToEdit: 1,
+                listeners: {
+                    edit: function(editor, context, eOpts) {
+                        context.column.fireEvent('edit', context.value);
                     }
                 }
-            },
+            }, {
+                ptype: 'menuclipboard'
+            }],
             normalViewConfig: {
                 deferEmptyText: false,
                 emptyText: '无数据',
-                listeners: {
-                    itemcontextmenu: function(view, rec, node, index, e) {
-                        e.stopEvent();
-                        me.getContextMenu().show().setLocalXY(e.getXY());
-                        me.selectedData = e.target.innerText;
-                        return false;
-                    }
-                }
-            },
-            lockedGridConfig: {
-                // scrollable: {
-                //     x: false,
-                //     y: true
-                // }
             },
             lockedViewConfig: {
-                // scrollable: false,
                 scrollable: {
                     x: false,
                     y: true
@@ -536,31 +511,5 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
             }
         });
         return trueData;
-    },
-
-    getContextMenu: function() {
-        var me = this;
-
-        return me.contextMenu || (me.contextMenu = me.add({
-            xtype: 'menu',
-            items: [
-                // Actions can be converted into MenuItems
-                '@copy',
-            ]
-        }));
-    },
-
-    onCopy: function(text) {
-		var target = Ext.DomHelper.append(document.body, {
-			tag: 'textarea',
-			style: 'opacity: 0;position: absolute;top: -10000px;right: 0;',
-			html: text
-		});
-		target.focus();
-		target.select();
-	    document.execCommand('Copy');
-	    target.blur();
-	    document.body.removeChild(target);
-	},
-
+    }
 });

+ 15 - 46
frontend/saas-web/app/view/core/query/QueryGridPanel.js

@@ -9,9 +9,12 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
     requires: [
         'Ext.grid.plugin.Exporter'
     ],
-    plugins: {
-        gridexporter: true
-    },
+
+    plugins: [{
+        ptype: 'gridexporter',
+    }, {
+        ptype: 'menuclipboard'
+    }],
 
     idField:'',
     codeField:'',
@@ -58,26 +61,9 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
         }
 
         Ext.apply(me, {
-            actions: {
-                copy: {
-                    iconCls: 'x-fa fa-copy',
-                    text: '复制单元格',
-                    handler: function() {
-                        me.onCopy(me.selectedData);
-                    }
-                }
-            },
             viewConfig: {
                 deferEmptyText: false,
-                emptyText: '无数据',
-                listeners: {
-                    itemcontextmenu: function(view, rec, node, index, e) {
-                        e.stopEvent();
-                        me.getContextMenu().show().setLocalXY(e.getXY());
-                        me.selectedData = e.target.innerText;
-                        return false;
-                    }
-                }
+                emptyText: '无数据'
             },
             columns: me.initColumns(),
             store: Ext.create('Ext.data.Store', {
@@ -287,11 +273,19 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                     // exportStyle: {
                     //     format: 'Medium Date'
                     // },
+                    copyRender: function(value) {
+                        return Ext.Date.format(new Date(value), 'Y-m-d');
+                    },
                     exportRenderer: function (value) {
                         return Ext.Date.format(new Date(value), 'Y-m-d');
                     }
                 })
             }
+            if(c.xtype == 'numbercolumn') {
+                Ext.applyIf(c, {
+                    align: 'end'
+                });
+            }
         });
 
         return columns;
@@ -422,29 +416,4 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
             });
 		return data;
     },
-
-    getContextMenu: function() {
-        var me = this;
-
-        return me.contextMenu || (me.contextMenu = me.add({
-            xtype: 'menu',
-            items: [
-                // Actions can be converted into MenuItems
-                '@copy',
-            ]
-        }));
-    },
-
-    onCopy: function(text) {
-		var target = Ext.DomHelper.append(document.body, {
-			tag: 'textarea',
-			style: 'opacity: 0;position: absolute;top: -10000px;right: 0;',
-			html: text
-		});
-		target.focus();
-		target.select();
-	    document.execCommand('Copy');
-	    target.blur();
-	    document.body.removeChild(target);
-	},
 });

+ 0 - 8
frontend/saas-web/app/view/core/query/QueryPanel.js

@@ -102,14 +102,6 @@ Ext.define('saas.view.core.query.QueryPanel', {
         
         var columns = queryGridConfig.baseColumn || [];
 
-        Ext.Array.each(columns, function(c) {
-            if(c.xtype == 'numbercolumn') {
-                Ext.applyIf(c, {
-                    align: 'end'
-                });
-            }
-        });
-
         if(columns[columns.length - 1].flex != 1) {
             columns.push({
                 flex: 1,

+ 9 - 1
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -239,7 +239,15 @@ Ext.define('saas.view.core.report.ReportPanel', {
                                     return s.hasOwnProperty(name);
                                 })
                                 if(type && d) {
-                                    c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
+                                    if(type == 'count') {
+                                        c.summaryValue = Ext.util.Format.number(d[name], c.format || '0');
+                                    }else if(typeof c.summaryRender == 'function') {
+                                        c.summaryValue = c.summaryRender(d[name]);
+                                    }else if(typeof c.renderer == 'function') {
+                                        c.summaryValue = c.renderer(d[name]);
+                                    }else {
+                                        c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
+                                    }
                                 }else {
                                     c.summaryValue = 0;
                                 }

+ 132 - 0
frontend/saas-web/app/view/document/kind/KindModel.js

@@ -22,6 +22,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -49,6 +61,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -76,6 +100,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -103,6 +139,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -136,6 +184,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data.list'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -164,6 +224,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -195,6 +267,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data.list'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -222,6 +306,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -249,6 +345,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -279,6 +387,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data.list'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,
@@ -306,6 +426,18 @@ Ext.define('saas.view.document.kind.KindModel', {
                 reader: {
                     type: 'json',
                     rootProperty: 'data'
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        if(operation.success) {
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }
+                        }else {
+                            console.error('exception: ', response.responseJson);
+                            saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                        }
+                    }
                 }
             },
             pageSize: null,

+ 2 - 0
frontend/saas-web/app/view/home/charts/MonthSale.scss

@@ -1,9 +1,11 @@
 .x-pie-legend {
 
     .x-legend-inner {
+        display: block;
         padding: 0;
 
         .x-legend-container {
+            display: block;
 
             .x-legend-item {
                 font-size: 12px;

+ 1 - 1
frontend/saas-web/app/view/stock/report/ProdinoutCount.js

@@ -20,7 +20,7 @@ Ext.define('saas.view.stock.report.ProdinoutCount', {
         columnWidth: 0.2
     }, {		
         xtype: 'productDbfindTrigger',
-        name: 'pd_prodcode',
+        name: 'pr_code',
         fieldLabel: '物料编号',
         columnWidth: 0.2
     }, {

+ 2 - 2
frontend/saas-web/app/view/stock/report/ProdinoutCountController.js

@@ -4,12 +4,12 @@ Ext.define('saas.view.stock.report.ProdinoutCountController', {
     init: function (form) {
         this.control({
            //放大镜赋值关系 以及 tpl模板
-           'dbfindtrigger[name=pd_prodcode]':{
+           'dbfindtrigger[name=pr_code]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         dbfinds:[
                         {
-                            from:'pr_code',to:'pd_prodcode'
+                            from:'pr_code',to:'pr_code'
                         }, {
                             from:'pr_detail',to:'pr_detail'
                         }, {

+ 190 - 0
frontend/saas-web/ext/packages/ux/src/plugin/MenuClipboard.js

@@ -0,0 +1,190 @@
+Ext.define('Ext.ux.plugin.MenuClipboard', {
+    extend: 'Ext.plugin.Abstract',
+    alias: 'plugin.menuclipboard',
+
+    copyCls : 'grid-copy',
+
+    formats: {
+        cell: {
+            get: 'getCells'
+        },
+        html: {
+            get: 'getCellData'
+        },
+        raw: {
+            get: 'getCellData',
+            put: 'putCellData'
+        }
+    },
+
+    constructor: function (config) {
+        if (config) {
+            this.pluginConfig = config;
+            this.cmp = config.cmp;
+            this.initConfig(config);
+        }
+    },
+
+    initConfig: function() {
+        var me = this;
+
+        me.applyEventListeners();
+
+        me.callParent(arguments);
+    },
+
+    isExecable: function() {
+		return Ext.isChrome && Number(Ext.userAgent.match(/chrome\/[\d.]+/gi)[0].replace(/[^0-9.]/ig,"").substring(0, 2)) > 42;
+	},
+
+    applyEventListeners: function() {
+        var me = this,
+        grid = me.cmp;
+
+        me.execable = me.isExecable();
+
+        grid.on({
+            cellcontextmenu (view, td, cellIndex, record, tr, rowIndex, e, eOpts) {
+                e.stopEvent();
+                me.getContextMenu(view, td, cellIndex, record, tr, rowIndex, e, eOpts);
+                return false;
+            },
+        });
+    },
+
+    getContextMenu : function(view, td, colIdx, record, tr, rowIdx, e) {
+		var me = this,
+			grid = me.cmp,
+			column = view.getHeaderByCell(td) || view.ownerCt.headerCt.getHeaderAtIndex(colIdx);
+
+		if (!column) {
+			return;
+		}
+		var dataIndex = column.dataIndex;
+		e.preventDefault();
+	    var menu = view.copymenu;
+		if (!menu) {
+			menu = view.copymenu = me.createMenu();
+		}
+		menu.showAt(e.getXY());
+		// me.clearCopyCls();
+		menu.grid = grid;
+		menu.td = td,
+		menu.record = record;
+		menu.column = column;
+		menu.dataIndex = dataIndex;
+		menu.cell = view.getCell(menu.record, menu.column);
+		// menu.cell.addCls(me.copyCls);
+    },
+    
+    createMenu : function() {
+		var me = this;
+		return Ext.create('Ext.menu.Menu', {
+			bodyCls:'copyMenu',
+			items: [{
+				copyType : 'cell',
+				iconCls : 'x-button-icon-copy',
+				text : '复制单元格',
+				handler: function(item) {
+					if(me.execable) {
+						var m = item.ownerCt;
+						me.onCopy(me.getCellText(m.grid, m.td, m.record, m.column, m.dataIndex, m.cell));
+					}
+				}
+			// },{
+			// 	copyType : 'row',
+			// 	text : '复制行',
+			// 	handler: function(item) {
+			// 		if(me.execable) {
+			// 			var m = item.ownerCt;
+			// 			me.onCopy(me.getRecordText(m.grid, m.td, m.record, m.column, m.dataIndex, m.cell));
+			// 		}
+			// 	}
+			// },{
+			// 	copyType : 'table',
+			// 	text : '复制表格',
+			// 	handler: function(item) {
+			// 		if(me.execable) {
+			// 			var m = item.ownerCt;
+			// 			me.onCopy(me.getTableText(m.grid));
+			// 		}
+			// 	}
+			// },{
+		    // 	xtype: 'menuseparator',cls:'x-copymenu-spt'
+		    // },{
+			// 	text : '复制到整列',
+			// 	handler : function(t, e) {
+			// 		var m = t.up('menu'),
+			// 		val = me.getCellText(m.grid, m.record, m.column, m.dataIndex);
+		    // 		m && me.onColumnPaste(val, m.grid, m.column, m.record, m.dataIndex, m.cell, e);
+		    // 	}
+			// },{
+		    // 	xtype: 'menuseparator',cls:'x-copymenu-spt'
+		    // },{
+		    // 	text : '粘贴',
+		    // 	iconCls : 'x-button-icon-paste',
+		    // 	handler : function() {
+		    // 		me.onCellPaste();
+		    // 	}
+		    }]
+		});
+    },
+    
+    getCellText : function(grid, td, record, column, dataIndex, cell) {
+		var v = record.get(dataIndex), cv;
+		v = v || cell.textContent;
+
+		if(typeof column.copyRender == 'function') {
+			return column.copyRender(v);
+		}
+
+        if(Ext.isDate(v)) {
+            cv = Ext.Date.format(v, column.format || Ext.Date.defaultFormat);
+        }else if(Ext.isNumber(v)) {
+            cv = v + '';
+        }else {
+            cv = v;
+        }
+		return cv;
+	},
+	
+	// getRecordText : function(grid, td, record, column, dataIndex, cell) {
+	// 	var me = this, s = [], columns = grid.headerCt.getGridColumns(), v = null;
+	// 	Ext.each(columns, function(c){
+	// 		if(!c.hidden && c.dataIndex && c.getWidth() > 0) {
+	// 			v = me.getCellText(grid, td, record, column, dataIndex, cell);
+	// 			if(c == null) {
+	// 				s.push(' ');
+	// 			} else {
+	// 				if(Ext.isDate(v)) {
+	// 					s.push(Ext.Date.format(v, c.format || Ext.Date.defaultFormat));
+	// 				} else {
+	// 					s.push(v);
+	// 				}
+	// 			}
+	// 		}
+	// 	});
+	// 	return s.join('\t');
+	// },
+
+	getTableText : function(grid) {
+		var me = this, s = [];
+		grid.store.each(function(){
+			s.push(me.getRecordText(grid, this));
+		});
+		return s.join('\n');
+	},
+
+    onCopy: function(text) {
+		var target = Ext.DomHelper.append(document.body, {
+			tag: 'textarea',
+			style: 'opacity: 0;position: absolute;top: -10000px;right: 0;',
+			html: text
+		});
+		target.focus();
+		target.select();
+	    document.execCommand('Copy');
+	    target.blur();
+	    document.body.removeChild(target);
+	},
+});

+ 48 - 0
pom.xml

@@ -446,6 +446,54 @@
                 </pluginManagement>
             </build>
         </profile>
+        <profile>
+            <!-- mvn deploy -P docker-test -->
+            <id>docker-test</id>
+            <properties>
+                <docker.registry.name>saas/test</docker.registry.name>
+            </properties>
+            <build>
+                <pluginManagement>
+                    <plugins>
+                        <!-- Docker maven plugin -->
+                        <plugin>
+                            <groupId>com.spotify</groupId>
+                            <artifactId>docker-maven-plugin</artifactId>
+                            <version>1.0.0</version>
+                            <configuration>
+                                <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
+                                <registryUrl>${docker.repository}</registryUrl>
+                                <pushImage>true</pushImage>
+                                <forceTags>true</forceTags>
+                                <imageName>
+                                    ${docker.repository}/${docker.registry.name}/${project.artifactId}:${project.version}
+                                </imageName>
+                                <imageTags>
+                                    <imageTag>latest</imageTag>
+                                </imageTags>
+                                <resources>
+                                    <resource>
+                                        <targetPath>/</targetPath>
+                                        <directory>${project.build.directory}</directory>
+                                        <include>${project.build.finalName}.jar</include>
+                                    </resource>
+                                </resources>
+                            </configuration>
+                            <executions>
+                                <execution>
+                                    <id>build-image</id>
+                                    <phase>package</phase>
+                                    <goals>
+                                        <goal>build</goal>
+                                    </goals>
+                                </execution>
+                            </executions>
+                        </plugin>
+                        <!-- Docker maven plugin -->
+                    </plugins>
+                </pluginManagement>
+            </build>
+        </profile>
         <profile>
             <!-- mvn deploy -P docker-prod -->
             <id>docker-prod</id>