Browse Source

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

hy 7 years ago
parent
commit
90750a00d5
82 changed files with 1068 additions and 254 deletions
  1. 3 2
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  2. 4 57
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java
  3. 12 0
      applications/commons/commons-server/src/main/resources/config/application-docker-test.yml
  4. 9 0
      applications/commons/commons-server/src/main/resources/logback-spring.xml
  5. 1 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/DataImportMapper.java
  6. 3 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/EmployeeServiceImpl.java
  7. 13 12
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  8. 12 0
      applications/document/document-server/src/main/resources/config/application-docker-test.yml
  9. 9 0
      applications/document/document-server/src/main/resources/logback-spring.xml
  10. 1 1
      applications/document/document-server/src/main/resources/mapper/DataImportMapper.xml
  11. 1 1
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  12. 12 0
      applications/money/money-server/src/main/resources/config/application-docker-test.yml
  13. 9 0
      applications/money/money-server/src/main/resources/logback-spring.xml
  14. 1 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/report/PurchaseReportDetail.java
  15. 12 0
      applications/purchase/purchase-server/src/main/resources/config/application-docker-test.yml
  16. 9 0
      applications/purchase/purchase-server/src/main/resources/logback-spring.xml
  17. 1 0
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseReportMapper.xml
  18. 12 1
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/SaleApplication.java
  19. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/ProdInOutMapper.java
  20. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleMapper.java
  21. 30 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  22. 12 4
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  23. 12 0
      applications/sale/sale-server/src/main/resources/config/application-docker-test.yml
  24. 9 0
      applications/sale/sale-server/src/main/resources/logback-spring.xml
  25. 11 6
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutMapper.xml
  26. 7 2
      applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml
  27. 2 0
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/MakeServiceImpl.java
  28. 12 0
      applications/storage/storage-server/src/main/resources/config/application-docker-test.yml
  29. 9 0
      applications/storage/storage-server/src/main/resources/logback-spring.xml
  30. 12 1
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java
  31. 2 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  32. 12 0
      base-servers/account/account-server/src/main/resources/config/application-docker-test.yml
  33. 9 0
      base-servers/account/account-server/src/main/resources/logback-spring.xml
  34. 1 1
      base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml
  35. 5 3
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/api/AccountCacheTest.java
  36. 12 0
      base-servers/admin-server/src/main/resources/config/application-docker-test.yml
  37. 9 0
      base-servers/admin-server/src/main/resources/logback-spring.xml
  38. 12 0
      base-servers/auth/auth-server/src/main/resources/config/application-docker-test.yml
  39. 9 0
      base-servers/auth/auth-server/src/main/resources/logback-spring.xml
  40. 20 0
      base-servers/auth/auth-server/src/test/java/com/usoftchina/saas/auth/controller/JwtTest.java
  41. 5 0
      base-servers/eureka-server/src/main/resources/config/application-docker-test.yml
  42. 9 0
      base-servers/eureka-server/src/main/resources/logback-spring.xml
  43. 12 0
      base-servers/file/file-server/src/main/resources/config/application-docker-test.yml
  44. 9 0
      base-servers/file/file-server/src/main/resources/logback-spring.xml
  45. 12 0
      base-servers/gateway-server/src/main/resources/config/application-docker-test.yml
  46. 9 0
      base-servers/gateway-server/src/main/resources/logback-spring.xml
  47. 12 0
      base-servers/mail/mail-server/src/main/resources/config/application-docker-test.yml
  48. 9 0
      base-servers/mail/mail-server/src/main/resources/logback-spring.xml
  49. 12 0
      base-servers/socket/socket-server/src/main/resources/config/application-docker-test.yml
  50. 9 0
      base-servers/socket/socket-server/src/main/resources/logback-spring.xml
  51. 12 0
      base-servers/ui-server/src/main/resources/config/application-docker-test.yml
  52. 9 0
      base-servers/ui-server/src/main/resources/logback-spring.xml
  53. 56 0
      base-servers/ui-server/src/test/java/com/usoftchina/saas/ui/controller/co/CoViewControllerTest.java
  54. 13 0
      base-servers/zipkin-server/src/main/resources/config/application-docker-test.yml
  55. 9 0
      base-servers/zipkin-server/src/main/resources/logback-spring.xml
  56. 41 0
      frontend/saas-portal-web/build/build-dev.js
  57. 4 2
      frontend/saas-portal-web/build/webpack.prod.conf.js
  58. 3 4
      frontend/saas-portal-web/config/dev.env.js
  59. 2 2
      frontend/saas-portal-web/config/test.env.js
  60. 2 1
      frontend/saas-portal-web/package.json
  61. 10 4
      frontend/saas-portal-web/src/components/conenter/company.vue
  62. 1 7
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  63. 6 1
      frontend/saas-portal-web/src/components/conenter/home.vue
  64. 2 2
      frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue
  65. 0 1
      frontend/saas-portal-web/src/components/footer/footer.vue
  66. 1 1
      frontend/saas-portal-web/src/store/index.js
  67. 8 7
      frontend/saas-portal-web/static/js/mains.js
  68. 19 4
      frontend/saas-web/app.json
  69. 12 0
      frontend/saas-web/app/view/core/dbfind/DbfindGridPanel.js
  70. 12 0
      frontend/saas-web/app/view/core/dbfind/MultiDbfindGridPanel.js
  71. 10 61
      frontend/saas-web/app/view/core/form/field/DetailGridField.js
  72. 15 46
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  73. 0 8
      frontend/saas-web/app/view/core/query/QueryPanel.js
  74. 9 1
      frontend/saas-web/app/view/core/report/ReportPanel.js
  75. 132 0
      frontend/saas-web/app/view/document/kind/KindModel.js
  76. 2 0
      frontend/saas-web/app/view/home/charts/MonthSale.scss
  77. 2 2
      frontend/saas-web/app/view/money/report/CustomerCheck.js
  78. 1 1
      frontend/saas-web/app/view/stock/report/ProdinoutCount.js
  79. 2 2
      frontend/saas-web/app/view/stock/report/ProdinoutCountController.js
  80. 190 0
      frontend/saas-web/ext/packages/ux/src/plugin/MenuClipboard.js
  81. 2 1
      frontend/saas-web/package.json
  82. 48 0
      pom.xml

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

@@ -75,13 +75,14 @@ public enum BizExceptionCode implements BaseExceptionCode {
     SALE_NULL_BILL(72002, "单据不存在或者明细为空"),
     SALEOUT_ALL_TURNIN(72003, "该出货单已全部转退货,无法转销售退货单"),
     SALEOUT_POSTSTATUS_ERROR(72004,"当前单据状态无法进行此操作。"),
-    SALEOUT_POST_ERROR(72005,""),
+    SALEOUT_POST_ERROR(72005,"编号:<u>%s</u>处理失败,%s"),
     SALEOUT_UNAUDIT_ERROR(72006,"销售订单已转出货单,无法反审核"),
     SALE_ORDER_HASAUDIT(72003, "存在已审核单据,单据编号:%s"),
     SALE_EXISTS_PURCHASE(72004, "存在已转的采购单据,单据编号:%s"),
     SALE_ALREADY_UNAUDIT(72007, "单据状态为未审核,无法反审核"),
     SALE_CUST_CLOSE(72008, "客户已关闭,无法审核"),
-
+    SALE_ORDER_ISUNAUDIT(72009, "存在未审核单据,单据编号:%s"),
+    SALE_ORDER_ISCOLSED(72010, "存在已关闭单据,单据编号:%s"),
     //资金
     PAYBALANCE_OUTNOWBALANCE(74001,"本次核销金额不能大于未核销金额"),
     PAYBALANCE_UNIQUESOURCECODE(74002, "保存失败!不能选择重复的源单"),

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

@@ -45,66 +45,13 @@ public class ExcelServiceImpl implements ExcelService{
         Map<String, Object> map = new HashMap<>();
         SXSSFWorkbook workbook = new SXSSFWorkbook();
         DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, companyId);
+        //列
         String cols = dataTemplet.getDt_columns();
-      /*  String cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\"},{\"description\":\"物料名称\",\"necessary\":\"true\"},{\"description\":\"物料类型\",\"necessary\":\"true\"},{\"description\":\"仓库编号\",\"necessary\":\"true\"},{\"description\":\"仓库名称\",\"necessary\":\"true\"}]";
-        cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_code\",\"codefield\":true}," +
-                "{\"description\":\"物料名称\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_detail\",\"codefield\":false}," +
-                "{\"description\":\"更新时间\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"updateTime\",\"codefield\":false,\"type\":\"date\"}," +
-                "{\"description\":\"规格\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_spec\",\"codefield\":false}," +
-                "{\"description\":\"类型\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_kind\",\"codefield\":false}," +
-                "{\"description\":\"型号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_orispeccode\",\"codefield\":false}" +
-                ",{\"description\":\"品牌\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_brand\",\"codefield\":false}," +
-                "{\"description\":\"单位\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_unit\",\"codefield\":false}," +
-                "{\"description\":\"仓库编号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whcode\",\"codefield\":false}," +
-                "{\"description\":\"仓库名称\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whname\",\"codefield\":false}," +
-                "{\"description\":\"最新采购单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_purcprice\",\"codefield\":false}" +
-                ",{\"description\":\"最新出货单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_saleprice\",\"codefield\":false}," +
-                "{\"description\":\"替代料仓库编号\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_whcode\",\"codefield\":false}," +
-                "{\"description\":\"替代料仓库名称\",\"necessary\":\"false\",\"position\":\"detail\",\"field\":\"pd_whname\",\"codefield\":false}," +
-                "{\"description\":\"期初数量\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_num\",\"codefield\":false}," +
-                "{\"description\":\"单位成本\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_price\",\"codefield\":false}]";
-      */
         JSONArray array = (JSONArray) JSONArray.parse(cols);
+        //模板数据
         String remark = dataTemplet.getDt_description();
-        //String exampledata = dataTemplet.getDt_exampledata();
-        //JSONArray datas = (JSONArray) JSONArray.parse(exampledata);
-        JSONArray datas = new JSONArray();
-        JSONObject data = new JSONObject();
-        data.put("物料编号", "code1");
-        data.put("物料名称", "name1");
-        data.put("规格", "spec1");
-        data.put("型号", "kind1");
-        data.put("品牌", "brand1");
-        data.put("更新时间", "2018-09-08");
-        data.put("单位", "nuit1");
-        data.put("类型", "leixin1");
-        data.put("仓库编号", "whcode1");
-        data.put("仓库名称", "whname1");
-        data.put("最新采购单价", "100");
-        data.put("最新出货单价", "22");
-        data.put("替代料仓库编号", "tcode1");
-        data.put("替代料仓库名称", "tname1");
-        data.put("期初数量", "22");
-        data.put("单位成本", "22");
-        datas.add(data);
-        JSONObject data2 = new JSONObject();
-        data2.put("物料编号", "code2");
-        data2.put("物料名称", "name2");
-        data2.put("规格", "spec2");
-        data2.put("型号", "kind2");
-        data2.put("品牌", "brand2");
-        data2.put("单位", "nuit2");
-        data2.put("类型", "leixin2");
-        data2.put("仓库编号", "whcode2");
-        data2.put("仓库名称", "whname2");
-        data2.put("最新采购单价", "100");
-        data2.put("最新出货单价", "22");
-        data2.put("替代料仓库编号", "tcode2");
-        data2.put("替代料仓库名称", "tname2");
-        data2.put("期初数量", "22");
-        data2.put("单位成本", "22");
-        datas.add(data2);
-        System.out.println(datas.toJSONString());
+        String exampledata = dataTemplet.getDt_exampledata();
+        JSONArray datas = (JSONArray) JSONArray.parse(exampledata);
         createWorkbook(workbook, 1, array, datas, remark);
         map.put("workbook", workbook);
         map.put("title", dataTemplet.getDt_title());

+ 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"/>

+ 1 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/DataImportMapper.java

@@ -14,7 +14,7 @@ public interface DataImportMapper {
 
     List<DataImportDetail> selectDataById(Integer id);
 
-    DataImportDetail selectProductBycode(@Param("code") String code, @Param("id") int id, @Param("companyid") Long companyId);
+    DataImportDetail selectMainBycode(@Param("code") String code, @Param("id") int id, @Param("companyid") Long companyId);
 
     void updateDataImport(Integer id);
 

+ 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());

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

@@ -549,7 +549,7 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
                 List<ProductDetail> productDetails = new ArrayList<>();
                 int i = getMapper().validateCodeWhenInsert(code, companyId);
                 List<DataImportDetail> data = datas.get(code);
-                DataImportDetail main = dataImportMapper.selectProductBycode(code, id, companyId);
+                DataImportDetail main = dataImportMapper.selectMainBycode(code, id, companyId);
                 Product product = JSONObject.parseObject(main.getDd_maindata(), Product.class);
                 Warehouse warehouse = null;
                 //验证仓库
@@ -563,6 +563,17 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
                     product.setPr_status(Status.OPEN.getDisplay());
                     product.setPr_statuscode(Status.OPEN.name());
                 }
+                //编号不存在
+                if (i == 0) {
+                    product.setId(0l);
+                    //编号存在、需要更新
+                } else if (update){
+                    Long pr_id = getMapper().selectIdByCode(code, companyId);
+                    product.setId(pr_id);
+                    //编号存在、不需要处理
+                } else {
+                    continue;
+                }
                 //添加从表
                 if (data.size() > 0) {
                     detno = 1;
@@ -584,17 +595,7 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
                         }
                     }
                 }
-                //编号不存在
-                if (i == 0) {
-                    product.setId(0l);
-                //编号存在、需要更新
-                } else if (update){
-                    Long pr_id = getMapper().selectIdByCode(code, companyId);
-                    product.setId(pr_id);
-                //编号存在、不需要处理
-                } else {
-                    continue;
-                }
+
                 listDTO.setMain(product);
                 listDTO.setItems(productDetails);
                 list.add(listDTO);

+ 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"/>

+ 1 - 1
applications/document/document-server/src/main/resources/mapper/DataImportMapper.xml

@@ -91,7 +91,7 @@
   where dd_diid = #{id}
 </select>
 
-  <select id="selectProductBycode" resultMap="DetailMap">
+  <select id="selectMainBycode" resultMap="DetailMap">
     select * from  data_importdetail
     where dd_codevalue = #{code} and dd_diid=#{id} and ifnull(dd_success,0)=0 and dd_maindata is not null and companyid=#{companyid}
   </select>

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

@@ -902,7 +902,7 @@
         DELETE FROM PRODIODETAIL WHERE PD_PIID IN (SELECT PI_ID FROM PRODINOUT WHERE PI_INOUTNO=#{code} AND PRODINOUT.COMPANYID = #{companyId}) AND PRODIODETAIL.COMPANYID = #{companyId}
     </delete>
 
-    <select id="selectIdByCode" parameterType="long">
+    <select id="selectIdByCode" resultType="long">
         select pr_id from product where pr_code=#{code} and companyId=#{companyId}
     </select>
 </mapper>

+ 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"/>

+ 1 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/report/PurchaseReportDetail.java

@@ -119,6 +119,7 @@ public class PurchaseReportDetail extends CommonBaseEntity implements Serializab
 
     private Double pd_accepttotal;
 
+    private String pd_remark;
     //private ProductDTO productDTO;
     private Long pr_id;
     private String pr_code;

+ 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"/>

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

@@ -70,6 +70,7 @@
     <result column="pd_text4" property="pd_text4" jdbcType="VARCHAR" />
     <result column="pd_text5" property="pd_text5" jdbcType="VARCHAR" />
     <result column="pd_yqty" property="pd_yqty" jdbcType="DOUBLE" />
+    <result column="pd_remark" property="pd_remark" jdbcType="VARCHAR" />
     <result column="pr_id" property="pr_id"/>
     <result column="pr_code" property="pr_code"/>
     <result column="pr_detail" property="pr_detail"/>

+ 12 - 1
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/SaleApplication.java

@@ -6,6 +6,8 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
 
 /**
@@ -17,9 +19,18 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 @EnableEurekaClient
 @EnableFeignClients("com.usoftchina.saas")
 @EnableAuthClient
-public class SaleApplication  {
+public class SaleApplication extends WebMvcConfigurerAdapter {
     public static void main(String[] args) {
         SpringApplication.run(SaleApplication.class, args);
     }
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+
+        registry.addMapping("/**")
+                .allowCredentials(true)
+                .allowedHeaders("*")
+                .allowedOrigins("*")
+                .allowedMethods("*");
+    }
 
 }

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/ProdInOutMapper.java

@@ -34,6 +34,8 @@ public interface ProdInOutMapper extends CommonBaseMapper<ProdInOut> {
 
     String validateAudit(List<DocBaseDTO> baseDTOs);
 
+    String validateClose(List<DocBaseDTO> baseDTOs);
+
     String validateBatchUnAudit(List<DocBaseDTO> baseDTOs);
 
     String validateBatchClose(List<DocBaseDTO> baseDTOs);

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleMapper.java

@@ -56,4 +56,6 @@ public interface SaleMapper extends CommonBaseMapper<Sale> {
     Integer checkCustomer(Long id);
 
     String validateCustAudit(List<DocBaseDTO> baseDTOs);
+
+    String validateClose(List<DocBaseDTO> baseDTOs);
 }

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

@@ -283,6 +283,20 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
                 baseDTOs.getBaseDTOs().size() == 0) {
             return "没有可审核单据。";
         }
+        //存在已审核单据,单据编号:XXXX
+        String msg = prodInOutMapper.validateAudit(baseDTOs.getBaseDTOs());
+        if (null != msg) {
+            String message = BizExceptionCode.SALE_ORDER_HASAUDIT.getMessage();
+            int code = BizExceptionCode.SALE_ORDER_HASAUDIT.getCode();
+            throw new BizException(code, String.format(message, msg));
+        }
+        //存在已关闭单据,单据编号:XXXX
+        msg = prodInOutMapper.validateClose(baseDTOs.getBaseDTOs());
+        if (null != msg) {
+            String message = BizExceptionCode.SALE_ORDER_ISCOLSED.getMessage();
+            int code = BizExceptionCode.SALE_ORDER_ISCOLSED.getCode();
+            throw new BizException(code, String.format(message, msg));
+        }
         StringBuffer errorMsg = new StringBuffer();
         for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
             try{
@@ -291,7 +305,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
                 ProdInOutDTO prodInOutDTO = BeanMapper.map(prodInOut,ProdInOutDTO.class);
                 singleAudit(prodInOutDTO);
             }catch (Exception e){
-                String msg = BizExceptionCode.DEAL_FAILED.getMessage();
+                msg = BizExceptionCode.DEAL_FAILED.getMessage();
                 errorMsg.append(String.format(msg, base.getCode(), e.getMessage()));
             }
         }
@@ -337,6 +351,20 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
                 baseDTOs.getBaseDTOs().size() == 0) {
             return "无可反审核单据。";
         }
+        //存在未审核单据,单据编号:XXXX
+        String msg = prodInOutMapper.validateBatchUnAudit(baseDTOs.getBaseDTOs());
+        if (null != msg) {
+            String message = BizExceptionCode.SALE_ORDER_ISUNAUDIT.getMessage();
+            int code = BizExceptionCode.SALE_ORDER_ISUNAUDIT.getCode();
+            throw new BizException(code, String.format(message, msg));
+        }
+        //存在已关闭单据,单据编号:XXXX
+        msg = prodInOutMapper.validateClose(baseDTOs.getBaseDTOs());
+        if (null != msg) {
+            String message = BizExceptionCode.SALE_ORDER_ISCOLSED.getMessage();
+            int code = BizExceptionCode.SALE_ORDER_ISCOLSED.getCode();
+            throw new BizException(code, String.format(message, msg));
+        }
         StringBuffer errorMsg = new StringBuffer();
         for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
             try {
@@ -345,7 +373,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
                 ProdInOutDTO prodInOutDTO = BeanMapper.map(prodInOut,ProdInOutDTO.class);
                 singleUnAudit(prodInOutDTO);
             }catch (Exception e){
-                String msg = BizExceptionCode.DEAL_FAILED.getMessage();
+                msg = BizExceptionCode.DEAL_FAILED.getMessage();
                 errorMsg.append(String.format(msg, base.getCode(), e.getMessage()));
             }
         }

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

@@ -328,13 +328,21 @@ public class SaleServiceImpl implements SaleService{
                 baseDTOs.getBaseDTOs().size() == 0) {
             return;
         }
-      /*  String msg = saleMapper.validateBatchUnAudit(baseDTOs.getBaseDTOs());
+        //存在未审核单据,单据编号:XXXX
+        String msg = saleMapper.validateBatchUnAudit(baseDTOs.getBaseDTOs());
         if (null != msg) {
-            String message = BizExceptionCode.SALE_ORDER_HASAUDIT.getMessage();
-            int code = BizExceptionCode.SALE_ORDER_HASAUDIT.getCode();
+            String message = BizExceptionCode.SALE_ORDER_ISUNAUDIT.getMessage();
+            int code = BizExceptionCode.SALE_ORDER_ISUNAUDIT.getCode();
+            throw new BizException(code, String.format(message, msg));
+        }
+        //存在已关闭单据,单据编号:XXXX
+        msg = saleMapper.validateClose(baseDTOs.getBaseDTOs());
+        if (null != msg) {
+            String message = BizExceptionCode.SALE_ORDER_ISCOLSED.getMessage();
+            int code = BizExceptionCode.SALE_ORDER_ISCOLSED.getCode();
             throw new BizException(code, String.format(message, msg));
         }
-        saleMapper.BatchcheckSendStatus();*/
+        //saleMapper.BatchcheckSendStatus();
         for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
             unAudit(base.getId());
         }

+ 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"/>

+ 11 - 6
applications/sale/sale-server/src/main/resources/mapper/ProdInOutMapper.xml

@@ -494,31 +494,36 @@
     select count(1) from prodinout where pi_inoutno = #{code} and pi_id != #{id}
   </select>
   <select id="validateUnAudit" parameterType="long" resultType="java.lang.String">
-    select pi_inoutno from prodinout where pi_id = #{id} and IFNULL(pi_statuscode,'UNAUDITED')!='AUDITED'
+    select pi_inoutno from prodinout where pi_id = #{id} and IFNULL(pi_statuscode,' ')!='AUDITED'
   </select>
   <select id="validateAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
-    select GROUP_CONCAT(pi_inoutno) from prodinout where pi_statuscode='AUDITED' and pi_id in
+    select GROUP_CONCAT(pi_inoutno) from prodinout where IFNULL(pi_statuscode,' ')='AUDITED' and pi_id in
+    <foreach collection="list" item="item" open="(" close=")" separator=",">
+      #{item.id}
+    </foreach>
+  </select>
+  <select id="validateClose" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
+    select GROUP_CONCAT(pi_inoutno) from prodinout where IFNULL(pi_statuscode,' ')='CLOSE' and pi_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
       #{item.id}
     </foreach>
   </select>
-
   <select id="validateBatchUnAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
-    select GROUP_CONCAT(pi_inoutno) from prodinout where pi_statuscode='UNAUDITED' and pi_id in
+    select GROUP_CONCAT(pi_inoutno) from prodinout where IFNULL(pi_statuscode,' ')='UNAUDITED' and pi_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
       #{item.id}
     </foreach>
   </select>
 
   <select id="validateBatchClose" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
-    select GROUP_CONCAT(pi_inoutno) from prodinout where pi_statuscode!='AUDITED' and pi_id in
+    select GROUP_CONCAT(pi_inoutno) from prodinout where IFNULL(pi_statuscode,' ')!='AUDITED' and pi_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
       #{item.id}
     </foreach>
   </select>
 
   <select id="validateBatchOpen" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
-    select GROUP_CONCAT(pi_inoutno) from prodinout where pi_statuscode!='CLOSE' and pi_id in
+    select GROUP_CONCAT(pi_inoutno) from prodinout where IFNULL(pi_statuscode,' ')!='CLOSE' and pi_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
       #{item.id}
     </foreach>

+ 7 - 2
applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml

@@ -356,7 +356,12 @@
       #{item.id}
     </foreach>
   </select>
-
+  <select id="validateClose" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
+      select GROUP_CONCAT(sa_code) from sale where IFNULL(sa_sendstatuscode,' ')='CLOSE' and sa_id in
+    <foreach collection="list" item="item" open="(" close=")" separator=",">
+      #{item.id}
+    </foreach>
+  </select>
   <select id="validateCustAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
     select GROUP_CONCAT(sa_code) from sale left join customer on cu_id=sa_custid  where sa_statuscode='AUDITED' and sa_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
@@ -364,7 +369,7 @@
     </foreach>
   </select>
   <select id="validateBatchUnAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
-    select GROUP_CONCAT(sa_code) from sale where sa_statuscode='UNAUDITED' and sa_id in
+    select GROUP_CONCAT(sa_code) from sale where IFNULL(sa_statuscode,'UNAUDITED') = 'UNAUDITED' and sa_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
       #{item.id}
     </foreach>

+ 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 - 1
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java

@@ -45,6 +45,16 @@ public class CompanyRspDTO implements Serializable {
 
     private String adminEmail;
 
+    private String adminMobile;
+
+    public String getAdminMobile() {
+        return adminMobile;
+    }
+
+    public void setAdminMobile(String adminMobile) {
+        this.adminMobile = adminMobile;
+    }
+
     public String getAdminEmail() {
         return adminEmail;
     }
@@ -149,7 +159,7 @@ public class CompanyRspDTO implements Serializable {
         this.default_ = default_;
     }
 
-    public CompanyRspDTO(String name, String businessCode, String address, boolean default_, boolean saas_, String uu, String admin, Long adminId, String type) {
+    public CompanyRspDTO(String name, String businessCode, String address, boolean default_, boolean saas_, String uu, String admin, Long adminId, String type, String adminMobile) {
         this.name = name;
         this.businessCode = businessCode;
         this.address = address;
@@ -159,6 +169,7 @@ public class CompanyRspDTO implements Serializable {
         this.admin = admin;
         this.adminId = adminId;
         this.type = type;
+        this.adminMobile = adminMobile;
     }
 
     public CompanyRspDTO() {

+ 2 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java

@@ -167,7 +167,8 @@ public class AccountCenterServiceImpl implements AccountCenterService {
                         ssoUserSpace.getSpaceUU()!=null ? ssoUserSpace.getSpaceUU().toString() : "0",
                         ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getVipName() : null,
                         0L,
-                        ssoUserSpace.getProfession()
+                        ssoUserSpace.getProfession(),
+                        ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getMobile() : null
                 );
                 resultList.add(companyRspDTO);
             }

+ 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"/>

+ 1 - 1
base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml

@@ -14,7 +14,7 @@
         delete from ac_account_company where company_id=#{companyId}
     </delete>
     <select id="getCompanyListByAccountMobile" resultType="com.usoftchina.saas.account.dto.CompanyRspDTO">
-        SELECT cmp.id,cmp.name,cmp.uu,cmp.business_code businessCode,cmp.address,accmp.is_default default_,'1' saas_,aci.realname admin,cmp.creator_id adminId,cmp.type,ac.email adminEmail from ac_company cmp
+        SELECT cmp.id,cmp.name,cmp.uu,cmp.business_code businessCode,cmp.address,accmp.is_default default_,'1' saas_,aci.realname admin,cmp.creator_id adminId,cmp.type,ac.email adminEmail,ac.mobile adminMobile from ac_company cmp
         left join ac_account_company accmp on accmp.company_id=cmp.id
         left join ac_account ac on ac.id = accmp.account_id
         left join ac_account aci on aci.id = cmp.creator_id

+ 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"/>

+ 41 - 0
frontend/saas-portal-web/build/build-dev.js

@@ -0,0 +1,41 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'development'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for development...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red('  Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+  })
+})

+ 4 - 2
frontend/saas-portal-web/build/webpack.prod.conf.js

@@ -13,7 +13,9 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
 
 const env = process.env.NODE_ENV === 'testing'
   ? require('../config/test.env')
-  : require('../config/prod.env')
+  : (process.env.NODE_ENV === 'development'
+    ? require('../config/dev.env')
+    : require('../config/prod.env'))
 
 const webpackConfig = merge(baseWebpackConfig, {
   module: {
@@ -48,7 +50,7 @@ const webpackConfig = merge(baseWebpackConfig, {
       filename: utils.assetsPath('css/[name].[contenthash].css'),
       // Setting the following option to `false` will not extract CSS from codesplit chunks.
       // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
-      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
       // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
       allChunks: true,
     }),

+ 3 - 4
frontend/saas-portal-web/config/dev.env.js

@@ -6,11 +6,10 @@ module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
   BASE_URL: {
     // 前端地址
-    web: '"http://192.168.0.181"',
+    web: '"https://trade-dev.usoftchina.com:5443"',
     // 后端接口网关
-    api: '"http://192.168.0.181:8560"',
-    // api:'"http://192.168.253.31:8560"',
+    api: '"https://saas-api-dev.usoftchina.com:5443"',
     // 账户中心接口
-    sso: '"http://192.168.253.12:32323"'
+    sso: '"https://sso-dev.usoftchina.com:5443"'
   }
 })

+ 2 - 2
frontend/saas-portal-web/config/test.env.js

@@ -6,9 +6,9 @@ module.exports = merge(devEnv, {
   NODE_ENV: '"testing"',
   BASE_URL: {
     // 前端地址
-    web: '"https://trade-dev.usoftchina.com:5443"',
+    web: '"https://trade-test.usoftchina.com:5443"',
     // 后端接口网关
-    api: '"https://saas-api-dev.usoftchina.com:5443"',
+    api: '"https://saas-api-test.usoftchina.com:5443"',
     // 账户中心接口
     sso: '"https://sso-dev.usoftchina.com:5443"'
   }

+ 2 - 1
frontend/saas-portal-web/package.json

@@ -11,7 +11,8 @@
     "e2e": "node test/e2e/runner.js",
     "test": "npm run unit && npm run e2e",
     "build": "node build/build.js",
-    "build-test": "node build/build-test.js"
+    "build-test": "node build/build-test.js",
+    "build-dev": "node build/build-dev.js"
   },
   "dependencies": {
     "axios": "^0.18.0",

+ 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");
         }
     });
 

+ 19 - 4
frontend/saas-web/app.json

@@ -306,12 +306,27 @@
      * Settings specific to testing builds.
      */
     "testing": {
+        "output": {
+            "appCache": {
+                "enable": true,
+                "path": "cache.appcache"
+            }
+        },
+        "loader": {
+            "cache": "${build.timestamp}"
+        },
+        "cache": {
+            "enable": true
+        },
+        "compressor": {
+            "type": "yui"
+        },
         "server": {
-            "accountCenter":"http://192.168.0.181:8000",
-            "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
+            "accountCenter": "https://saas-test.usoftchina.com:5443",
+            "accountEnterprise": "https://saas-test.usoftchina.com:5443/#/enterprise",
             "basePath": {
-                "https": "https://saas-api-dev.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8560"
+                "https": "https://saas-api-test.usoftchina.com:5443",
+                "http": "http://192.168.0.181:8575"
             },
             "urlPattern": "^\/api\/"
         }

+ 12 - 0
frontend/saas-web/app/view/core/dbfind/DbfindGridPanel.js

@@ -27,6 +27,18 @@ Ext.define('saas.view.core.dbfind.DbfindGridPanel', {
                         type: 'json',
                         rootProperty: 'data.list',
                         totalProperty: 'data.total',
+                    },
+                    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);
+                            }
+                        }
                     }
                 },
                 listeners: {

+ 12 - 0
frontend/saas-web/app/view/core/dbfind/MultiDbfindGridPanel.js

@@ -66,6 +66,18 @@ Ext.define('saas.view.core.dbfind.MultiDbfindGridPanel', {
                         type: 'json',
                         rootProperty: 'data.list',
                         totalProperty: 'data.total',
+                    },
+                    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);
+                            }
+                        }
                     }
                 },
                 listeners: {

+ 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;

+ 2 - 2
frontend/saas-web/app/view/money/report/CustomerCheck.js

@@ -139,7 +139,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
         dataIndex: 'pd_remark',
         width: 250
     }, {
-        text: '期初应',
+        text: '期初应',
         dataIndex: 'beginamount',
         hidden: true,
         width: 0,
@@ -151,7 +151,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期款',
+        text: '本期款',
         dataIndex: 'nowpay',
         hidden: true,
         width: 0,

+ 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);
+	},
+});

+ 2 - 1
frontend/saas-web/package.json

@@ -6,8 +6,9 @@
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "dev": "sencha app watch",
+    "build-dev": "sencha app build --development",
     "build-test": "sencha app build --testing",
-    "build": "sencha app build"
+    "build": "sencha app build --production"
   },
   "keywords": [
     "saas"

+ 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>