浏览代码

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

jinsy 7 年之前
父节点
当前提交
621f473bb7
共有 100 个文件被更改,包括 2085 次插入693 次删除
  1. 2 1
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java
  2. 10 8
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/CommonController.java
  3. 36 27
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/MessageLogController.java
  4. 1 1
      applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml
  5. 2 2
      applications/commons/commons-server/src/main/resources/mapper/HomePageMapper.xml
  6. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java
  7. 18 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  8. 1 1
      applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml
  9. 13 0
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  10. 3 3
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/controller/MoneyReportColltroller.java
  11. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/CustomerCheckViewMapper.java
  12. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/VendorAcountViewMapper.java
  13. 0 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/AccountDetailsView.java
  14. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/MoneyReportService.java
  15. 61 39
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/MoneyReportServiceImpl.java
  16. 12 6
      applications/money/money-server/src/main/resources/mapper/BanksubledgerMapper.xml
  17. 1 1
      applications/money/money-server/src/main/resources/mapper/CustomerCheckViewMapper.xml
  18. 3 3
      applications/money/money-server/src/main/resources/mapper/PayablesdetailMapper.xml
  19. 2 2
      applications/money/money-server/src/main/resources/mapper/ReceivablesdetailMapper.xml
  20. 2 2
      applications/money/money-server/src/main/resources/mapper/VendorAcountViewMapper.xml
  21. 5 5
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  22. 1 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  23. 4 0
      applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/ProdInOutDTO.java
  24. 4 0
      applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/ProdInOutListDTO.java
  25. 11 3
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  26. 15 7
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  27. 4 0
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml
  28. 30 6
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutMapper.xml
  29. 4 4
      applications/sale/sale-server/src/main/resources/mapper/SaledetailMapper.xml
  30. 2 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/dto/ProdInOutDTO.java
  31. 2 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/dto/ProdInOutListDTO.java
  32. 4 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOut.java
  33. 4 1
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java
  34. 9 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountAddDTO.java
  35. 10 0
      base-servers/account/account-server/pom.xml
  36. 51 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  37. 6 16
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java
  38. 18 0
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserApi.java
  39. 61 0
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/dto/SsoAddUser.java
  40. 7 5
      base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserApiTest.java
  41. 2 1
      base-servers/sms/pom.xml
  42. 29 1
      base-servers/sms/sms-api/pom.xml
  43. 18 0
      base-servers/sms/sms-api/src/main/java/com.usoftchina.saas.sms.api/SmsApi.java
  44. 15 0
      base-servers/sms/sms-dto/pom.xml
  45. 55 0
      base-servers/sms/sms-dto/src/main/java/com/usoftchina/saas/sms/dto/SmsDTO.java
  46. 62 3
      base-servers/sms/sms-server/pom.xml
  47. 2 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/SmsApplication.java
  48. 45 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/config/SmsConfig.java
  49. 32 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/controller/SmsController.java
  50. 17 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/SmsService.java
  51. 46 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/impl/SmsServiceImpl.java
  52. 79 0
      base-servers/sms/sms-server/src/main/resources/application.yml
  53. 二进制
      base-servers/sms/sms-server/src/main/resources/auth/pub.key
  54. 131 0
      base-servers/sms/sms-server/src/main/resources/logback-spring.xml
  55. 43 0
      base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/api/SmsApiTest.java
  56. 59 0
      base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/service/SmsServiceTest.java
  57. 20 0
      framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java
  58. 1 1
      frontend/saas-portal-web/src/components/conenter/addenterprise.vue
  59. 12 5
      frontend/saas-web/app/Application.scss
  60. 1 1
      frontend/saas-web/app/view/core/form/FormPanel.js
  61. 1 0
      frontend/saas-web/app/view/core/form/FormPanelController.js
  62. 1 0
      frontend/saas-web/app/view/core/form/MseeageLog.js
  63. 37 24
      frontend/saas-web/app/view/core/form/MultiCombo.js
  64. 284 267
      frontend/saas-web/app/view/core/report/ReportPanel.js
  65. 4 4
      frontend/saas-web/app/view/core/report/ReportPanelController.js
  66. 0 6
      frontend/saas-web/app/view/document/bom/FormController.js
  67. 1 1
      frontend/saas-web/app/view/document/kind/ChildForm.js
  68. 5 3
      frontend/saas-web/app/view/home/Home.js
  69. 82 21
      frontend/saas-web/app/view/home/HomeModel.js
  70. 147 0
      frontend/saas-web/app/view/home/charts/KeyData.js
  71. 111 0
      frontend/saas-web/app/view/home/charts/KeyData.scss
  72. 1 1
      frontend/saas-web/app/view/home/charts/MonthPurchase.js
  73. 1 1
      frontend/saas-web/app/view/home/infoCardList/SaleOut.js
  74. 2 2
      frontend/saas-web/app/view/main/Main.scss
  75. 2 2
      frontend/saas-web/app/view/main/MainController.js
  76. 1 1
      frontend/saas-web/app/view/main/MainModel.js
  77. 79 25
      frontend/saas-web/app/view/money/report/OtherIODetail.js
  78. 31 2
      frontend/saas-web/app/view/money/report/PayDetail.js
  79. 31 2
      frontend/saas-web/app/view/money/report/RecDetail.js
  80. 15 0
      frontend/saas-web/app/view/money/report/TotalPayDetail.js
  81. 15 0
      frontend/saas-web/app/view/money/report/TotalRecDetail.js
  82. 1 1
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  83. 1 1
      frontend/saas-web/app/view/purchase/purchaseIn/QueryPanel.js
  84. 3 2
      frontend/saas-web/app/view/purchase/purchaseOut/QueryPanel.js
  85. 8 3
      frontend/saas-web/app/view/sale/sale/QueryPanel.js
  86. 4 4
      frontend/saas-web/app/view/sale/saleIn/QueryPanel.js
  87. 1 1
      frontend/saas-web/app/view/sale/saleOut/QueryPanel.js
  88. 17 2
      frontend/saas-web/app/view/stock/report/DataList.js
  89. 2 0
      frontend/saas-web/app/view/stock/report/Prodiodetail.js
  90. 1 1
      frontend/saas-web/app/view/sys/guide/FormPanel.js
  91. 2 1
      frontend/saas-web/app/view/sys/power/FormPanel.js
  92. 3 9
      frontend/saas-web/app/view/sys/power/GroupGrid.js
  93. 5 4
      frontend/saas-web/ext/packages/ux/src/feature/MySummary.js
  94. 2 2
      frontend/saas-web/ext/packages/ux/src/feature/MySummary.scss
  95. 0 112
      frontend/saas-web/overrides/grid/buffer/BufferedRenderer.js
  96. 0 26
      frontend/saas-web/overrides/grid/column/Widget.js
  97. 30 0
      frontend/saas-web/overrides/grid/feature/Grouping.js
  98. 60 0
      frontend/saas-web/overrides/ux/TabCloseMenu.js
  99. 1 1
      frontend/saas-web/package.json
  100. 二进制
      frontend/saas-web/resources/images/auth-background.jpg

+ 2 - 1
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java

@@ -36,7 +36,8 @@ public class ListReqDTO implements Serializable {
                     JSONObject obj = (JSONObject) jsonArray.get(i);
                     field = obj.get("field");
                     operation = obj.get("operation");
-                    if (null != field && null != operation && !"".equals(field) && !"".equals(operation)) {
+                    //
+                    if (null != field && null != operation && !"".equals(field) && !"".equals(operation) && !operation.toString().startsWith("customize")) {
                         fieldSql = new StringBuilder("'{");
                         fieldSql.append("\"" + field + "\":'");
                         fieldSql.append(",");

+ 10 - 8
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/CommonController.java

@@ -30,26 +30,28 @@ public class CommonController {
     }
 
     @PostMapping("/action/audit")
-    public DeferredResult commonAudit(@RequestParam("table") String table, @RequestParam("keyvalue") String keyvalue, @RequestParam("status") String status,
+    public void commonAudit(@RequestParam("table") String table, @RequestParam("keyvalue") String keyvalue, @RequestParam("status") String status,
                                       @RequestParam("statuscode") String statuscode, @RequestParam("auditdate") String auditdate, @RequestParam("auditman") String auditman) {
 
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> commonService.commonAudit(table, keyvalue, status, statuscode, auditdate, auditman))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        commonService.commonAudit(table, keyvalue, status, statuscode, auditdate, auditman);
     }
 
     @PostMapping("/action/resAudit")
-    public DeferredResult commonResAudit(@RequestParam("table") String table, @RequestParam("keyvalue") String keyvalue, @RequestParam("status") String status,
+    public void commonResAudit(@RequestParam("table") String table, @RequestParam("keyvalue") String keyvalue, @RequestParam("status") String status,
                                       @RequestParam("statuscode") String statuscode, @RequestParam("auditdate") String auditdate, @RequestParam("auditman") String auditman) {
 
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+       /* DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> commonService.commonResAudit(table, keyvalue, status, statuscode, auditdate, auditman))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        commonService.commonResAudit(table, keyvalue, status, statuscode, auditdate, auditman);
     }
 
-    @GetMapping("/timeout/test")
+    /*@GetMapping("/timeout/test")
     public void timeout(@RequestParam("time") Long time){
         try {
             System.out.println("进入时间:" + time);
@@ -58,5 +60,5 @@ public class CommonController {
         }catch (Exception e){
             e.printStackTrace();
         }
-    }
+    }*/
 }

+ 36 - 27
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/MessageLogController.java

@@ -38,75 +38,83 @@ public class MessageLogController {
     }
 
     @RequestMapping("/save")
-    public DeferredResult<String> save(@RequestBody DocBaseDTO baseDTO) {
+    public void save(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+       /* DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.save(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.save(baseDTO);
     }
 
     @RequestMapping("/update")
-    public DeferredResult<String> update(@RequestBody DocBaseDTO baseDTO) {
+    public void update(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+       /* DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.update(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.update(baseDTO);
     }
 
     @RequestMapping("/delete")
-    public DeferredResult<String> delete(@RequestBody DocBaseDTO baseDTO) {
+    public void delete(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.delete(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.delete(baseDTO);
     }
 
     @RequestMapping("/deleteDetail")
-    public DeferredResult<String> deleteDetail(@RequestBody DocBaseDTO baseDTO) {
+    public void deleteDetail(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.deleteDetail(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.deleteDetail(baseDTO);
     }
 
     @RequestMapping("/audit")
-    public DeferredResult<String> audit(@RequestBody DocBaseDTO baseDTO) {
+    public void audit(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.audit(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.audit(baseDTO);
     }
 
     @RequestMapping("/unAudit")
-    public DeferredResult<String> unAudit(@RequestBody DocBaseDTO baseDTO) {
+    public void unAudit(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.unAudit(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.unAudit(baseDTO);
     }
 
     @RequestMapping("/close")
-    public DeferredResult<String> close(@RequestBody DocBaseDTO baseDTO) {
+    public void close(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.close(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.close(baseDTO);
     }
 
     @RequestMapping("/open")
-    public DeferredResult<String> open(@RequestBody DocBaseDTO baseDTO) {
+    public void open(@RequestBody DocBaseDTO baseDTO) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         CompletableFuture.supplyAsync(() -> messageLogService.open(baseDTO))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.open(baseDTO);
     }
 
     /**
@@ -117,12 +125,13 @@ public class MessageLogController {
     * @Date: 2018/10/25
     */
     @RequestMapping("/customizeLog")
-    public DeferredResult<String> customizeLog(@RequestBody DocBaseDTO baseDTO, @RequestParam Operation operation) {
+    public void customizeLog(@RequestBody DocBaseDTO baseDTO, @RequestParam Operation operation) {
         // Create the deferredResult and initiate a callback object, task, with it
-        DeferredResult<String> deferredResult = new DeferredResult<>();
+        /*DeferredResult<String> deferredResult = new DeferredResult<>();
         System.out.println(operation.getTitle() + "  : " + operation.getResult());
         CompletableFuture.supplyAsync(() -> messageLogService.customizeLog(baseDTO, operation))
                 .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
-        return deferredResult;
+        return deferredResult;*/
+        messageLogService.customizeLog(baseDTO, operation);
     }
 }

+ 1 - 1
applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml

@@ -8,7 +8,7 @@
     </parameterMap>
 
     <select id="selectPeriod" resultType="string">
-        select PD_DETNO from periodsdetail where companyid=#{companyId} and pd_status=0 order by PD_DETNO LIMIT 1;
+        select PD_DETNO from periodsdetail where companyid=#{companyId} and pd_detno is not null and pd_status=0 order by PD_DETNO LIMIT 1;
     </select>
     <select id="selectUnPeriod" resultType="string">
         select PD_DETNO from periodsdetail where companyid=#{companyId} and pd_status=99 order by PD_DETNO desc LIMIT 1;

+ 2 - 2
applications/commons/commons-server/src/main/resources/mapper/HomePageMapper.xml

@@ -67,11 +67,11 @@
     <select id="getSaleData" parameterType="long" resultType="string">
       select concat('[',five,',',other,']') from ((
 
-    select GROUP_CONCAT(concat('{"x":"',si_custname,'","y":',IFNULL(round(si_amount/10000,2),0),'}')) five from (
+    select GROUP_CONCAT(concat('{"x":"',si_custname,'","y":',IFNULL(round(si_amount/10000,2),0),',"z":"',ifnull(si_custshortname,''),'"}')) five from (
     select * from statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE' ORDER BY si_amount desc limit 0,5
     ) c)d,(
 
-    select concat('{"x":"其它","y":',ifnull(round((all_sum - five_sum)/10000,2),0),'}') other from ( (select sum(si_amount) all_sum from statsinfo  where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE')a,
+    select concat('{"x":"其它","y":',ifnull(round((all_sum - five_sum)/10000,2),0),',"z":"其它"}') other from ( (select sum(si_amount) all_sum from statsinfo  where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE')a,
     ( select sum(si_amount) five_sum from (select si_amount from statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE' ORDER BY si_amount desc limit 0,5)f)b))e)
     </select>
 

+ 2 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java

@@ -52,4 +52,6 @@ public interface ProductMapper extends CommonBaseMapper<Product> {
     Long selectIdByCode(@Param("code") String code, @Param("companyId") Long companyId);
 
     List<ProductReserveCostDTO> selectReserveCostByIgnoreWarehouse(@Param("con") String con, @Param("companyId") Long companyId);
+
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
 }

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

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.document.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -509,7 +510,23 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         //取分页信息
         PageInfo<ProductReserveCostDTO> pageInfo = new PageInfo<ProductReserveCostDTO>(reserveCostList);
         map.put("list", pageInfo);
-        map.put("calculate", null);
+        //替换listReqDTO中的数据
+        String calculateFields = listReqDTO.getCalculateFields().replaceAll("rc_amount", "pw_amount").replaceAll("pw_onhand", "rc_number");
+        listReqDTO.setCalculateFields(calculateFields);
+        //取对应计算数据
+        String calculateFieldsSql = listReqDTO.getCalculateFieldsSql();
+        Long companyId = BaseContextHolder.getCompanyId();
+        String condition = listReqDTO.getFinalCondition();
+        JSONArray arr = new JSONArray();
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = getMapper().selectCalculateFields(calculateFieldsSql, condition, companyId);
+            res = res.replaceAll("pw_amount", "rc_amount").replace("pw_onhand", "rc_number");
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
+        }
+        map.put("calculate", arr);
         return map;
     }
 

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

@@ -156,7 +156,7 @@
         #{cu_code,jdbcType=VARCHAR},
       </if>
       <if test="cu_shortname !=null">
-        #{cu_shortname,jdbcType=VARCHAR}
+        #{cu_shortname,jdbcType=VARCHAR},
       </if>
       <if test="cu_name != null">
         #{cu_name,jdbcType=VARCHAR},

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

@@ -491,6 +491,19 @@
         group by pr_code,pr_spec,pr_detail,pr_unit,pr_id
         ORDER BY PR_ID DESC
     </select>
+    <select id="selectCalculateFields" resultType="string">
+        select   ${fields}
+        from productWH tab left join Product on pw_prodcode=pr_code left join warehouse on pw_whid=wh_id
+        <where>
+            <if test="con != null">
+                ${con}
+            </if>
+            <if test="companyId!=null">
+                and tab.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
+                and pw_onhand!=0
+            </if>
+        </where>
+    </select>
     <select id="getCountFromPurc" resultType="int">
         SELECT COUNT(*) FROM PURCHASEDETAIL
         WHERE PD_PRODID = #{id} AND COMPANYID=#{companyId}

+ 3 - 3
applications/money/money-server/src/main/java/com/usoftchina/saas/money/controller/MoneyReportColltroller.java

@@ -80,9 +80,9 @@ public class MoneyReportColltroller {
     }
 
     //其他收支明细表
-    @GetMapping("/othrinoutdetails")
-    public Result othrinoutdetails(PageRequest page, ListReqDTO req) {
-        Map<String, Object> listData = moneyReportService.othrinoutdetails(page, req);
+    @GetMapping("/otheriodetail")
+    public Result otheriodetail(PageRequest page, ListReqDTO req) {
+        Map<String, Object> listData = moneyReportService.otheriodetail(page, req);
         return Result.success(listData);
     }
 

+ 1 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/CustomerCheckViewMapper.java

@@ -10,6 +10,6 @@ import java.util.List;
 public interface CustomerCheckViewMapper {
     List<CustomerCheckView> selectByCondition(@Param("con") String con, @Param("companyId") Long companyId);
     String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
-    VendOrCustAdd selectCustAdd(@Param("sl_custid") Integer sl_custid, @Param("cons") String cons, @Param("companyId") Long companyId);
+    List<VendOrCustAdd> selectCustAdd(@Param("sl_custid") Integer sl_custid, @Param("cons") String cons, @Param("companyId") Long companyId);
     Integer getId(@Param("code") String code, @Param("companyId") Long companyId);
 }

+ 1 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/VendorAcountViewMapper.java

@@ -9,6 +9,6 @@ import java.util.List;
 public interface VendorAcountViewMapper {
     List<VendorAcountView> selectByCondition(@Param("con")String con, @Param("companyId")Long companyId);
     String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
-    VendOrCustAdd selectVendAdd(@Param("sl_vendid") Integer sl_vendid, @Param("cons") String cons, @Param("companyId") Long companyId);
+    List<VendOrCustAdd> selectVendAdd(@Param("sl_vendid") Integer sl_vendid, @Param("cons") String cons, @Param("companyId") Long companyId);
     Integer getId(@Param("code") String code, @Param("companyId") Long companyId);
 }

+ 0 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/po/AccountDetailsView.java

@@ -9,7 +9,6 @@ public class AccountDetailsView {
 
     private String ve_name;
     private String cu_name;
-
     private Double sl_amount;
 
     private Integer pb_id;

+ 1 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/MoneyReportService.java

@@ -19,6 +19,6 @@ public interface MoneyReportService {
     Map<String, Object> accountdetails(PageRequest page, ListReqDTO req);
     Map<String, Object> vendormonthdetails(PageRequest page, ListReqDTO req);
     Map<String, Object> custormonthdetails(PageRequest page, ListReqDTO req);
-    Map<String, Object> othrinoutdetails(PageRequest page, ListReqDTO req);
+    Map<String, Object> otheriodetail(PageRequest page, ListReqDTO req);
     Map<String, Object> profitdetails(PageRequest page, ListReqDTO req);
 }

+ 61 - 39
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/MoneyReportServiceImpl.java

@@ -41,6 +41,8 @@ public class MoneyReportServiceImpl implements MoneyReportService {
     private VendmonthMapper vendmonthMapper;
     @Autowired
     private CustmonthMapper custmonthMapper;
+    @Autowired
+    private BanksubledgerMapper banksubledgerMapper;
 
     @Override
     public Map<String, Object> vendorCheck(PageRequest page, ListReqDTO req) {
@@ -83,8 +85,8 @@ public class MoneyReportServiceImpl implements MoneyReportService {
     }
 
     @Override
-    public Map<String, Object> othrinoutdetails(PageRequest page, ListReqDTO req) {
-        return getListDATA(page, req, "othrinoutdetails");
+    public Map<String, Object> otheriodetail(PageRequest page, ListReqDTO req) {
+        return getListDATA(page, req, "otheriodetail");
     }
 
     @Override
@@ -179,24 +181,32 @@ public class MoneyReportServiceImpl implements MoneyReportService {
 
                 Integer vid = new Integer(0);
                 vid = vendorAcountViewMapper.getId(vendorAcountView.getPi_vendcode(), Long.valueOf(vendorAcountView.getCompanyId()));
-                VendOrCustAdd vendOrCustAdd = vendorAcountViewMapper.selectVendAdd(vid, cons, Long.valueOf(vendorAcountView.getCompanyId()));
-                if (vendOrCustAdd != null) {
-                    //封装成list
-                    Map<String, Double> map1 = new HashMap<>();
-                    map1.put("beginamount", vendOrCustAdd.getBeginamount());
-                    list1.add(map1);
-
-                    Map<String, Double> map2 = new HashMap<>();
-                    map2.put("nowamount", vendOrCustAdd.getNowamount());
-                    list1.add(map2);
-
-                    Map<String, Double> map3 = new HashMap<>();
-                    map3.put("nowpay", vendOrCustAdd.getNowpay());
-                    list1.add(map3);
-
-                    Map<String, Double> map4 = new HashMap<>();
-                    map4.put("nowbalance", vendOrCustAdd.getNowbalance());
-                    list1.add(map4);
+                List<VendOrCustAdd> vendOrCustAdds = vendorAcountViewMapper.selectVendAdd(vid, cons, Long.valueOf(vendorAcountView.getCompanyId()));
+                //封装成list
+                Map<String, Double> map1 = new HashMap<>();
+                map1.put("beginamount", new Double(0));
+                Map<String, Double> map2 = new HashMap<>();
+                map2.put("nowamount", new Double(0));
+                Map<String, Double> map3 = new HashMap<>();
+                map3.put("nowpay", new Double(0));
+                Map<String, Double> map4 = new HashMap<>();
+                map4.put("nowbalance", new Double(0));
+                if (vendOrCustAdds != null) {
+                    Iterator vlist = vendOrCustAdds.iterator();
+                    while (vlist.hasNext()) {
+                        VendOrCustAdd vendOrCustAdd = (VendOrCustAdd) vlist.next();
+                        map1.put("beginamount", vendOrCustAdd.getBeginamount() == null ? new Double(0) : vendOrCustAdd.getBeginamount());
+                        list1.add(map1);
+
+                        map2.put("nowamount", vendOrCustAdd.getNowamount() == null ? new Double(0) : vendOrCustAdd.getNowamount() + map2.get("nowamount"));
+                        list1.add(map2);
+
+                        map3.put("nowpay", vendOrCustAdd.getNowpay() == null ? new Double(0) : vendOrCustAdd.getNowpay() + map3.get("nowpay"));
+                        list1.add(map3);
+
+                        map4.put("nowbalance", map1.get("beginamount") +  map2.get("nowamount") - map3.get("nowpay"));
+                        list1.add(map4);
+                    }
                 }
             }
         } else if("payDetail".equals(type)){
@@ -224,24 +234,32 @@ public class MoneyReportServiceImpl implements MoneyReportService {
                 Integer vid = new Integer(0);
 
                 vid = customerCheckViewMapper.getId(customerCheckView.getPi_custcode(), Long.valueOf(customerCheckView.getCompanyId()));
-                VendOrCustAdd vendOrCustAdd = customerCheckViewMapper.selectCustAdd(vid, cons, Long.valueOf(customerCheckView.getCompanyId()));
-                if (vendOrCustAdd != null) {
-                    //封装成list
-                    Map<String, Double> map1 = new HashMap<>();
-                    map1.put("beginamount", vendOrCustAdd.getBeginamount());
-                    list1.add(map1);
-
-                    Map<String, Double> map2 = new HashMap<>();
-                    map2.put("nowamount", vendOrCustAdd.getNowamount());
-                    list1.add(map2);
-
-                    Map<String, Double> map3 = new HashMap<>();
-                    map3.put("nowpay", vendOrCustAdd.getNowpay());
-                    list1.add(map3);
-
-                    Map<String, Double> map4 = new HashMap<>();
-                    map4.put("nowbalance", vendOrCustAdd.getNowbalance());
-                    list1.add(map4);
+                List<VendOrCustAdd> vendOrCustAdds = customerCheckViewMapper.selectCustAdd(vid, cons, Long.valueOf(customerCheckView.getCompanyId()));
+                //封装成list
+                Map<String, Double> map1 = new HashMap<>();
+                map1.put("beginamount", new Double(0));
+                Map<String, Double> map2 = new HashMap<>();
+                map2.put("nowamount", new Double(0));
+                Map<String, Double> map3 = new HashMap<>();
+                map3.put("nowpay", new Double(0));
+                Map<String, Double> map4 = new HashMap<>();
+                map4.put("nowbalance", new Double(0));
+                if (vendOrCustAdds != null) {
+                    Iterator vlist = vendOrCustAdds.iterator();
+                    while (vlist.hasNext()) {
+                        VendOrCustAdd vendOrCustAdd = (VendOrCustAdd) vlist.next();
+                        map1.put("beginamount", vendOrCustAdd.getBeginamount() == null ? new Double(0) : vendOrCustAdd.getBeginamount());
+                        list1.add(map1);
+
+                        map2.put("nowamount", vendOrCustAdd.getNowamount() == null ? new Double(0) : vendOrCustAdd.getNowamount() + map2.get("nowamount"));
+                        list1.add(map2);
+
+                        map3.put("nowpay", vendOrCustAdd.getNowpay() == null ? new Double(0) : vendOrCustAdd.getNowpay() + map3.get("nowpay"));
+                        list1.add(map3);
+
+                        map4.put("nowbalance", map1.get("beginamount") +  map2.get("nowamount") - map3.get("nowpay"));
+                        list1.add(map4);
+                    }
                 }
             }
         }else if ("accountdetails".equals(type)){
@@ -253,9 +271,13 @@ public class MoneyReportServiceImpl implements MoneyReportService {
             list = vendmonthMapper.selectByCondition(con, companyId);
             res = null;
         }else if ("custormonthdetails".equals(type)){
-            System.out.println("companyid"+companyId);
             list = custmonthMapper.selectByCondition(con, companyId);
             res = null;
+        }else if ("otheriodetail".equals(type)){
+            list = banksubledgerMapper.selectByCondition(con, companyId);
+            if (!StringUtils.isEmpty(calculateFieldsSql)) {
+                res = banksubledgerMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            }
         }
 
         try {

+ 12 - 6
applications/money/money-server/src/main/resources/mapper/BanksubledgerMapper.xml

@@ -455,27 +455,33 @@
 
 
     <select id="selectByCondition" resultMap="BaseResultMap">
-        select  bl_date, bl_code, bl_kind,bl_bankcode,bl_bankid, bl_bankname, bl_income, bl_spending, bl_assname, bl_remark
-        from banksubledger
+        select *
+        from
+        (select  bl_date, bl_code, bl_kind,bl_bankcode,bl_bankid, bl_bankname, bl_income, bl_spending, bl_assname, bl_remark, companyid
+        from banksubledger where bl_kind in ('其他收入单', '其他支出单'))a
         <where>
             <if test="con != null">
-                ${con}
+            ${con}
             </if>
             <if test="companyId != null">
-                and  companyId = #{companyId} and bl_kind = '其他支出单' or bl_kind = '其他收入单'
+            and  companyId = #{companyId}
             </if>
         </where>
         order by bl_bankname asc, bl_date desc,bl_bankcode desc
     </select>
 
     <select id="selectCalculateFields" resultType="string">
-        select   ${fields}  from banksubledger
+--         select   ${fields}  from banksubledger
+        select ${fields}
+        from
+        (select  bl_date, bl_code, bl_kind,bl_bankcode,bl_bankid, bl_bankname, bl_income, bl_spending, bl_assname, bl_remark, companyid
+        from banksubledger where bl_kind in ('其他收入单', '其他支出单'))a
         <where>
             <if test="con != null">
                 ${con}
             </if>
             <if test="companyId != null">
-                and  companyId = #{companyId} and bl_kind = '其他支出单' or bl_kind = '其他收入单'
+                and  companyId = #{companyId}
             </if>
         </where>
     </select>

+ 1 - 1
applications/money/money-server/src/main/resources/mapper/CustomerCheckViewMapper.xml

@@ -58,7 +58,7 @@
     left join (select sum(sl_amount) as nowamount,sum(sl_preamount) as nowpay,sl_custid,sl_date from subledger where sl_kind !='期初余额'
     group by sl_custid,sl_date) b
     on a.sl_custid=b.sl_custid
-    where a.sl_custid=#{sl_custid} and ${cons} and a.companyid = #{companyId} limit 1
+    where a.sl_custid=#{sl_custid} and ${cons} and a.companyid = #{companyId}
   </select>
 
     <select id="getId" resultType="java.lang.Integer">

+ 3 - 3
applications/money/money-server/src/main/resources/mapper/PayablesdetailMapper.xml

@@ -33,10 +33,10 @@
         ${con}
       </if>
       <if test="companyId != null">
-        and  companyId = #{companyId} and pd_query =1
+        and  companyId = #{companyId} and pd_query =1 and (pd_addpay + pd_addpre + pd_remain) != 0
       </if>
     </where>
-    order by pd_vendname asc, pd_detno desc, pd_date desc
+    order by pd_vendname asc, pd_detno asc, pd_date desc
   </select>
 
   <select id="selectCalculateFields" resultType="string">
@@ -52,7 +52,7 @@
   </select>
 
   <select id="selectIdByName" resultType="long">
-    select ve_id from vendor where vc_name=#{name} and companyId=#{companyId}
+    select ve_id from vendor where ve_name=#{name} and companyId=#{companyId}
   </select>
 
   <parameterMap id="ymParamMap" type="java.util.Map">

+ 2 - 2
applications/money/money-server/src/main/resources/mapper/ReceivablesdetailMapper.xml

@@ -33,10 +33,10 @@
         ${con}
       </if>
       <if test="companyId != null">
-        and  companyId = #{companyId} and rd_query = 1
+        and  companyId = #{companyId} and rd_query = 1 and (rd_addrec + rd_addpre + rd_remain) != 0
       </if>
     </where>
-    order by rd_custname asc, rd_detno desc, rd_date desc
+    order by rd_custname asc, rd_detno asc, rd_date desc
   </select>
 
   <select id="selectCalculateFields" resultType="string">

+ 2 - 2
applications/money/money-server/src/main/resources/mapper/VendorAcountViewMapper.xml

@@ -52,7 +52,7 @@
   <resultMap id="BaseAddMap" type="com.usoftchina.saas.money.po.VendOrCustAdd" >
     <result column="beginamount" property="beginamount" jdbcType="DOUBLE" />
     <result column="nowamount" property="nowamount" jdbcType="DOUBLE" />
-    <result column="nowpay" property="beginamount" jdbcType="DOUBLE" />
+    <result column="nowpay" property="nowpay" jdbcType="DOUBLE" />
     <result column="nowbalance" property="nowbalance" jdbcType="DOUBLE" />
   </resultMap>
   <select id="selectVendAdd" resultMap="BaseAddMap">
@@ -61,7 +61,7 @@
     left join (select sum(sl_amount) as nowamount,sum(sl_preamount) as nowpay,sl_vendid,sl_date from subledger where sl_kind !='期初余额'
     group by sl_vendid,sl_date) b
     on a.sl_vendid=b.sl_vendid
-    where a.sl_vendid=#{sl_vendid} and ${cons} and a.companyid = #{companyId} limit 1
+    where a.sl_vendid=#{sl_vendid} and ${cons} and a.companyid = #{companyId}
   </select>
 
   <select id="getId" resultType="java.lang.Integer">

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

@@ -425,14 +425,14 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     public Result turnProdOut(Long id) {
         ProdInOut sourcePi = getMapper().selectByPrimaryKey(id);
         Integer count=0;
-        double pdInqty=0, pdYqty=0;
+        double pdInqty=0.0, pdYqty=0.0;
         Long userId = BaseContextHolder.getUserId();
         String userName = BaseContextHolder.getUserName();
         List<ProdIODetail> sourcePids =prodIODetailMapper.selectByFK(id);
         //检查从表
         for (ProdIODetail prodIODetail : sourcePids) {
-            pdInqty = prodIODetail.getPd_inqty();
-            pdYqty = prodIODetail.getPd_yqty();
+            pdInqty = prodIODetail.getPd_inqty() == null ? 0.0 : prodIODetail.getPd_inqty();
+            pdYqty = prodIODetail.getPd_yqty() == null ? 0.0 : prodIODetail.getPd_yqty();
             if (pdInqty-pdYqty>0){
                 count++;
             }
@@ -458,8 +458,8 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         targetPi.setPi_ioid(sourcePi.getId());
         targetPi.setPi_iocode(sourcePi.getPi_inoutno());
         //设置付款状态
-        targetPi.setPi_prstatus(Status.RECNONE.getDisplay());
-        targetPi.setPi_prstatuscode(Status.RECNONE.name());
+        targetPi.setPi_prstatus(Status.PAYNONE.getDisplay());
+        targetPi.setPi_prstatuscode(Status.PAYNONE.name());
         //设置公司id
         targetPi.setCompanyId(sourcePi.getCompanyId());
         targetPi.setCreateTime(new Date());

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

@@ -475,6 +475,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
                 prodIODetail.setUpdaterId(userId);
                 prodIODetail.setUpdateTime(new Date());
                 prodIODetail.setUpdaterName(userName);
+                prodIODetail.setPd_yqty(0.0);
                 //本次转单数
                 prodIODetail.setPd_inqty(pdQty-pdYqty);
                 prodIODetailMapper.insertSelective(prodIODetail);

+ 4 - 0
applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/ProdInOutDTO.java

@@ -72,4 +72,8 @@ public class ProdInOutDTO extends CommonBaseDTO implements Serializable {
     private String pi_auditman;
 
     private Date pi_auditdate;
+
+    private String pi_prstatuscode;
+
+    private String pi_prstatus;
 }

+ 4 - 0
applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/ProdInOutListDTO.java

@@ -132,4 +132,8 @@ public class ProdInOutListDTO extends CommonBaseDTO implements Serializable {
     private String pd_remark;
 
     private String pi_remark;
+
+    private String pi_prstatus;
+
+    private String pi_prstatuscode;
 }

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

@@ -109,8 +109,10 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         prodInOut.setPi_class(main.getPi_class());
         prodInOut.setPi_said(main.getPi_said());
         prodInOut.setPi_sacode(main.getPi_sacode());
-
         prodInOut.setPi_remark(main.getPi_remark());
+
+        prodInOut.setPi_prstatus(prodInOut.getPi_prstatus()==null?Status.RECNONE.getDisplay():prodInOut.getPi_prstatus() );
+        prodInOut.setPi_prstatuscode(prodInOut.getPi_printstatuscode()==null?Status.RECNONE.name():prodInOut.getPi_printstatuscode());
         //判断更新与保存动作
         if (StringUtils.isEmpty(pi_id) || "0".equals(pi_id.toString())){
             //插入操作
@@ -423,8 +425,8 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     @Override
     public DocBaseDTO turnProdin(Long id) {
         Integer count=0;
-        double pdOutqty=0;
-        double pdYqty=0;
+        double pdOutqty=0.0;
+        double pdYqty=0.0;
         double pdSendPrice = 0.0;
         double pdTaxrate = 0.0;
         DocBaseDTO baseDTO = new DocBaseDTO();
@@ -476,6 +478,12 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         targetPi.setPi_said(sourcePi.getPi_said());
         targetPi.setPi_sacode(sourcePi.getPi_sacode());
         targetPi.setPi_address(sourcePi.getPi_address());
+        //收款状态
+        targetPi.setPi_prstatus(Status.PAYNONE.getDisplay());
+        targetPi.setPi_prstatuscode(Status.PAYNONE.name());
+        //来源的单号
+        targetPi.setPi_ioid(sourcePi.getId());
+        targetPi.setPi_iocode(sourcePi.getPi_inoutno());
         //保存数据
         getMapper().insertSelective(targetPi);
         //插入销售退货单从表

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

@@ -163,6 +163,7 @@ public class SaleServiceImpl implements SaleService{
                 detail.setCreatorId(userId);
                 detail.setCreatorName(BaseContextHolder.getUserName());
                 detail.setCreateTime(new Date());
+                detail.setSd_yqty(0.0);
                 insertDetails.add(detail);
             } else {
                 updateDetails.add(detail);
@@ -246,7 +247,7 @@ public class SaleServiceImpl implements SaleService{
     }
 
     @Transactional
-    private void singleAudit(Long id) {
+    public void singleAudit(Long id) {
         Integer integer = saleMapper.checkCustomer(id);
         if (integer > 0) {
             throw new BizException(BizExceptionCode.SALE_CUST_CLOSE);
@@ -377,12 +378,13 @@ public class SaleServiceImpl implements SaleService{
         //部分入库、全部入库
         int partTurnCount = 0,turnCount = 0;
         if(saleDetailList != null && saleDetailList.size() > 0){
+            Double yqty = 0.0;
             for(SaleDetail saleDetail : saleDetailList){
-                //
-                if(saleDetail.getSd_yqty() >= saleDetail.getSd_qty()){
+                yqty = saleDetail.getSd_yqty() == null ? 0.0 : saleDetail.getSd_yqty();
+                if(yqty >= saleDetail.getSd_qty()){
                     turnCount++;
 
-                }else if(saleDetail.getSd_yqty() > 0 && saleDetail.getSd_yqty() < saleDetail.getSd_qty()){
+                }else if(yqty > 0 && yqty < saleDetail.getSd_qty()){
                     //     0 < 入库数 < 采购数
                     partTurnCount++;
                 }
@@ -431,8 +433,8 @@ public class SaleServiceImpl implements SaleService{
 
         //检查从表
         for (SaleDetail detail : details) {
-            pdQty = detail.getSd_qty();
-            pdYqty = detail.getSd_yqty();
+            pdQty = detail.getSd_qty()==null?0.0:detail.getSd_qty();
+            pdYqty = detail.getSd_yqty() == null ? 0 : detail.getSd_yqty();
             if (pdQty - pdYqty > 0){
                 count++;
             }
@@ -462,6 +464,8 @@ public class SaleServiceImpl implements SaleService{
         prodInOut.setCompanyId(companyId);
         prodInOut.setPi_address(sale.getSa_toplace());
 
+        prodInOut.setPi_prstatus(Status.RECNONE.getDisplay());
+        prodInOut.setPi_prstatuscode(Status.RECNONE.name());
         prodInOutMapper.insertSelective(prodInOut);
         //插入出货单从表
         long pi_id = prodInOut.getId();
@@ -482,8 +486,12 @@ public class SaleServiceImpl implements SaleService{
             prodIODetail.setPd_taxrate(saleDetail.getSd_taxrate());
             //公司id
             prodIODetail.setCompanyId(companyId);
+            //如果已转数等于转单数量 不处理该单据
+            if (saleDetail.getSd_qty() - (saleDetail.getSd_yqty() == null ? 0 : saleDetail.getSd_yqty()) == 0) {
+                continue;
+            }
             //本次转单数
-            prodIODetail.setPd_outqty(saleDetail.getSd_qty() - saleDetail.getSd_yqty());
+            prodIODetail.setPd_outqty(saleDetail.getSd_qty() - (saleDetail.getSd_yqty() == null ? 0 : saleDetail.getSd_yqty()));
             //获取物料默认仓库
             Map<String, Object> warehouse = getWareHouseByCode(saleDetail.getSd_prodcode());
             if (null != warehouse) {

+ 4 - 0
applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml

@@ -72,6 +72,8 @@
     <result column="pi_prstatus" jdbcType="VARCHAR" property="pi_prstatus" />
     <result column="pi_prstatuscode" jdbcType="VARCHAR" property="pi_prstatuscode" />
     <result column="pd_ordertotal" jdbcType="DOUBLE" property="pd_ordertotal" />
+    <result column="pi_ioid" jdbcType="INTEGER" property="pi_ioid" />
+    <result column="pi_iocode" jdbcType="VARCHAR" property="pi_iocode" />
   </resultMap>
 
   <resultMap id="homePageList" type="com.usoftchina.saas.sale.po.ProdHomePageList">
@@ -103,6 +105,8 @@
     <result column="pi_auditman" jdbcType="VARCHAR" property="pi_auditman" />
     <result column="pi_address" jdbcType="VARCHAR" property="pi_address" />
     <result column="pi_remark" jdbcType="VARCHAR" property="pi_remark" />
+    <result column="pi_prstatus" jdbcType="VARCHAR" property="pi_prstatus" />
+    <result column="pi_prstatuscode" jdbcType="VARCHAR" property="pi_prstatuscode" />
     <result column="pd_piid" jdbcType="INTEGER" property="pd_piid" />
     <result column="pd_inoutno" jdbcType="VARCHAR" property="pd_inoutno" />
     <result column="pd_piclass" jdbcType="VARCHAR" property="pd_piclass" />

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

@@ -35,6 +35,8 @@
     <result column="pi_remark" jdbcType="VARCHAR" property="pi_remark" />
     <result column="pi_iocode" jdbcType="VARCHAR" property="pi_iocode" />
       <result column="pi_ioid" jdbcType="INTEGER" property="pi_ioid" />
+    <result column="pi_prstatus" jdbcType="VARCHAR" property="pi_prstatus" />
+    <result column="pi_prstatuscode" jdbcType="VARCHAR" property="pi_prstatuscode" />
   </resultMap>
   <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.usoftchina.saas.storage.po.ProdInOut">
     <result column="pi_address" jdbcType="LONGVARCHAR" property="pi_address" />
@@ -100,7 +102,7 @@
   <sql id="Base_Column_List">
     pi_id, pi_inoutno, pi_class, pi_date, pi_vendid, pi_vendcode, pi_vendname, pi_custid, 
     pi_custcode, pi_custname, pi_puid, pi_pucode, pi_said, pi_sacode, pi_total, pi_status, pi_statuscode, pi_printstatus, pi_printstatuscode,
-    companyid, updaterid, updatetime, pi_text1, pi_text2, pi_text3, pi_text4, pi_text5
+    companyid, updaterid, updatetime, pi_text1, pi_text2, pi_text3, pi_text4, pi_text5,pi_prstatus,pi_prstatuscode
   </sql>
   <sql id="Blob_Column_List">
     pi_address,pi_remark
@@ -125,7 +127,7 @@
       pi_printstatuscode, companyid, updaterid, 
       updatetime, pi_text1, pi_text2, 
       pi_text3, pi_text4, pi_text5,
-      pi_address,pi_remark)
+      pi_address,pi_remark,pi_prstatus,pi_prstatuscode)
     values (#{pi_id,jdbcType=INTEGER}, #{pi_inoutno,jdbcType=VARCHAR}, #{pi_class,jdbcType=VARCHAR}, 
       #{pi_date,jdbcType=TIMESTAMP}, #{pi_vendid,jdbcType=INTEGER}, #{pi_vendcode,jdbcType=VARCHAR}, 
       #{pi_vendname,jdbcType=VARCHAR}, #{pi_custid,jdbcType=INTEGER}, #{pi_custcode,jdbcType=VARCHAR}, 
@@ -136,7 +138,7 @@
       #{updatetime,jdbcType=TIMESTAMP}, #{pi_text1,jdbcType=VARCHAR}, #{pi_text2,jdbcType=VARCHAR}, 
       #{pi_text3,jdbcType=VARCHAR}, #{pi_text4,jdbcType=VARCHAR}, #{pi_text5,jdbcType=VARCHAR}, 
       #{pi_address,jdbcType=LONGVARCHAR},
-      #{pi_remark,jdbcType=LONGVARCHAR})
+      #{pi_remark,jdbcType=LONGVARCHAR}, #{pi_prstatus,jdbcType=VARCHAR}, #{pi_prstatuscode,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.usoftchina.saas.storage.po.ProdInOut">
     <selectKey resultType="java.lang.Long" keyProperty="id">
@@ -235,6 +237,12 @@
         <if test="pi_ioid != null">
             pi_ioid,
         </if>
+      <if test="pi_prstatus!=null">
+        pi_prstatus,
+      </if>
+      <if test="pi_prstatuscode!=null">
+        pi_prstatuscode,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
 
@@ -323,11 +331,17 @@
         #{pi_remark,jdbcType=LONGVARCHAR},
       </if>
       <if test="pi_iocode != null">
-        #{pi_iocode,jdbcType=LONGVARCHAR},
+        #{pi_iocode,jdbcType=VARCHAR},
       </if>
         <if test="pi_ioid != null">
             #{pi_ioid},
         </if>
+      <if test="pi_prstatus!=null">
+        #{pi_prstatus,jdbcType=VARCHAR},
+      </if>
+      <if test="pi_prstatuscode!=null">
+        #{pi_prstatuscode,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <update id="updateByPrimaryKeySelective" parameterType="com.usoftchina.saas.storage.po.ProdInOut">
@@ -417,6 +431,12 @@
       <if test="pi_remark != null">
         pi_remark = #{pi_remark,jdbcType=LONGVARCHAR},
       </if>
+      <if test="pi_prstatus!=null">
+        pi_prstatus = #{pi_prstatus,jdbcType=VARCHAR},
+      </if>
+      <if test="pi_prstatuscode!=null">
+        pi_prstatuscode = #{pi_prstatuscode,jdbcType=VARCHAR},
+      </if>
     </set>
     where pi_id = #{id,jdbcType=INTEGER}
   </update>
@@ -449,7 +469,9 @@
       pi_text4 = #{pi_text4,jdbcType=VARCHAR},
       pi_text5 = #{pi_text5,jdbcType=VARCHAR},
       pi_address = #{pi_address,jdbcType=LONGVARCHAR},
-      pi_remark = #{pi_remark,jdbcType=LONGVARCHAR}
+      pi_remark = #{pi_remark,jdbcType=LONGVARCHAR},
+      pi_prstatus= #{pi_prstatus,jdbcType=VARCHAR},
+      pi_prstatuscode= #{pi_prstatuscode,jdbcType=VARCHAR}
     where pi_id = #{pi_id,jdbcType=INTEGER}
   </update>
   <update id="updateByPrimaryKey" parameterType="com.usoftchina.saas.storage.po.ProdInOut">
@@ -481,7 +503,9 @@
       pi_text4 = #{pi_text4,jdbcType=VARCHAR},
       pi_text5 = #{pi_text5,jdbcType=VARCHAR},
       pi_address = #{pi_address,jdbcType=LONGVARCHAR},
-      pi_remark = #{pi_remark,jdbcType=LONGVARCHAR}
+      pi_remark = #{pi_remark,jdbcType=LONGVARCHAR},
+      pi_prstatus= #{pi_prstatus,jdbcType=VARCHAR},
+      pi_prstatuscode= #{pi_prstatuscode,jdbcType=VARCHAR}
     where pi_id = #{id,jdbcType=INTEGER}
   </update>
   <select id="selectCodeById" resultType="string" parameterType="long">

+ 4 - 4
applications/sale/sale-server/src/main/resources/mapper/SaledetailMapper.xml

@@ -309,11 +309,11 @@
     where sd_id = #{id,jdbcType=INTEGER}
   </update>
   <insert id="batchInsert" parameterType="java.util.List" >
-    insert into saledetail (sd_said, sd_detno,
+    insert into saledetail (sd_said, sd_detno,sd_code,
     sd_prodid, sd_prodcode, sd_qty,
     sd_price, sd_total, sd_taxrate,
     sd_netprice, sd_nettotal, sd_delivery,
-    sd_sendqty, sd_pdqty, sd_remark,
+    sd_sendqty, sd_pdqty, sd_yqty,sd_remark,
     companyId, updaterId, updateTime,
     sd_text1, sd_text2, sd_text3,
     sd_text4, sd_text5,
@@ -321,11 +321,11 @@
     values
     <foreach collection="list" item="item" index="index" open="" close="" separator=",">
       (
-      #{item.sd_said,jdbcType=INTEGER}, #{item.sd_detno,jdbcType=INTEGER},
+      #{item.sd_said,jdbcType=INTEGER}, #{item.sd_detno,jdbcType=INTEGER},#{item.sd_code,jdbcType=VARCHAR},
       #{item.sd_prodid,jdbcType=INTEGER}, #{item.sd_prodcode,jdbcType=VARCHAR}, #{item.sd_qty,jdbcType=DOUBLE},
       #{item.sd_price,jdbcType=DOUBLE}, #{item.sd_total,jdbcType=DOUBLE}, #{item.sd_taxrate,jdbcType=DOUBLE},
       #{item.sd_netprice,jdbcType=DOUBLE}, #{item.sd_nettotal,jdbcType=DOUBLE}, #{item.sd_delivery,jdbcType=TIMESTAMP},
-      #{item.sd_sendqty,jdbcType=DOUBLE}, #{item.sd_pdqty,jdbcType=DOUBLE}, #{item.sd_remark,jdbcType=VARCHAR},
+      #{item.sd_sendqty,jdbcType=DOUBLE}, #{item.sd_pdqty,jdbcType=DOUBLE}, #{item.sd_yqty,jdbcType=DOUBLE}, #{item.sd_remark,jdbcType=VARCHAR},
       #{item.companyId,jdbcType=INTEGER}, #{item.updaterId,jdbcType=INTEGER}, #{item.updateTime,jdbcType=TIMESTAMP},
       #{item.sd_text1,jdbcType=VARCHAR}, #{item.sd_text2,jdbcType=VARCHAR}, #{item.sd_text3,jdbcType=VARCHAR},
       #{item.sd_text4,jdbcType=VARCHAR}, #{item.sd_text5,jdbcType=VARCHAR},

+ 2 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/dto/ProdInOutDTO.java

@@ -72,4 +72,6 @@ public class ProdInOutDTO extends CommonBaseDTO implements Serializable {
     private String pi_remark;
 
     private Long pi_ioid;
+
+    private String pi_iocode;
 }

+ 2 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/dto/ProdInOutListDTO.java

@@ -137,4 +137,6 @@ public class ProdInOutListDTO extends CommonBaseEntity implements Serializable {
     private String pd_remark;
 
     private String pi_remark;
+
+    private String pi_iocode;
 }

+ 4 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOut.java

@@ -72,4 +72,8 @@ public class ProdInOut extends CommonBaseEntity implements Serializable {
     private Long pi_maid;
 
     private String pi_iocode;
+
+    private String pi_prstatuscode;
+
+    private String pi_prstatus;
 }

+ 4 - 1
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java

@@ -132,7 +132,6 @@ public class ProdInOutList extends CommonBaseEntity{
 
     private String pd_remark;
 
-
     private Long pd_ioid;
 
     private Date pi_auditdate;
@@ -143,6 +142,10 @@ public class ProdInOutList extends CommonBaseEntity{
 
     private String pi_remark;
 
+    private Long pi_ioid;
+
+    private String pi_iocode;
+
     //private ProductDTO productDTO;
     private Long pr_id;
     private String pr_code;

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

@@ -23,6 +23,15 @@ public class AccountAddDTO implements Serializable {
     private Integer type;
     private Long uu;
     private String roleIds;
+    private boolean hasRegister;
+
+    public boolean isHasRegister() {
+        return hasRegister;
+    }
+
+    public void setHasRegister(boolean hasRegister) {
+        this.hasRegister = hasRegister;
+    }
 
     public String getRoleIds() {
         return roleIds;

+ 10 - 0
base-servers/account/account-server/pom.xml

@@ -42,6 +42,16 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>file-dto</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-api</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <!-- db -->
         <dependency>
             <groupId>mysql</groupId>

+ 51 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java

@@ -1,7 +1,9 @@
 package com.usoftchina.saas.account.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.usoftchina.saas.account.dto.*;
 import com.usoftchina.saas.account.po.Account;
+import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.po.RoleResource;
 import com.usoftchina.saas.account.service.AccountService;
 import com.usoftchina.saas.account.service.CompanyService;
@@ -15,11 +17,15 @@ import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.sms.api.SmsApi;
+import com.usoftchina.saas.sms.dto.SmsDTO;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.RegexpUtils;
+import com.usoftchina.saas.utils.StringUtils;
 import com.usoftchina.sso.api.SsoUserApi;
-import com.usoftchina.sso.dto.SsoCheckMobile;
+import com.usoftchina.sso.api.SsoUserSpaceApi;
+import com.usoftchina.sso.dto.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -43,6 +49,12 @@ public class AccountController {
     private RoleService roleService;
     @Autowired
     private SsoUserApi ssoUserApi;
+    @Autowired
+    private SsoUserSpaceApi ssoUserSpaceApi;
+    @Autowired
+    private SmsApi smsApi;
+
+    private final String msgTemplateCode = "SMS_152288990";
 
     /**
      * 注册
@@ -115,6 +127,7 @@ public class AccountController {
      */
     @PostMapping("/register/add")
     public Result AddAccount(@RequestBody AccountAddDTO accountAddDTO) {
+        String mobile = accountAddDTO.getMobile();
         Account account = null;
         // 根据手机号、邮箱、用户名片段判断是否已注册
         boolean checked = accountService.findByUsernameOrMobileOrEmail(accountAddDTO.getUsername(), accountAddDTO.getMobile(), accountAddDTO.getEmail());
@@ -123,6 +136,43 @@ public class AccountController {
             account = BeanMapper.map(accountAddDTO, Account.class);
             account.setEnabled(true);
             accountService.save(account);
+            if (!accountAddDTO.isHasRegister()) {
+                //1.添加至优软云
+                String password = StringUtils.createInitPassword(mobile.substring(mobile.length() - 3, mobile.length()));
+                Company company = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId());
+                String companyName = company.getName();
+
+                //可能存在开通企业时UU号同步到优软云出错的情况,再重新同步一次
+                if (company.getUu() == null) {
+                    Account accountTmp = accountService.findByPrimaryKey(company.getCreatorId());
+                    ssoUserSpaceApi.registerLogin(companyName, company.getBusinessCode(), accountTmp.getUu());
+                    SsoUserSpaceList ssoUserSpaceList = ssoUserApi.getUserSpacesByMobile(accountTmp.getMobile());
+                    List<SsoUserSpace> ssoUserSpaces = ssoUserSpaceList.getSpaces();
+                    if (ssoUserSpaces.size() > 0) {
+                        for (SsoUserSpace ssoUserspace : ssoUserSpaces) {
+                            if (companyName.equals(ssoUserspace.getSpaceName())) {
+                                company.setUu(ssoUserspace.getSpaceUU());
+                                companyService.updateUUByPrimaryKey(company.getId(), ssoUserspace.getSpaceUU());
+                            }
+                        }
+                    }
+                }
+                SsoResult result = ssoUserApi.add("add", "sp", accountAddDTO.getRealname(), mobile, password, company.getUu());
+                //2.调用短信服务,将密码以短信的形式发送到用户的手机上
+                if (result.isSuccess()) {
+                    SmsDTO smsDTO = new SmsDTO();
+                    smsDTO.setMobile(mobile);
+                    smsDTO.setSignName("优软云");
+                    smsDTO.setTemplateCode(msgTemplateCode);
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("password", password);
+                    smsDTO.setTemplateParam(jsonObject.toJSONString());
+                    Result sendResult = smsApi.sendRegisterMsg(smsDTO);
+                    if (!sendResult.isSuccess()) {
+                        return sendResult;
+                    }
+                }
+            }
         }else{
             Account accountTemp = accountService.findByMobile(accountAddDTO.getMobile());
             if (accountTemp == null){

+ 6 - 16
base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java

@@ -219,8 +219,8 @@ public class AuthController {
      * @param info
      * @return
      */
-    @GetMapping("/sso/callback/{clientId}")
-    public void ssoCallback(HttpServletRequest request, HttpServletResponse response,
+    @GetMapping(value = "/sso/callback/{clientId}", produces = {"application/javascript"})
+    public String ssoCallback(HttpServletRequest request, HttpServletResponse response,
                             @PathVariable(required = false) String clientId, CookieInfo info, String callback) throws IOException{
         if (null != info && null != info.getMobile()) {
             AccountDTO accountDTO = null;
@@ -232,7 +232,7 @@ public class AuthController {
                 } else {
                     logger.error(result.getMessage());
                     ServletUtils.writeJsonPMessage(response, callback, false);
-                    return;
+                    return "successCallback({success:'0'})";
                 }
             } else {
                 accountDTO = result.getData();
@@ -243,7 +243,7 @@ public class AuthController {
                     if (!updateResult.isSuccess()) {
                         logger.error(updateResult.getMessage());
                         ServletUtils.writeJsonPMessage(response, callback, false);
-                        return;
+                        return "successCallback({success:'0'})";
                     }
                 }
             }
@@ -253,18 +253,6 @@ public class AuthController {
             authorizeLogService.save(AuthorizeLog.from(request)
                     .setAccountId(accountDTO.getId())
                     .setAppId(appId).build());
-            //将cookies
-            Cookie[] cookies = request.getCookies();
-            Cookie ssoCookies = null;
-            for (Cookie cookie : cookies) {
-                if (cookieConfig.getName().equals(cookie.getName())) {
-                    ssoCookies = cookie;
-                    break;
-                }
-            }
-            if (null != ssoCookies) {
-                response.addCookie(ssoCookies);
-            }
             // 将登录信息推送到客户端
             if (!StringUtils.isEmpty(clientId)) {
                 Long companyId = null;
@@ -278,7 +266,9 @@ public class AuthController {
                         JsonUtils.toJsonString(new AuthDTO(tokenDTO, accountDTO)));
             }
             ServletUtils.writeJsonPMessage(response, callback, true);
+            return "successCallback({success:'1'})";
         }
+        return "successCallback({success:'0'})";
     }
 
     /**

+ 18 - 0
base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserApi.java

@@ -68,6 +68,20 @@ public interface SsoUserApi {
     @RequestMapping(params = "_operate=bind", method = RequestMethod.POST)
     String bind(@RequestParam("_operate") String _operate, @RequestParam("appId") String appId, @RequestParam("userUU") Long userUU, @RequestParam("spaceUU") Long spaceUU);
 
+    /**
+     * 企业添加未注册用户
+     * @param _operate  add
+     * @param appId     应用ID
+     * @param vipName   姓名
+     * @param mobile    手机号
+     * @param password  密码
+     * @param spaceUU   公司UU
+     * @return
+     */
+    @RequestMapping(params = "_operate=add", method = RequestMethod.POST)
+    SsoResult add(@RequestParam("_operate") String _operate, @RequestParam("appId") String appId, @RequestParam("vipName") String vipName,
+                  @RequestParam("mobile") String mobile, @RequestParam("password") String password, @RequestParam("spaceUU") Long spaceUU);
+
     @Component
     class DefaultFallback implements SsoUserApi{
         @Override
@@ -95,5 +109,9 @@ public interface SsoUserApi {
             return null;
         }
 
+        @Override
+        public SsoResult add(String _operate, String appId, String vipName, String mobile, String password, Long spaceUU) {
+            return null;
+        }
     }
 }

+ 61 - 0
base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/dto/SsoAddUser.java

@@ -0,0 +1,61 @@
+package com.usoftchina.sso.dto;
+
+import java.io.Serializable;
+
+public class SsoAddUser implements Serializable {
+
+    private String _operate;
+    private String appId;
+    private Long spaceUU;
+    private String vipName;
+    private String mobile;
+    private String password;
+
+    public String get_operate() {
+        return _operate;
+    }
+
+    public void set_operate(String _operate) {
+        this._operate = _operate;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public Long getSpaceUU() {
+        return spaceUU;
+    }
+
+    public void setSpaceUU(Long spaceUU) {
+        this.spaceUU = spaceUU;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}

+ 7 - 5
base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserApiTest.java

@@ -2,10 +2,7 @@ package com.usoftchina.sso.test;
 
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.sso.api.SsoUserApi;
-import com.usoftchina.sso.dto.SsoCheckMobile;
-import com.usoftchina.sso.dto.SsoResult;
-import com.usoftchina.sso.dto.SsoUser;
-import com.usoftchina.sso.dto.SsoUserSpaceList;
+import com.usoftchina.sso.dto.*;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -13,7 +10,6 @@ import org.junit.runners.MethodSorters;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @author yingp
@@ -69,4 +65,10 @@ public class SsoUserApiTest {
         String result = ssoUserApi.bind("bind","trade-app", userUU, companyUU);
         System.out.println(result);
     }
+
+    @Test
+    public void testG_add(){
+        SsoResult result = ssoUserApi.add("add", "sp","陈炜","18702604854","123456",10050513L);
+        System.out.println(result);
+    }
 }

+ 2 - 1
base-servers/sms/pom.xml

@@ -11,10 +11,11 @@
 
     <artifactId>sms</artifactId>
     <packaging>pom</packaging>
-    <description>sms</description>
+    <description>sms server</description>
     <modules>
         <module>sms-api</module>
         <module>sms-server</module>
+        <module>sms-dto</module>
     </modules>
 
 

+ 29 - 1
base-servers/sms/sms-api/pom.xml

@@ -10,7 +10,35 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>sms-api</artifactId>
-    <description>sms api</description>
+    <description>sms service api</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form-spring</artifactId>
+        </dependency>
+    </dependencies>
 
 
 </project>

+ 18 - 0
base-servers/sms/sms-api/src/main/java/com.usoftchina.saas.sms.api/SmsApi.java

@@ -0,0 +1,18 @@
+package com.usoftchina.saas.sms.api;
+
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = "sms-server")
+public interface SmsApi {
+
+    /**
+     * 注册成功发送手机短信
+     * @param smsDTO
+     */
+    @PostMapping(value = "/msg/register")
+    Result sendRegisterMsg(@RequestBody SmsDTO smsDTO);
+}

+ 15 - 0
base-servers/sms/sms-dto/pom.xml

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

+ 55 - 0
base-servers/sms/sms-dto/src/main/java/com/usoftchina/saas/sms/dto/SmsDTO.java

@@ -0,0 +1,55 @@
+package com.usoftchina.saas.sms.dto;
+
+import java.io.Serializable;
+
+public class SmsDTO implements Serializable {
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+    /**
+     * 短信签名
+     */
+    private String signName;
+    /**
+     * 短信模板
+     */
+    private String templateCode;
+    /**
+     * 参数,用于替换模板中的变量 格式:{“name":"admin","tel":"18888888888"}
+     */
+    private String templateParam;
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getSignName() {
+        return signName;
+    }
+
+    public void setSignName(String signName) {
+        this.signName = signName;
+    }
+
+    public String getTemplateCode() {
+        return templateCode;
+    }
+
+    public void setTemplateCode(String templateCode) {
+        this.templateCode = templateCode;
+    }
+
+    public String getTemplateParam() {
+        return templateParam;
+    }
+
+    public void setTemplateParam(String templateParam) {
+        this.templateParam = templateParam;
+    }
+}

+ 62 - 3
base-servers/sms/sms-server/pom.xml

@@ -12,14 +12,28 @@
     <artifactId>sms-server</artifactId>
     <description>sms server</description>
     <dependencies>
-        <dependency>
+       <!-- <dependency>
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>auth-client</artifactId>
+        </dependency>-->
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>server-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-dto</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>sms-api</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -39,14 +53,23 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
-        <dependency>
+        <!--<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
+        <!-- sleuth -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-zipkin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-rabbit</artifactId>
+        </dependency>
         <!-- db -->
         <dependency>
             <groupId>mysql</groupId>
@@ -65,6 +88,42 @@
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>
         </dependency>
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+        <!-- aliyun sms SDK -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+        <!-- Test -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 2 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/SmsApplication.java

@@ -3,12 +3,14 @@ package com.usoftchina.saas.sms;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * @author yingp
  * @date 2018/10/10
  */
 @SpringBootApplication
+@EnableFeignClients("com.usoftchina.saas.sms.api")
 @EnableEurekaClient
 public class SmsApplication {
     public static void main(String[] args) {

+ 45 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/config/SmsConfig.java

@@ -0,0 +1,45 @@
+package com.usoftchina.saas.sms.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties("sms.config")
+public class SmsConfig {
+
+    private String product;
+    private String domain;
+
+    private String accessKeyId;
+    private String accessKeySecret;
+
+    public String getProduct() {
+        return product;
+    }
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getAccessKeyId() {
+        return accessKeyId;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public String getAccessKeySecret() {
+        return accessKeySecret;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+}

+ 32 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/controller/SmsController.java

@@ -0,0 +1,32 @@
+package com.usoftchina.saas.sms.controller;
+
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import com.usoftchina.saas.sms.service.SmsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@EnableConfigurationProperties(SmsConfig.class)
+public class SmsController {
+
+    @Autowired
+    private SmsConfig smsConfig;
+    @Autowired
+    private SmsService smsService;
+
+    @PostMapping("/msg/register")
+    public Result sendRegisterMsg(@RequestBody SmsDTO smsDTO){
+        try {
+            smsService.sendMessage(smsConfig, smsDTO);
+        } catch (ClientException e) {
+            return Result.error(new BizException(Integer.parseInt(e.getErrCode()), e.getMessage()));
+        }
+        return Result.success();
+    }
+
+}

+ 17 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/SmsService.java

@@ -0,0 +1,17 @@
+package com.usoftchina.saas.sms.service;
+
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+
+public interface SmsService {
+
+    /**
+     * 发送短信
+     * @param smsDTO
+     * @return
+     */
+    SendSmsResponse sendMessage(SmsConfig smsConfig, SmsDTO smsDTO) throws ClientException;
+
+}

+ 46 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/saas/sms/service/impl/SmsServiceImpl.java

@@ -0,0 +1,46 @@
+package com.usoftchina.saas.sms.service.impl;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import com.usoftchina.saas.sms.service.SmsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SmsServiceImpl implements SmsService {
+
+    @Override
+    public SendSmsResponse sendMessage(SmsConfig smsConfig, SmsDTO smsDTO) throws ClientException {
+        //设置超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", smsConfig.getProduct(), smsConfig.getDomain());
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+        //组装请求对象
+        SendSmsRequest request = new SendSmsRequest();
+        //待发送手机号
+        request.setPhoneNumbers(smsDTO.getMobile());
+        //短信签名
+        request.setSignName(smsDTO.getSignName());
+        //短信模板
+        request.setTemplateCode(smsDTO.getTemplateCode());
+        //变量
+        request.setTemplateParam(smsDTO.getTemplateParam());
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = acsClient.getAcsResponse(request);
+        }catch (Exception e){
+            return null;
+        }
+        return sendSmsResponse;
+    }
+
+}

+ 79 - 0
base-servers/sms/sms-server/src/main/resources/application.yml

@@ -0,0 +1,79 @@
+spring:
+  profiles:
+    active: dev
+  application:
+    name: sms-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    username: root
+    password: select111***
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
+  messages:
+    basename: i18n/messages
+  redis:
+    host: 192.168.0.182
+    port: 6379
+  rabbitmq:
+    host: 192.168.0.176
+    port: 5672
+    virtual-host: dev
+    username: saas
+    password: select123***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    prefer-ip-address: true
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+server:
+  port: 8680
+  tomcat:
+    uri-encoding: UTF-8
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+auth:
+  public-key: auth/pub.key
+sms:
+  config:
+    product: Dysmsapi
+    domain: dysmsapi.aliyuncs.com
+    accessKeyId: LTAIf3jgw6hzVhw0
+    accessKeySecret: tvR2pvO3HtB7gay7EXFgg0SEp2rXon

二进制
base-servers/sms/sms-server/src/main/resources/auth/pub.key


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

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

+ 43 - 0
base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/api/SmsApiTest.java

@@ -0,0 +1,43 @@
+package com.usoftchina.saas.sms.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author chenwei
+ * @date 2018/12/08
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SmsApiTest {
+
+    @Autowired
+    private SmsApi smsApi;
+
+    private final String mobile = "18702604854";
+    private final String msgTemplateCode = "SMS_152288990";
+    private final String password = "cw123456";
+
+    @Test
+    public void testA_register(){
+        SmsDTO smsDTO = new SmsDTO();
+        smsDTO.setMobile(mobile);
+        smsDTO.setSignName("优软云");
+        smsDTO.setTemplateCode(msgTemplateCode);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("password", password);
+        smsDTO.setTemplateParam(jsonObject.toJSONString());
+        Result sendResult = smsApi.sendRegisterMsg(smsDTO);
+        System.out.println(sendResult.getCode() + "========" + sendResult.getMessage());
+    }
+
+}

+ 59 - 0
base-servers/sms/sms-server/src/test/java/com/usoftchina/saas/sms/service/SmsServiceTest.java

@@ -0,0 +1,59 @@
+package com.usoftchina.saas.sms.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.saas.sms.config.SmsConfig;
+import com.usoftchina.saas.sms.dto.SmsDTO;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author chenwei
+ * @date 2018/12/07
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SmsServiceTest {
+
+    @Autowired
+    private SmsService smsService;
+
+    private final String product = "Dysmsapi";
+    private final String domain = "dysmsapi.aliyuncs.com";
+    private final String accessKeyId = "LTAIf3jgw6hzVhw0";
+    private final String accessKeySecret = "tvR2pvO3HtB7gay7EXFgg0SEp2rXon";
+    private final String templateCode = "SMS_152288990";  //SMS_152288681
+
+    @Test
+    public void testA_sendMessage(){
+        SmsConfig smsConfig = new SmsConfig();
+        smsConfig.setProduct(product);
+        smsConfig.setDomain(domain);
+        smsConfig.setAccessKeyId(accessKeyId);
+        smsConfig.setAccessKeySecret(accessKeySecret);
+
+        SmsDTO smsDTO = new SmsDTO();
+        smsDTO.setMobile("18702604854");
+        smsDTO.setSignName("优软云");
+        smsDTO.setTemplateCode(templateCode);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("password", "123456");
+        smsDTO.setTemplateParam(jsonObject.toJSONString());
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = smsService.sendMessage(smsConfig, smsDTO);
+            System.out.println(sendSmsResponse);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+}

+ 20 - 0
framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.utils;
 
 import java.util.Date;
+import java.util.Random;
 
 /**
  * @author yingp
@@ -39,4 +40,23 @@ public abstract class StringUtils extends org.springframework.util.StringUtils{
     public static String createBusinessCode() {
         return BUSINESSCODE_PREFIX + DateUtils.getCurrentDate("yyyyMMdd") + (int)(Math.random()*1000 + 1000);
     }
+
+    public static String createInitPassword(String suffix){
+        Random random = new Random();
+        StringBuilder value = new StringBuilder();
+        // 生成4个字母
+        for (int i=0; i<3; i++) {
+            int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
+            value.append((char)(choice + random.nextInt(26)));
+        }
+
+        // 3个数字
+        String number = random.nextInt(999) + 1000 + "";
+        number = number.substring(number.length() - 3, number.length());
+        value.append(number);
+
+        // 后缀
+        value.append(suffix);
+        return value.toString();
+    }
 }

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

@@ -110,7 +110,7 @@ import { setTimeout } from 'timers';
             VDistpicker
         },
         mounted(){
-            this.$refs.name.value = this.mytoken.account.realname
+            this.$refs.name.value = this.mytoken.account.realname == this.mytoken.account.mobile ? '' : this.mytoken.account.realname
             this.$refs.email.value = this.mytoken.account.email
         },
         methods: {

+ 12 - 5
frontend/saas-web/app/Application.scss

@@ -10,20 +10,20 @@ body.launching {
   background-image: $auth-background-image;
   background-position: center;
 
-  &::before {
+  &::after {
     @include animation(rotate-animation 1s linear infinite);
     @include transform-origin(50% 50%);
     @include background-size(cover);
-    background-image: url(get-resource-path('images/loading.png'));
+    background-image: url(get-resource-path('images/loading.gif'));
     background-position: center;
     content: '';
     position: absolute;
     margin-top: -15px;
     margin-left: -15px;
-    top: 50%;
+    top: 65%;
     left: 50%;
-    width: 41px;
-    height: 41px;
+    width: 64px;
+    height: 64px;
   }
 }
 
@@ -484,4 +484,11 @@ div::-webkit-scrollbar-track {
 /** tab **/
 .x-tab-default.x-tab-active .x-tab-close-btn {
   color: #34BAF6;
+}
+
+/** tabclosemenu **/
+.x-menu.x-tab-close-menu {
+  & > div > div > div.x-box-inner.x-box-scroller-body-vertical.x-scroller > div > div > a > span {
+    margin-left: 28px;
+  }
 }

+ 1 - 1
frontend/saas-web/app/view/core/form/FormPanel.js

@@ -317,7 +317,7 @@ Ext.define('saas.view.core.form.FormPanel', {
 
         var detailGrids = me.query('detailGridField');
 
-        for (var i = 0; i < detailCount; i++) {
+        for (var i = 0; i < detailGrids.length; i++) {
             var detailData = formData['detail' + i] || [],
                 detail = viewData['detail' + i],
                 grid = detailGrids[i],

+ 1 - 0
frontend/saas-web/app/view/core/form/FormPanelController.js

@@ -403,6 +403,7 @@ Ext.define('saas.view.core.form.FormPanelController', {
                 closable: true,
                 layout: 'fit',
                 items: [{
+                    padding:'5 10 5 10',
                     xtype: 'core-form-mseeageLog',
                     mlKeyvalue:mlKeyvalue,
                     mlCaller:mlCaller

+ 1 - 0
frontend/saas-web/app/view/core/form/MseeageLog.js

@@ -121,6 +121,7 @@ Ext.define('saas.view.core.form.MseeageLog', {
 
             Ext.apply(me, {
                 dockedItems:[{
+                    style:'padding: 3px 0 3px 0px;height: 36px;',
                     xtype: 'pagingtoolbar',
                     dock: 'bottom',
                     displayInfo: true,

+ 37 - 24
frontend/saas-web/app/view/core/form/MultiCombo.js

@@ -16,21 +16,24 @@ Ext.define('saas.view.core.form.MultiCombo', {
         me.callParent(arguments);
     },
     listeners:{
-        afterrender:function(f){
-            this.mon(f.el,{
-                mouseover: this.onMouseOver,
-                mouseleave:this.onMouseLeave,
-                scope:this
-            });
-        }
+        focus: function() {
+            this.showMenu();
+        },
+        // afterrender:function(f){
+        //     this.mon(f.el,{
+        //         mouseover: this.onMouseOver,
+        //         mouseleave:this.onMouseLeave,
+        //         scope:this
+        //     });
+        // }
 
     },
-    onMouseOver:function(){
-       this.showMenu();
-    },
-    onMouseLeave:function(a,b,c){
-        this.hideMenu(a.parentEvent?a:b);//el光标离开第二个参数为Event对象
-    },
+    // onMouseOver:function(){
+    //    this.showMenu();
+    // },
+    // onMouseLeave:function(a,b,c){
+    //     this.hideMenu(a.parentEvent?a:b);//el光标离开第二个参数为Event对象
+    // },
     onTriggerClick:function(){
         this.showMenu();
     },
@@ -42,10 +45,10 @@ Ext.define('saas.view.core.form.MultiCombo', {
             me.menu = Ext.create('Ext.menu.Menu',{
                 hideOnParentHide: false,
                 items: me.getMenuItems(),
-                listeners:{
-                    mouseleave:me.onMouseLeave,
-                    scope:me
-                }
+                // listeners:{
+                //     mouseleave:me.onMouseLeave,
+                //     scope:me
+                // }
             });
         }
         return me.menu;
@@ -93,17 +96,27 @@ Ext.define('saas.view.core.form.MultiCombo', {
         var me = this, rawV = '',
         datas = me.datas,
         menu = me.menu;
-        if(!Ext.isArray(items)) {
-            items = [items]
+        if(Ext.isString(items)) {
+            items = items.split(',');
         }
         items.map(function(item, index) {
             if(Ext.isString(item)) {
-                var data = datas.find(function(d) {
-                    return d[0] == item;
+                // var data = datas.find(function(d) {
+                //     return d[0] == item;
+                // });
+                var data = Ext.Array.findBy(datas, function(d) {
+                    return d[0] == item || d[1] == item;
                 });
-                items[index] = {
-                    text: data[1],
-                    value: data[0]
+                if(data) {
+                    items[index] = {
+                        text: data[1],
+                        value: data[0]
+                    }
+                }else {
+                    items[index] = {
+                        text: item,
+                        value: item
+                    }
                 }
             }
         })

+ 284 - 267
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -13,7 +13,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
 
     layout: 'vbox',
     autoScroll: true,
-    bodyBorder:false,
+    bodyBorder: false,
     bodyPadding: 5,
 
     groupField: null, // 分组字段
@@ -21,162 +21,124 @@ Ext.define('saas.view.core.report.ReportPanel', {
     defaultCondition: null, // 默认查询条件
     searchItems: [], // 查询字段
     reportTitle: '报表',
-    autoLoad:true,
+    autoLoad: true,
     allowPaging: true,
     printAble: true,
     exportAble: true,
+    showMySummary: true,
     queryMode: 'DETAIL',
 
-    initComponent: function() {
+    initComponent: function () {
         var me = this;
         var printAble = me.printAble;
         var exportAble = me.exportAble;
         var store = me.initStore();
         columnWidth: 0.25,
-        Ext.apply(me, {
-            items: [{
-                xtype: 'form',
-                width: '100%',
-                layout: 'column',
-                defaults:{
-                    margin: '0 5 5 0',
-                    labelAlign: 'right',
-                    labelWidth: 90,
-                    columnWidth: 0.25,
-                },
-                items: me.initSearchItems().concat([{
-                    xtype: 'container',
-                    columnWidth: me.QueryWidth || 0.5,
-                    items: [{
-                        xtype: 'button',
-                        text: '查询',
-                        handler: 'onQuery',
-                        formBind:true
-                    },{
-                        xtype:'button',
-                        text:'打印',
-                        hidden: !printAble,
-                        style: {
-                            float: 'right'
-                        },
-                        handler: 'exportTo',
-                        cfg: {
-                            type: 'html',
-                            includeGroups: true,
-                            includeSummary: true,
-                            isPrint:true
-                        }
-                    },{
-                        xtype: 'button',
-                        style: {
-                            float: 'right'
-                        },
-                        text: '导出',
-                        hidden: !exportAble,
-                        menu: {
-                            defaults: {
-                                handler: 'exportTo'
+            Ext.apply(me, {
+                items: [{
+                    xtype: 'form',
+                    width: '100%',
+                    layout: 'column',
+                    defaults: {
+                        margin: '0 5 5 0',
+                        labelAlign: 'right',
+                        labelWidth: 90,
+                        columnWidth: 0.25,
+                    },
+                    items: me.initSearchItems().concat([{
+                        xtype: 'container',
+                        columnWidth: me.QueryWidth || 0.5,
+                        items: [{
+                            xtype: 'button',
+                            text: '查询',
+                            handler: 'onQuery',
+                            formBind: true
+                        }, {
+                            xtype: 'button',
+                            text: '打印',
+                            hidden: !printAble,
+                            style: {
+                                float: 'right'
                             },
-                            items: [{
-                                text: 'Excel xlsx',
-                                cfg: {
-                                    type: 'excel07',
-                                    ext: 'xlsx'
-                                }
-                            }, {
-                                text: 'Excel xlsx (包含分组合计)',
-                                cfg: {
-                                    type: 'excel07',
-                                    ext: 'xlsx',
-                                    includeGroups: true,
-                                    includeSummary: true
-                                }
-                            }, {
-                            //     text: 'Excel xml',
-                            //     cfg: {
-                            //         type: 'excel03',
-                            //         ext: 'xml'
-                            //     }
-                            // }, {
-                            //     text: 'Excel xml (包含分组合计)',
-                            //     cfg: {
-                            //         type: 'excel03',
-                            //         ext: 'xml',
-                            //         includeGroups: true,
-                            //         includeSummary: true
-                            //     }
-                            // }, {
-                                text: 'CSV',
-                                cfg: {
-                                    type: 'csv'
-                                }
-                            }, {
-                                text: 'CSV (包含分组合计)',
-                                cfg: {
-                                    type: 'csv',
-                                    includeGroups: true,
-                                    includeSummary: true
-                                }
-                            //     text: 'TSV',
-                            //     cfg: {
-                            //         type: 'tsv',
-                            //         ext: 'csv'
-                            //     }
-                            // }, {
-                            //     text: 'HTML',
-                            //     cfg: {
-                            //         type: 'html'
-                            //     }
-                            // }, {
-                            //     text: 'HTML (包含分组合计)',
-                            //     cfg: {
-                            //         type: 'html',
-                            //         includeGroups: true,
-                            //         includeSummary: true
-                            //     }
-                            }]
-                        }
-                    }]
-                }])
-            }, {
-                xtype: 'grid',
-                width: '100%',
-                cls: 'x-report-grid',
-                flex: 1,
-                border: 0,
-                sortableColumns: false,
-                enableColumnHide: false,
-                rowLines: false,
-                plugins: [{
-                    ptype: 'gridexporter',
-                }, {
-                    ptype: 'menuclipboard'
-                }],
-                features: [{
-                    ftype: 'groupingsummary',
-                    hideGroupedHeader: false,
-                    enableGroupingMenu: false,
-                    collapsible: false
+                            handler: 'exportTo',
+                            cfg: {
+                                type: 'html',
+                                includeGroups: true,
+                                includeSummary: true,
+                                isPrint: true
+                            }
+                        }, {
+                            xtype: 'button',
+                            style: {
+                                float: 'right'
+                            },
+                            text: '导出',
+                            hidden: !exportAble,
+                            menu: {
+                                defaults: {
+                                    handler: 'exportTo'
+                                },
+                                items: [{
+                                    text: 'Excel xlsx',
+                                    cfg: {
+                                        type: 'excel07',
+                                        ext: 'xlsx'
+                                    }
+                                }, {
+                                    text: 'Excel xlsx (包含分组合计)',
+                                    cfg: {
+                                        type: 'excel07',
+                                        ext: 'xlsx',
+                                        includeGroups: true,
+                                        includeSummary: true
+                                    }
+                                }, {
+                                    text: 'CSV',
+                                    cfg: {
+                                        type: 'csv'
+                                    }
+                                }, {
+                                    text: 'CSV (包含分组合计)',
+                                    cfg: {
+                                        type: 'csv',
+                                        includeGroups: true,
+                                        includeSummary: true
+                                    }
+                                }]
+                            }
+                        }]
+                    }])
                 }, {
-                    ftype: 'mysummary',
-                    dock: 'bottom'
-                }],
-                store: store,
-                columns: me.initColumns(),
-                dockedItems: [me.allowPaging ? {
-                    xtype: 'pagingtoolbar',
-                    dock: 'bottom',
-                    displayInfo: true,
-                    store: store
-                } : null],
-            }]
-        });
+                    xtype: 'grid',
+                    width: '100%',
+                    cls: 'x-report-grid',
+                    flex: 1,
+                    border: 0,
+                    sortableColumns: false,
+                    enableColumnHide: false,
+                    rowLines: false,
+                    plugins: [{
+                        ptype: 'gridexporter',
+                    }, {
+                        ptype: 'menuclipboard'
+                    }],
+                    features: me.initFeatures(),
+                    store: store,
+                    columns: me.initColumns(),
+                    dockedItems: [me.allowPaging ? {
+                        xtype: 'pagingtoolbar',
+                        dock: 'bottom',
+                        displayInfo: true,
+                        store: store
+                    } : null],
+                }]
+            });
 
         me.callParent(arguments);
     },
 
     listeners: {
-        boxready: function(p) {
+        boxready: function (p) {
             var allowPaging = p.allowPaging;
             var grid = p.down('grid');
             var store = grid.getStore();
@@ -189,14 +151,34 @@ Ext.define('saas.view.core.report.ReportPanel', {
         }
     },
 
-    getListGrid: function() {
+    getListGrid: function () {
         var me = this,
-        grid = me.items.items[1];
+            grid = me.items.items[1];
 
         return grid;
     },
 
-    initStore: function() {
+    initFeatures: function () {
+        var me = this;
+        var f = [{
+            ftype: 'groupingsummary',
+            hideGroupedHeader: false,
+            enableGroupingMenu: false,
+            collapsible: false
+        }];
+
+        if (me.showMySummary) {
+            f.push({
+                ftype: 'mysummary',
+                dock: 'bottom',
+                hidden: !me.showMySummary
+            });
+        }
+
+        return f;
+    },
+
+    initStore: function () {
         var me = this;
         var store = Ext.create('Ext.data.Store', {
             fields: me.getFields(),
@@ -207,57 +189,67 @@ Ext.define('saas.view.core.report.ReportPanel', {
             proxy: {
                 type: 'ajax',
                 url: me.listUrl,
-                timeout: 8000,
+                timeout: 30000,
                 actionMethods: {
                     read: 'GET'
                 },
                 reader: {
                     type: 'json',
                     // rootProperty: 'data.list',
-                    rootProperty: function(data) {
+                    rootProperty: function (data) {
                         try {
                             var grid = me.items.items[1],
-                            columns = grid.columns,
-                            summaryData = data.data ? (data.data.calculate || []) : [];
-    
-                            Ext.Array.each(columns, function(c) {
+                                store = grid.store,
+                                columns = grid.columns,
+                                summaryData = data.data ? (data.data.calculate || []) : [],
+                                datas = data.data ? (data.data.list ? data.data.list.list : []) : [];
+
+                            Ext.Array.each(columns, function (c) {
                                 var type = c.summaryType,
-                                name = c.dataIndex;
-    
-                                var d = Ext.Array.findBy(summaryData, function(s) {
+                                    name = c.dataIndex;
+
+                                var d = Ext.Array.findBy(summaryData, function (s) {
                                     return s.hasOwnProperty(name);
                                 })
-                                if(type && d) {
-                                    if(type == 'count') {
+                                if (type && d) {
+                                    if(typeof c.mySummaryRenderer == 'function') {
+                                        c.summaryValue = c.mySummaryRenderer(grid, datas);
+                                    }else if (type == 'count') {
                                         c.summaryValue = Ext.util.Format.number(d[name], c.format || '0');
-                                    }else if(typeof c.summaryRenderer == 'function') {
+                                    } else if (typeof c.summaryRenderer == 'function') {
                                         c.summaryValue = c.summaryRenderer(d[name]);
-                                    }else if(typeof c.renderer == 'function') {
+                                    } else if (typeof c.renderer == 'function') {
                                         c.summaryValue = c.renderer(d[name]);
-                                    }else {
+                                    } else {
                                         c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
                                     }
-                                }else {
-                                    c.summaryValue = 0;
+                                } else if(type && !d) {
+                                    if(typeof c.mySummaryRenderer == 'function') {
+                                        c.summaryValue = c.mySummaryRenderer(grid, c, datas);
+                                    }else {
+                                        c.summaryValue = me.getSummaryValue(datas, c);
+                                    }
+                                } else {
+                                    c.summaryValue = null;
                                 }
                             });
-                            return data.data ? (data.data.list ? data.data.list.list : []) : [];
-                        }catch(e) {
+                            return datas;
+                        } catch (e) {
                             saas.util.BaseUtil.showErrorToast(e.message);
                         }
                     },
                     totalProperty: 'data.list.total',
                 },
                 listeners: {
-                    exception: function(proxy, response, operation, eOpts) {
-                        if(operation.success) {
-                            if(response.timedout) {
+                    exception: function (proxy, response, operation, eOpts) {
+                        if (operation.success) {
+                            if (response.timedout) {
                                 saas.util.BaseUtil.showErrorToast('请求超时');
                             }
-                        }else {
-                            if(response.timedout) {
+                        } else {
+                            if (response.timedout) {
                                 saas.util.BaseUtil.showErrorToast('请求超时');
-                            }else{
+                            } else {
                                 saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
                             }
                         }
@@ -267,10 +259,10 @@ Ext.define('saas.view.core.report.ReportPanel', {
             listeners: {
                 beforeload: function (store, op) {
                     var condition = me.getConditions(),
-                    defaultCondition = me.defaultCondition,
-                    summarys = me.summarys;
-    
-                    if(defaultCondition) {
+                        defaultCondition = me.defaultCondition,
+                        summarys = me.summarys;
+
+                    if (defaultCondition) {
                         condition.push({
                             type: 'condition',
                             value: defaultCondition
@@ -278,19 +270,19 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     }
 
                     var params = me.applyParams({
-                        number: store.exportNumber?store.exportNumber:op._page,
-                        size: store.exportPageSize?store.exportPageSize:store.pageSize,
+                        number: store.exportNumber ? store.exportNumber : op._page,
+                        size: store.exportPageSize ? store.exportPageSize : store.pageSize,
                         mode: me.queryMode || 'DETAIL',
                         condition: JSON.stringify(condition),
                         calculateFields: JSON.stringify(summarys)
                     });
                     Ext.apply(store.proxy.extraParams, params);
-    
+
                 }
             }
         });
 
-        if(me.groupField) {
+        if (me.groupField) {
             store.setGrouper({
                 property: me.groupField
             });
@@ -299,26 +291,26 @@ Ext.define('saas.view.core.report.ReportPanel', {
         return store;
     },
 
-    getFields: function() {
+    getFields: function () {
         var me = this;
-        return me.reportColumns.filter(function(c) {
+        return me.reportColumns.filter(function (c) {
             return !!c.dataIndex;
-        }).map(function(c) {
+        }).map(function (c) {
             return c.dataIndex;
         });
     },
 
-    initColumns: function() {
+    initColumns: function () {
         var me = this,
-        columns = me.reportColumns,
-        summarys = [];
+            columns = me.reportColumns,
+            summarys = [];
 
-        Ext.Array.each(columns, function(c) {
+        Ext.Array.each(columns, function (c) {
             c.columns || Ext.applyIf(c, {
                 width: 110
             });
 
-            if(c.xtype == 'datecolumn') {
+            if (c.xtype == 'datecolumn') {
                 Ext.applyIf(c, {
                     // 这两个都要写上,才能控制到不同类型的导出格式,原因不明- -!
                     format: 'Y-m-d',
@@ -330,14 +322,14 @@ Ext.define('saas.view.core.report.ReportPanel', {
                         return Ext.Date.format(new Date(value), 'Y-m-d');
                     },
                     // 下面这个方法不写会造成日期列求和,原因不明- -!
-                    exportSummaryRenderer: function(v) {
+                    exportSummaryRenderer: function (v) {
                         return v;
                     }
                 })
-            }else if(c.xtype == 'numbercolumn') {
+            } else if (c.xtype == 'numbercolumn') {
                 Ext.applyIf(c, {
                     align: 'end', // 数字右对齐
-                    renderer : function(v) {
+                    renderer: function (v) {
                         var arr = (v + '.').split('.');
                         var xr = (new Array(arr[1].length)).fill('0');
                         var format = '0.' + xr.join();
@@ -346,11 +338,11 @@ Ext.define('saas.view.core.report.ReportPanel', {
                 });
             }
 
-            if(c.summaryType) {
+            if (c.summaryType) {
                 me.initSummaryType(c);
                 summarys.push({
                     field: c.dataIndex,
-                    operation: c.summaryTypeName,
+                    operation: c.summaryType == 'last' ? 'sum' : c.summaryType,
                 });
             }
         })
@@ -360,64 +352,69 @@ Ext.define('saas.view.core.report.ReportPanel', {
         return columns;
     },
 
-    initSummaryType: function(column) {
+    initSummaryType: function (column) {
         var summaryType = column.summaryType;
-        if(Ext.isString(summaryType)) {
+        if (Ext.isString(summaryType)) {
             column.summaryTypeName = summaryType;
         }
-        if(summaryType == 'sum') {
+        if (summaryType == 'sum') {
             column._summaryType = 'sum';
             // 原生的求和方法使用的是Store.sum,在数据存在null时计算结果为NaN,这里重写一下
-            column.summaryType = function(records, values) {
+            column.summaryType = function (records, values) {
                 return Ext.Array.sum(values);
             }
+        } else if(summaryType == 'last') {
+            column._summaryType = 'last';
+            column.summaryType = function (records, values) {
+                return values[values.length - 1];
+            }
         }
     },
 
-    initSearchItems: function() {
+    initSearchItems: function () {
         var me = this,
-        queryItems = [],
-        items = me.searchItems,
-        viewModel = me.getViewModel();
+            queryItems = [],
+            items = me.searchItems,
+            viewModel = me.getViewModel();
 
-        Ext.Array.each(items, function(item) {
+        Ext.Array.each(items, function (item) {
             var bind = item.bind,
-            name = item.name,
-            ignore = item.ignore,
-            defaultValue = item.defaultValue;
+                name = item.name,
+                ignore = item.ignore,
+                defaultValue = item.defaultValue;
 
-            if(item.allowBlank==false){
+            if (item.allowBlank == false) {
                 // TODO 需要判断类型
                 item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
             }
 
-            if(!ignore) {
+            if (!ignore) {
                 queryItems.push(name);
             }
 
-            if(item.xtype == 'numberfield') {
+            if (item.xtype == 'numberfield') {
                 Ext.applyIf(item, {
                     hideTrigger: true, // 隐藏trigger
                     mouseWheelEnabled: false // 取消滚轮事件
                 });
             }
             // 设置model绑定
-            if(bind) {
-                if(!Ext.isString(bind)) {
+            if (bind) {
+                if (!Ext.isString(bind)) {
                     bind = name;
                     Ext.apply(bind, {
                         value: '{form.' + bind + '}'
                     });
-                }else {
+                } else {
                     bind = name;
                     item.bind = '{form.' + bind + '}';
                 }
-            }else {
+            } else {
                 bind = name;
                 item.bind = '{form.' + bind + '}';
             }
             // 设置默认值
-            if(defaultValue) {
+            if (defaultValue) {
                 viewModel.set('form.' + bind, defaultValue);
             }
 
@@ -425,11 +422,11 @@ Ext.define('saas.view.core.report.ReportPanel', {
             item.listeners = item.listeners || {};
             Ext.applyIf(item.listeners, {
                 keydown: {
-                    fn: function(th, e, eOpts) {
-                        if(e.keyCode == 13) {
-                            if(!th.fireEvent('beforequery', th)) {
+                    fn: function (th, e, eOpts) {
+                        if (e.keyCode == 13) {
+                            if (!th.fireEvent('beforequery', th)) {
                                 return;
-                            }else {
+                            } else {
                                 var p = this.up('core-report-reportpanel');
                                 p.getController().onQuery()
                             }
@@ -444,42 +441,60 @@ Ext.define('saas.view.core.report.ReportPanel', {
         return items;
     },
 
-    getConditions: function() {
+    getSummaryValue: function(datas, c) {
+        var dataIndex = c.dataIndex,
+        type = c.summaryType,
+        values = datas.map(function(d) {
+            return d[c.dataIndex];
+        }),
+        sum = Ext.Array.sum(values);
+        if (type == 'count') {
+            return Ext.util.Format.number(values.length, '0');
+        } else if (typeof c.summaryRenderer == 'function') {
+            return c.summaryRenderer(sum);
+        } else if (typeof c.renderer == 'function') {
+            return c.renderer(sum);
+        } else {
+            return Ext.util.Format.number(sum, c.format || '0.00');
+        }
+    },
+
+    getConditions: function () {
         var me = this,
-        form = me.down('form'),
-        formItems = form.items.items,
-        viewModel = me.getViewModel(),
-        viewModelData = viewModel.getData(),
-        formData = viewModelData['form'] || {},
-        queryItems = me.queryItems,
-        condition,
-        conditions = [];
-
-        for(var i = 0; i < queryItems.length; i++) {
+            form = me.down('form'),
+            formItems = form.items.items,
+            viewModel = me.getViewModel(),
+            viewModelData = viewModel.getData(),
+            formData = viewModelData['form'] || {},
+            queryItems = me.queryItems,
+            condition,
+            conditions = [];
+
+        for (var i = 0; i < queryItems.length; i++) {
             var n = queryItems[i];
-            var item = Ext.Array.findBy(formItems, function(i) {
+            var item = Ext.Array.findBy(formItems, function (i) {
                 return i.name == n;
             });
             var field = item.name,
-            func = item.getCondition,
-            value = formData[n],
-            condition;
+                func = item.getCondition,
+                value = formData[n],
+                condition;
 
-            if(!value) {
+            if (!value) {
                 continue;
             }
 
-            if(typeof func == 'function') {
+            if (typeof func == 'function') {
                 condition = {
                     type: 'condition',
                     value: func(value)
                 }
-            }else {
+            } else {
                 type = item.fieldType || me.getDefaultFieldType(item),
-                operation = item.operation || me.getDefaultFieldOperation(item),
-                conditionValue = me.getConditionValue(item, value);
-    
-                if(!conditionValue) {
+                    operation = item.operation || me.getDefaultFieldOperation(item),
+                    conditionValue = me.getConditionValue(item, value);
+
+                if (!conditionValue) {
                     continue;
                 }
                 condition = {
@@ -495,24 +510,24 @@ Ext.define('saas.view.core.report.ReportPanel', {
         return me.myGetConditions(conditions);
     },
 
-    myGetConditions: function(conditions) {
+    myGetConditions: function (conditions) {
         return conditions;
     },
 
-    getDefaultFieldType: function(field) {
+    getDefaultFieldType: function (field) {
         var me = this,
-        xtypes = field.getXTypes().split('/'),
-        type;
+            xtypes = field.getXTypes().split('/'),
+            type;
 
-        if(me.isContainsAny(xtypes, ['numberfield'])) {
+        if (me.isContainsAny(xtypes, ['numberfield'])) {
             type = 'number';
-        }else if(me.isContainsAny(xtypes, ['datefield', 'condatefield', 'conmonthfield'])) {
+        } else if (me.isContainsAny(xtypes, ['datefield', 'condatefield', 'conmonthfield'])) {
             type = 'date';
-        }else if(me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
             type = 'string';
-        }else if(me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
+        } else if (me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
             type = 'enum';
-        }else {
+        } else {
             type = 'string';
         }
 
@@ -522,28 +537,30 @@ Ext.define('saas.view.core.report.ReportPanel', {
     /**
      * 只要arr1和arr2中存在相同项即返回真
      */
-    isContainsAny: function(arr1, arr2) {
-        for(var i = 0; i < arr2.length; i++) {
+    isContainsAny: function (arr1, arr2) {
+        for (var i = 0; i < arr2.length; i++) {
             var a2 = arr2[i];
-            if(!!arr1.find(function(a1) {return a1==a2})) {
+            if (!!arr1.find(function (a1) {
+                    return a1 == a2
+                })) {
                 return true;
             }
         }
         return false;
     },
 
-    getDefaultFieldOperation: function(field) {
+    getDefaultFieldOperation: function (field) {
         var me = this,
-        xtypes = field.getXTypes().split('/'),
-        operation;
+            xtypes = field.getXTypes().split('/'),
+            operation;
 
-        if(me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
+        if (me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
             operation = '=';
-        }else if(me.isContainsAny(xtypes, ['condatefield', 'conmonthfield'])) {
+        } else if (me.isContainsAny(xtypes, ['condatefield', 'conmonthfield'])) {
             operation = 'between';
-        }else if(me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
+        } else if (me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
             operation = 'in';
-        }else {
+        } else {
             operation = 'like';
         }
 
@@ -553,38 +570,38 @@ Ext.define('saas.view.core.report.ReportPanel', {
     /**
      * 处理部分字段值
      */
-    getConditionValue: function(field, value) {
+    getConditionValue: function (field, value) {
         var me = this,
-        xtypes = field.getXTypes().split('/'),
-        conditionValue;
-        if(me.isContainsAny(xtypes, ['datefield'])) {
+            xtypes = field.getXTypes().split('/'),
+            conditionValue;
+        if (me.isContainsAny(xtypes, ['datefield'])) {
             conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
-        }else if(me.isContainsAny(xtypes, ['conmonthfield'])) {
+        } else if (me.isContainsAny(xtypes, ['conmonthfield'])) {
             var from = value.from,
-            to = value.to;
+                to = value.to;
 
             conditionValue = from + ',' + to;
-        }else if(me.isContainsAny(xtypes, ['condatefield'])) {
+        } else if (me.isContainsAny(xtypes, ['condatefield'])) {
             var from = value.from,
-            to = value.to;
+                to = value.to;
 
             conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
-        }else if(me.isContainsAny(xtypes, ['dbfindtrigger'])) {
+        } else if (me.isContainsAny(xtypes, ['dbfindtrigger'])) {
             conditionValue = value;
-        }else if(me.isContainsAny(xtypes, ['combobox', 'combo'])) {
+        } else if (me.isContainsAny(xtypes, ['combobox', 'combo'])) {
             conditionValue = '\'' + value + '\'';
-        }else if(me.isContainsAny(xtypes, ['multicombo'])) {
-            conditionValue = value.map ? value.map(function(v) {
+        } else if (me.isContainsAny(xtypes, ['multicombo'])) {
+            conditionValue = value.map ? value.map(function (v) {
                 return '\'' + v.value + '\'';
             }).join(',') : '';
-        }else {
+        } else {
             conditionValue = value;
         }
 
         return conditionValue;
     },
 
-    applyParams: function(p) {
+    applyParams: function (p) {
         return p;
     }
 });

+ 4 - 4
frontend/saas-web/app/view/core/report/ReportPanelController.js

@@ -52,11 +52,11 @@ Ext.define('saas.view.core.report.ReportPanelController', {
             iframe.setAttribute("id", "saas-print-iframe");
             iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
             document.body.appendChild(iframe);
-            doc = iframe.contentWindow.document;
-            doc.write(html);
-            doc.close();
-            iframe.contentWindow.focus();
         }
+        var doc = iframe.contentWindow.document;
+        doc.write(html);
+        doc.close();
+        iframe.contentWindow.focus();
         iframe.contentWindow.print();
         if (navigator.userAgent.indexOf("MSIE") > 0){
             document.body.removeChild(iframe);

+ 0 - 6
frontend/saas-web/app/view/document/bom/FormController.js

@@ -49,12 +49,6 @@ Ext.define('saas.view.document.bom.FormController', {
                         dbfinds:[
                         {
                             from:'pr_code',to:'bd_replace'                          
-                        },{
-                            from:'pr_detail',to:'pr_detail'
-                        },{
-                            from:'pr_spec',to:'pr_spec'
-                        },{
-                            from:'pr_unit',to:'pr_unit'
                         }],
                     }) ;   
                 }

+ 1 - 1
frontend/saas-web/app/view/document/kind/ChildForm.js

@@ -212,7 +212,7 @@ Ext.define('saas.view.document.kind.ChildForm', {
                 if(grid){
                     if(form.ownerCt._parent.lookup('document-kind-Grid')!=null){
                         form.ownerCt._parent.lookup('document-kind-Grid').store.load()
-                    }else{
+                    }else if(grid.store){
                         grid.store.load();
                     }
                 }

+ 5 - 3
frontend/saas-web/app/view/home/Home.js

@@ -50,7 +50,7 @@ Ext.define('saas.view.home.Home', {
         }, {
             xtype: 'month-purchase',
         }, {
-            xtype: 'month-io',
+            xtype: 'key-data',
         }]
     }, {
         xtype: 'panel',
@@ -65,10 +65,12 @@ Ext.define('saas.view.home.Home', {
             userCls: 'big-33 small-50',
         },
         items: [{
-            xtype: 'sale-trend',
+            xtype: 'month-io',
         }, {
-            xtype: 'purchase-trend'
+            xtype: 'sale-trend',
         }, {
+        //     xtype: 'purchase-trend'
+        // }, {
             xtype: 'stock-amount'
         }]
     }],

+ 82 - 21
frontend/saas-web/app/view/home/HomeModel.js

@@ -29,16 +29,19 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('infocard').setLoading(false);
+                        var p = Ext.getCmp('infocard');
+                        p && p.setLoading(false);
                     }
                 }
             },
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('infocard').setLoading(true);
+                    var p = Ext.getCmp('infocard');
+                        p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('infocard').setLoading(false);
+                    var p = Ext.getCmp('infocard');
+                        p && p.setLoading(false);
 
                     if(!d) return;
                     var res = d[0].data.data || {};
@@ -65,16 +68,19 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('month_sale').setLoading(false);
+                        var p = Ext.getCmp('infocard');
+                        p && p.setLoading(false);
                     }
                 }
             },
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('month_sale').setLoading(true);
+                    var p = Ext.getCmp('infocard');
+                        p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('month_sale').setLoading(false);
+                    var p = Ext.getCmp('infocard');
+                        p && p.setLoading(false);
                     var sum = Ext.util.Format.number(s.sum('y'), '0.00') || 0;
                     Ext.getCmp('home').getViewModel().set('month_sale_amount', sum)
                 }
@@ -98,16 +104,19 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('month-purchase').setLoading(false);
+                        var p = Ext.getCmp('month_purchase');
+                        p && p.setLoading(false);
                     }
                 }
             },
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('month-purchase').setLoading(true);
+                    var p = Ext.getCmp('month_purchase');
+                        p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('month-purchase').setLoading(false);
+                    var p = Ext.getCmp('month_purchase');
+                        p && p.setLoading(false);
                     var sum = Ext.util.Format.number(s.sum('y'), '0.00') || 0;
                     Ext.getCmp('home').getViewModel().set('month_purchase_amount', sum+'')
                 }
@@ -131,16 +140,19 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('month_io').setLoading(false);
+                        var p = Ext.getCmp('month_io');
+                        p && p.setLoading(false);
                     }
                 }
             },
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('month_io').setLoading(true);
+                    var p = Ext.getCmp('month_io');
+                    p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('month_io').setLoading(false);
+                    var p = Ext.getCmp('month_io');
+                    p && p.setLoading(false);
                     s.each(function(r) {
                         var sum = Ext.util.Format.number(r.get('main') + r.get('other'), '0.00') || 0;
                         if(r.get('x') == '收入') {
@@ -170,7 +182,8 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('sale_trend').setLoading(false);
+                        var p = Ext.getCmp('sale_trend');
+                        p && p.setLoading(false);
                     }
                 }
             },
@@ -179,10 +192,12 @@ Ext.define('saas.view.home.HomeModel', {
             ],
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('sale_trend').setLoading(true);
+                    var p = Ext.getCmp('sale_trend');
+                        p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('sale_trend').setLoading(false);
+                    var p = Ext.getCmp('sale_trend');
+                        p && p.setLoading(false);
                 }
             } 
         },
@@ -204,7 +219,8 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('purchase_trend').setLoading(false);
+                        var p = Ext.getCmp('purchase_trend');
+                        p && p.setLoading(false);
                     }
                 }
             },
@@ -213,10 +229,12 @@ Ext.define('saas.view.home.HomeModel', {
             ],
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('purchase_trend').setLoading(true);
+                    var p = Ext.getCmp('purchase_trend');
+                        p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('purchase_trend').setLoading(false);
+                    var p = Ext.getCmp('purchase_trend');
+                        p && p.setLoading(false);
                 }
             } 
         },
@@ -238,7 +256,8 @@ Ext.define('saas.view.home.HomeModel', {
                 },
                 listeners: {
                     exception: function(proxy, response, operation, eOpts) {
-                        Ext.getCmp('stock_amount').setLoading(false);
+                        var p = Ext.getCmp('stock_amount');
+                        p && p.setLoading(false);
                     }
                 }
             },
@@ -247,10 +266,52 @@ Ext.define('saas.view.home.HomeModel', {
             ],
             listeners: {
                 beforeload: function() {
-                    Ext.getCmp('stock_amount').setLoading(true);
+                    var p = Ext.getCmp('stock_amount');
+                    p && p.setLoading(true);
                 },
                 load: function(s, d) {
-                    Ext.getCmp('stock_amount').setLoading(false);
+                    var p = Ext.getCmp('stock_amount');
+                    p && p.setLoading(false);
+                }
+            } 
+        },
+
+        key_data: {
+            fields: ['name', 'value'],
+            autoLoad: true,
+            proxy: {
+                type: 'ajax',
+                // url: 'http://192.168.253.58:8920/homePage/keyData',
+                url: '/api/commons/homePage/keyData',
+                timeout: 8000,
+                actionMethods: {
+                    read: 'GET'
+                },
+                reader: {
+                    type: 'json',
+                    rootProperty: 'data',
+                },
+                listeners: {
+                    exception: function(proxy, response, operation, eOpts) {
+                        var p = Ext.getCmp('key_data');
+                        p && p.setLoading(false);
+                    }
+                }
+            },
+            listeners: {
+                beforeload: function() {
+                    var p = Ext.getCmp('key_data');
+                        p && p.setLoading(true);
+                },
+                load: function(s, d) {
+                    var p = Ext.getCmp('key_data');
+                        p && p.setLoading(false),
+                        data = s.getAt(0) ? s.getAt(0).data : null;
+                    if(data) {
+                        delete data.id;
+                        p.updateValue(data);
+                        // Ext.getCmp('home').getViewModel().set('keydata', data);
+                    }
                 }
             } 
         },

+ 147 - 0
frontend/saas-web/app/view/home/charts/KeyData.js

@@ -0,0 +1,147 @@
+Ext.define('saas.view.home.charts.KeyData', {
+    extend: 'Ext.panel.Panel',
+
+    xtype: 'key-data',
+    id: 'key_data',
+    cls: 'quick-graph-panel',
+
+    title: '关键数据',
+
+    layout: 'fit',
+    height: 300,
+
+    cardTpl: [
+        '<div class="x-container">',
+            '<tpl for=".">',
+                '<div class="x-box x-box-{color}">',
+                    '<div class="x-box-content">',
+                        '<tpl if="showIcon">',
+                            '<div class="x-icon x-icon-{icon}"></div>',
+                        '</tpl>',
+                        '<div class="x-text',
+                            // '<tpl if="!showIcon">',
+                            //     ' x-text-small',
+                            // '</tpl>',
+                        '">',
+                            // '<tpl if="!showIcon">',
+                            //     '<div class="x-icon-small x-icon-{icon}"></div>',
+                            // '</tpl>',
+                            '<div class="x-key"><span>{label}</span></div>',
+                            '<div class="x-value"><span>{value}</span></div>',
+                        '</div>',
+                    '</div>',
+                '</div>',
+            '</tpl>',
+        '</div>'
+    ],
+
+    cards: [{
+        color: 'green',
+        showIcon: true,
+        icon: 'storageTotal',
+        name: 'storageTotal',
+        label: '库存总额',
+        value: '0',
+        viewType: 'stock-report-datalist',
+        title: '物料库存数量金额表查询',
+        id: 'stock-report-datalist',
+    }, {
+        color: 'yellow',
+        showIcon: true,
+        icon: 'receiveTotal',
+        name: 'receiveTotal',
+        label: '应收总额',
+        value: '0',
+        viewType: 'monry-report-totalrecdetail',
+        title: '应收总账查询',
+        id: 'monry-report-totalrecdetail',
+    }, {
+        color: 'red',
+        showIcon: true,
+        icon: 'payTotal',
+        name: 'payTotal',
+        label: '应付总额',
+        value: '0',
+        viewType: 'monry-report-totalpaydetail',
+        title: '应付总账查询',
+        id: 'monry-report-totalpaydetail',
+    }, {
+        color: 'blue',
+        showIcon: true,
+        icon: 'balanceTotal',
+        name: 'balanceTotal',
+        label: '账户余额',
+        value: '0',
+        viewType: 'document-bankinformation-datalist',
+        title: '资金账户查询',
+        id: 'document-bankinformation-datalist',
+    }],
+
+    initComponent: function () {
+        var me = this;
+
+        var store = Ext.create('Ext.data.Store', {
+            fields: ['color', 'showIcon', 'icon', 'label', 'value'],
+            data: me.cards,
+            updateValue: function(datas) {
+                this.each(function(r, index) {
+                    // var v = datas[r.get('name')];
+                    // var d = saas.util.BaseUtil.formatAmount(v);
+                    var d = Ext.util.Format.number(datas[r.get('name')], '0,000.00');
+                    r.set('value', d);
+                });
+            },
+            // updateShowIcon: function(show) {
+            //     this.each(function(r) {
+            //         r.set('showIcon', show);
+            //     });
+            // }
+        });
+        var view = Ext.create('Ext.view.View', {
+            store: store,
+            tpl: new Ext.XTemplate(me.cardTpl),
+            itemSelector: 'div.x-box',
+            listeners: {
+                itemclick: function(th, record, item, index, e, eOpts) {
+                    saas.util.BaseUtil.openTab(record.get('viewType'), record.get('title'), record.get('id'));
+                }
+            }
+        });
+
+        Ext.apply(me, {
+            items: [view]
+        });
+
+        me.view = view;
+
+        me.callParent(arguments);
+    },
+
+    listeners: {
+        // afterlayout: function() {
+        //     var me = this,
+        //     box = me.getBox(),
+        //     view = me.view,
+        //     width = box.width,
+        //     store = view.store;
+
+        //     store.updateShowIcon(width >= 450);
+        // },
+    },
+
+    updateValue: function(datas) {
+        var me = this,
+        view = me.view,
+        store = view.store;
+
+        store.updateValue(datas);
+    },
+
+    // updateShowIcon: function(showIcon) {
+    //     var me = this,
+    //     view = me.view,
+    //     store = view.store;
+
+    //     store.updateShowIcon(showIcon);
+    // }
+});

+ 111 - 0
frontend/saas-web/app/view/home/charts/KeyData.scss

@@ -0,0 +1,111 @@
+#key_data {
+    .key_data-body {
+        padding: 0;
+    }
+    .x-container {
+        height: 100%;
+        display: flex;
+        flex-wrap: wrap;
+
+        .x-box {
+            width: calc(50% - 16px);
+            border-width: 5px 1px 1px;
+            border-style: solid;
+            border-color: #1EC09F;
+            cursor: pointer;
+
+            &:nth-of-type(odd) {
+                margin: 8px 8px 8px 0;
+            }
+
+            &:nth-of-type(even) {
+                margin: 8px 0 8px 8px;
+            }
+
+            .x-box-content {
+                display: flex;
+                height: 100%;
+                padding: 16px;
+
+                .x-icon {
+                    flex: 4;
+                    max-width: 48px;
+                    background-repeat: no-repeat;
+                    background-size: contain;
+                    background-position: center;
+
+                    &-small {
+                        width: 36px;
+                        height: 36px;
+                        position: relative;
+                        background-repeat: no-repeat;
+                        background-size: contain; 
+                    }
+
+                    &-storageTotal {
+                        background-image: url(/resources/images/home/storageTotal.png);
+                    }
+                    &-receiveTotal {
+                        background-image: url(/resources/images/home/receiveTotal.png);
+                    }
+                    &-payTotal {
+                        background-image: url(/resources/images/home/payTotal.png);
+                    }
+                    &-balanceTotal {
+                        background-image: url(/resources/images/home/balanceTotal.png);
+                    }
+                }
+
+                .x-text {
+                    flex: 6;
+                    display: flex;
+                    color: #485465;
+                    flex-direction: column;
+                    align-items: flex-end;
+                    overflow: hidden;
+
+                    .x-key {
+                        flex: 1;
+                        display: flex;
+                        align-items: flex-end;
+                        margin-bottom: 5px;
+                        font-size: 14px;
+                        color: #485465;
+                    }
+                
+                    .x-value {
+                        flex: 1;
+                        display: flex;
+                        align-items: flex-start;
+                        font-size: 16px;
+                        color: #1E2429;
+                    }
+
+                    &-small {
+                        display: block;
+
+                        .x-key {
+                            display: block;
+                            padding-left: 54px;
+                            margin-top: -17px;
+                            margin-bottom: 14px;
+                        }
+                    }
+                }
+            }
+        }
+
+        .x-box-green {
+            border-color: #1EC09F;
+        }
+        .x-box-yellow {
+            border-color: #FDC200;
+        }
+        .x-box-red {
+            border-color: #FB6A83;
+        }
+        .x-box-blue {
+            border-color: #62A3DF;
+        }
+    }
+}

+ 1 - 1
frontend/saas-web/app/view/home/charts/MonthPurchase.js

@@ -2,7 +2,7 @@ Ext.define('saas.view.home.charts.MonthPurchase', {
     extend: 'saas.view.core.chart.ChartBase',
     xtype: 'month-purchase',
 
-    id: 'month-purchase',
+    id: 'month_purchase',
 
     bind: {
         title: '本月采购额(万元):{month_purchase_amount}'

+ 1 - 1
frontend/saas-web/app/view/home/infoCardList/SaleOut.js

@@ -10,7 +10,7 @@ Ext.define('saas.view.home.infoCardList.SaleOut', {
     codeField: 'sa_code',
     detailTitle: '销售订单',
     detailXType: 'sale-sale-formpanel',
-    condition: 'sale.companyid=#{companyId} and sa_statuscode=\'AUDITED\' and exists (select 1 from saledetail detail where sd_id=saledetail.sd_id and  IFNULL(sa_sendstatus,\' \') <> \'已出库\' ',
+    condition: 'sale.companyid=#{companyId} and sa_statuscode=\'AUDITED\' and exists (select 1 from saledetail detail where sd_id=saledetail.sd_id and  IFNULL(sd_sendqty,0)<ifnull(sd_qty,0) and TO_DAYS(sd_delivery)-TO_DAYS(now())<= 7)',
     listColumns: [{
         text: 'id',
         dataIndex: 'sa_id',

+ 2 - 2
frontend/saas-web/app/view/main/Main.scss

@@ -69,7 +69,7 @@ $treelist-nav-ui: (
             width: 32px;
             height: 32px;
             top: 16px;
-            left: 42px;
+            left: 28px;
             position: relative;
         }
 
@@ -80,7 +80,7 @@ $treelist-nav-ui: (
             text-align: left;
             top: 30px;
             position: absolute;
-            left: 76px;
+            left: 64px;
         }
     }
 }

+ 2 - 2
frontend/saas-web/app/view/main/MainController.js

@@ -35,13 +35,13 @@ Ext.define('saas.view.main.MainController', {
         navigationList = refs.navigationTreeList,
         navCollapsed = !navigationList.navCollapsed,
         new_width = navCollapsed ? viewModel.get('smallNavWidth') : viewModel.get('navWidth'),
-        newLogoImgStyle = navCollapsed ? { width: 36, height: 36, top: 12, left: 12 } : { width: 32, height: 32, top: 16, left: 42 },
+        newLogoImgStyle = navCollapsed ? { width: 36, height: 36, top: 12, left: 12 } : { width: 32, height: 32, top: 16, left: 28 },
         newLogoTextStyle = navCollapsed ? {
             5: { opacity: 0 },
             10: { opacity: 0 },
             100: { opacity: 0, display: 'none' }
         } : {
-            25: { opacity: 0 },
+            10: { opacity: 0 },
             50: { opacity: 1 }
         },
         newNavIconStyle = navCollapsed ? { marginLeft: 6, fontSize: 28 } : { marginLeft: 22, fontSize: 24 },

+ 1 - 1
frontend/saas-web/app/view/main/MainModel.js

@@ -7,7 +7,7 @@ Ext.define('saas.view.main.MainModel', {
     alias: 'viewmodel.main',
 
     data: {
-        navWidth: 180,
+        navWidth: 160,
         smallNavWidth: 64,
     }
 });

+ 79 - 25
frontend/saas-web/app/view/money/report/OtherIODetail.js

@@ -10,61 +10,115 @@ Ext.define('saas.view.money.report.OtherIODetail', {
 
     viewName: 'money-report-otheriodetail',
 
-    groupField: null,
-    // listUrl: '/api/money/report/recDetail',
+    groupField: 'bl_bankname',
+    listUrl: '/api/money/report/otheriodetail',
     defaultCondition: null,
     reportTitle: '其他收支明细表',
-    QueryWidth: 0.25,
+    QueryWidth: 0.2,
     searchItems: [{
-        xtype: 'customerDbfindTrigger',
-        name: 'pi_custname',
-        fieldLabel: '资金账户',
-        columnWidth: 0.25
+        xtype: 'bandinfoDbfindTrigger',
+        name: 'bl_bankname',
+        emptyText: '资金账户',
+        columnWidth: 0.15,
+        dbfinds:[
+            {
+                from:'bk_bankname',to:'bl_bankname'
+            }]
     }, {
-        xtype : "remotecombo", 
-        storeUrl:'/api/document/customerkind/getCombo',
-        name : "cu_type", 
-        emptyText : "收支类别", 
-        columnWidth: 0.25,
-        hiddenBtn:true
+        // xtype : "remotecombo",
+        // storeUrl:'/api/document/customerkind/getCombo',
+        // name : "bl_kind",
+        // emptyText : "收支类别",
+        // columnWidth: 0.25,
+        // hiddenBtn:true,
+        xtype: 'combobox',
+        name: 'bl_kind',
+        queryMode: 'local',
+        displayField: 'display',
+        valueField: 'value',
+        emptyText : '收支类别',
+        editable:false,
+        columnWidth: 0.15,
+        store: Ext.create('Ext.data.ArrayStore', {
+            fields: ['value', 'display'],
+            data: [
+                ["ALL", "全部"],
+                ["其他支出单", "其他支出单"],
+                ["其他收入单", "其他收入单"]
+            ]
+        }),
+        getCondition: function(value) {
+            if(value == 'ALL'||value == null) {
+                return '1=1';
+            }else {
+                return 'bl_kind=\'' + value + '\'';
+            }
+        }
+
     }, {
         xtype: 'condatefield',
-        name: 'rb_date',
+        name: 'bl_date',
         fieldLabel: '日期',
-        columnWidth: 0.25
+        columnWidth: 0.5
     }],
 
     reportColumns: [{
         text: '日期',
-        dataIndex: 'pi_inoutno',
+        dataIndex: 'bl_date',
         width: 200
     }, {
         text: '单据编号',
-        dataIndex: 'pi_custcode',
+        dataIndex: 'bl_code',
         width: 200,
     }, {
         text: '收支类别',
-        dataIndex: 'pi_custname',
+        dataIndex: 'bl_kind',
         width: 200,
     }, {
         text: '资金账户',
-        dataIndex: 'pi_class',
+        dataIndex: 'bl_bankname',
         width: 150
     }, {
         text: '收入',
-        dataIndex: 'pu_buyername',
-        width: 150
+        dataIndex: 'bl_income',
+        width: 150,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
     }, {
         text: '支出',
-        dataIndex: 'rb_date',
-        width: 150
+        dataIndex: 'bl_spending',
+        width: 150,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
     }, {
         text: '往来单位',
-        dataIndex: 'pd_pdno',
+        dataIndex: 'bl_assname',
         width: 150,
     }, {
         text: '备注',
-        dataIndex: 'cu_beginaramount',
+        dataIndex: 'bl_remark',
         width: 150
     }]
 });

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

@@ -11,6 +11,8 @@ Ext.define('saas.view.money.report.PayDetail', {
     defaultCondition: null,
     reportTitle: '应付账款明细表',
     QueryWidth:0.25,
+    allowPaging: false,
+
     //筛选:供应商、日期(必填)
     searchItems: [ {
         xtype: 'vendorDbfindTrigger',
@@ -20,7 +22,7 @@ Ext.define('saas.view.money.report.PayDetail', {
     }, {
         xtype: 'conmonthfield',
         name: 'pd_ym',
-        fieldLabel: '单据日期',
+        fieldLabel: '期',
         columnWidth: 0.5
     }],
 
@@ -106,16 +108,43 @@ Ext.define('saas.view.money.report.PayDetail', {
                 var format = '0,000.' + xr.join();
                 return Ext.util.Format.number(v, format);
             },
-            summaryType: 'sum',
+            summaryType: 'last',
             summaryRenderer: function(v) {
                 var arr = (v + '.').split('.');
                 var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
                 var format = '0,000.' + xr.join();
                 return Ext.util.Format.number(v, format);
+            },
+            mySummaryRenderer: function(grid, column, datas) {
+                var store = grid.store,
+                dataIndex = column.dataIndex,
+                groupField = store.getGroupField(),
+                count = datas.length,
+                data = datas,
+                lasts = {},
+                keys = [],
+                arr = [];
+
+                for(var i = 0; i < count; i++) {
+                    var d = data[i];
+                    var n = Number(d[dataIndex]);
+                    var v = isNaN(n) ? 0 : n;
+
+                    lasts[groupField] = v;
+                }
+
+                keys = Ext.Object.getAllKeys(lasts);
+                arr = keys.map(function(key) {
+                    return lasts[key];
+                });
+
+                return Ext.Array.sum(arr);
             }
         }, {
             text: '供应商名称',
             dataIndex: 'pd_vendname',
             hidden:true
+        }, {
+            flex: 1
         }]
 });

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

@@ -12,6 +12,8 @@ Ext.define('saas.view.money.report.RecDetail', {
     defaultCondition: null,
     reportTitle: '应收账款明细',
     QueryWidth:0.25,
+    allowPaging: false,
+
     //筛选:客户、日期(必填)
     searchItems: [ {
         xtype: 'customerDbfindTrigger',
@@ -21,7 +23,7 @@ Ext.define('saas.view.money.report.RecDetail', {
     }, {
         xtype: 'conmonthfield',
         name: 'rd_ym',
-        fieldLabel: '单据日期',
+        fieldLabel: '期',
         columnWidth: 0.5
     }],
 
@@ -112,16 +114,43 @@ Ext.define('saas.view.money.report.RecDetail', {
                 var format = '0,000.' + xr.join();
                 return Ext.util.Format.number(v, format);
             },
-            summaryType: 'sum',
+            summaryType: 'last',
             summaryRenderer: function(v) {
                 var arr = (v + '.').split('.');
                 var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
                 var format = '0,000.' + xr.join();
                 return Ext.util.Format.number(v, format);
+            },
+            mySummaryRenderer: function(grid, column, datas) {
+                var store = grid.store,
+                dataIndex = column.dataIndex,
+                groupField = store.getGroupField(),
+                count = datas.length,
+                data = datas,
+                lasts = {},
+                keys = [],
+                arr = [];
+
+                for(var i = 0; i < count; i++) {
+                    var d = data[i];
+                    var n = Number(d[dataIndex]);
+                    var v = isNaN(n) ? 0 : n;
+
+                    lasts[groupField] = v;
+                }
+
+                keys = Ext.Object.getAllKeys(lasts);
+                arr = keys.map(function(key) {
+                    return lasts[key];
+                });
+
+                return Ext.Array.sum(arr);
             }
         }, {
             text: '客户名称',
             dataIndex: 'rd_custname',
             hidden:true
+        }, {
+            flex: 1
         }]
 });

+ 15 - 0
frontend/saas-web/app/view/money/report/TotalPayDetail.js

@@ -61,5 +61,20 @@ Ext.define('saas.view.money.report.TotalPayDetail', {
         dataIndex: 'vm_endamount',
         xtype: 'numbercolumn',
         width: 150,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        flex: 1
     }]
 });

+ 15 - 0
frontend/saas-web/app/view/money/report/TotalRecDetail.js

@@ -60,5 +60,20 @@ Ext.define('saas.view.money.report.TotalRecDetail', {
         dataIndex: 'cm_endamount',
         xtype: 'numbercolumn',
         width: 150,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        flex: 1
     }]
 });

+ 1 - 1
frontend/saas-web/app/view/purchase/purchase/FormPanel.js

@@ -46,7 +46,7 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
             },{
                 xtype : "datefield", 
                 name : "pu_delivery", 
-                fieldLabel : "交货日期",
+                fieldLabel : "需求日期",
                 allowBlank:false,
                 defaultValue: new Date(),
                 columnWidth : 0.25,

+ 1 - 1
frontend/saas-web/app/view/purchase/purchaseIn/QueryPanel.js

@@ -125,7 +125,7 @@ Ext.define('saas.view.purchase.purchaseIn.QueryPanel', {
             width: 150
         },{
             text: '总金额',
-            dataIndex: 'pd_ordertotal',
+            dataIndex: 'pi_total',
             width: 110
         },{
             text: '单据状态',

+ 3 - 2
frontend/saas-web/app/view/purchase/purchaseOut/QueryPanel.js

@@ -65,7 +65,8 @@ Ext.define('saas.view.purchase.purchaseOut.QueryPanel', {
         xtype: 'warehouseDbfindTrigger',
         name: 'pd_whname',
         fieldLabel: '仓库',
-        emptyText:'请输入仓库编号或名称'
+        emptyText:'请输入仓库编号或名称',
+        showDetail: true
     }, {
         xtype: 'textfield',
         name: 'pi_iocode',
@@ -124,7 +125,7 @@ Ext.define('saas.view.purchase.purchaseOut.QueryPanel', {
             width: 150
         },{
             text: '总金额',
-            dataIndex: 'pd_ordertotal',
+            dataIndex: 'pi_total',
             width: 110
         },{
             text: '单据状态',

+ 8 - 3
frontend/saas-web/app/view/sale/sale/QueryPanel.js

@@ -23,7 +23,8 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
         xtype: 'productDbfindTrigger',
         name: 'pr_detail',
         fieldLabel: '物料',
-        showDetail: true
+        showDetail: true,
+        emptyText:'输入物料编号或名称',
     }, {
         xtype: 'combobox',
         name: 'sa_statuscode',
@@ -54,6 +55,7 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
         fieldLabel: '业务状态',
         allowBlank: true,
         columnWidth: 0.25,
+        emptyText:'全部',
         datas: [
             ["TURNOUT", "已出库"],
             ["UNTURNOUT", "未出库"],
@@ -63,11 +65,13 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
     }, {
         xtype: 'employeeDbfindTrigger',
         name: 'sa_seller',
-        fieldLabel: '业务员'
+        fieldLabel: '业务员',
+        emptyText:'输入人员编号或名称',
     }, {
         xtype: 'employeeDbfindTrigger',
         name: 'creatorName',
         fieldLabel: '录入人',
+        emptyText:'输入人员编号或名称',
         getCondition: function(value) {
             if(!value) {
                 return '1=1';
@@ -78,7 +82,8 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
     }, {
         xtype: 'employeeDbfindTrigger',
         name: 'sa_auditman',
-        fieldLabel: '审核人'
+        fieldLabel: '审核人',
+        emptyText:'输入人员编号或名称',
     }],
     moreQueryFormItems: [],
     queryGridConfig: {

+ 4 - 4
frontend/saas-web/app/view/sale/saleIn/QueryPanel.js

@@ -52,12 +52,12 @@ Ext.define('saas.view.sale.saleIn.QueryPanel', {
     }, {
         xtype: 'multicombo',
         name: 'pi_prstatuscode',
-        fieldLabel: '款状态',
+        fieldLabel: '款状态',
         emptyText :'全部',
         datas: [
-            ["PAYNONE", "未付款"],
-            ["PAYPART", "部分付款"],
-            ["PAYALL", "已付款"]
+            ["RECNONE", "未收款"],
+            ["RECPART", "部分收款"],
+            ["RECALL", "已收款"]
         ]
     }, {
         xtype: 'warehouseDbfindTrigger',

+ 1 - 1
frontend/saas-web/app/view/sale/saleOut/QueryPanel.js

@@ -52,7 +52,7 @@ Ext.define('saas.view.sale.saleout.QueryPanel', {
     }, {
         xtype: 'multicombo',
         name: 'pi_prstatuscode',
-        fieldLabel: '款状态',
+        fieldLabel: '款状态',
         emptyText :'全部',
         datas: [
             ["RECNONE", "未收款"],

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

@@ -15,6 +15,7 @@ Ext.define('saas.view.stock.report.DataList', {
     QueryWidth: 0.4,
     printAble: false,
     exportAble: true,
+    queryMode: 'MAIN',
 
     searchItems: [{
         name: 'pr_code',
@@ -33,11 +34,11 @@ Ext.define('saas.view.stock.report.DataList', {
             return "(upper(wh_code) like '%" + v.toUpperCase() + "%' or upper(wh_description) like '%" + v.toUpperCase() + "%')";
         }
     }, {
+        xtype: 'checkboxfield',
         name: 'toggle',
-        xtype: 'checkbox',
         fieldLabel: '分仓库存',
         columnWidth: 0.1,
-        labelAlign: 'left',
+        labelAlign: 'right',
         labelWidth: 70,
         ignore: true,
         listeners: {
@@ -104,6 +105,13 @@ Ext.define('saas.view.stock.report.DataList', {
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         },
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
     }],
 
     reportColumns: [{
@@ -145,6 +153,13 @@ Ext.define('saas.view.stock.report.DataList', {
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         },
+        summaryType: 'sum',
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
     }, {
         flex: 1
     }],

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

@@ -12,6 +12,8 @@ Ext.define('saas.view.stock.report.Prodiodetail', {
     defaultCondition: null,
     reportTitle: '物料出入库明细表',
     QueryWidth:0.2,
+    showMySummary: false,
+
     //筛选:单据类型、物料、日期
     searchItems: [ {		
         xtype: 'textfield',

+ 1 - 1
frontend/saas-web/app/view/sys/guide/FormPanel.js

@@ -222,7 +222,7 @@ Ext.define('saas.view.sys.guide.FormPanel', {
         if(type=='warehouse'){
             message = '<span>因为新增物料时需要告知该物料所属仓库是哪里,所以需要首先进行仓库管理。</br>'+
             '录入完成后切换到“新手导航”页签继续下一步。</span>';
-            xtype = 'other-warehouse';
+            xtype = 'document-warehouse-datalist';
             title = '仓库资料'
         }
         if(type=='product'){

+ 2 - 1
frontend/saas-web/app/view/sys/power/FormPanel.js

@@ -23,9 +23,10 @@ Ext.define('saas.view.sys.power.FormPanel', {
         layout:'fit',
         height:'100%',
         width: '20%',
+        style:'border-right: 1px solid #35baf6;',
+        bodyStyle:'border-color: #ffffff;',
         useArrows: true
     },{
-        margin:'0 0 0 5',
         region:'center',
         layout:'fit',
         height:'100%',

+ 3 - 9
frontend/saas-web/app/view/sys/power/GroupGrid.js

@@ -4,9 +4,11 @@
 Ext.define('saas.view.sys.power.GroupGrid', {
     extend: 'Ext.grid.Panel',
     xtype: 'power-grid',
+    focusable:false,
     bind:{
         store: '{powergrid}'
     },
+    bufferedRenderer:false,
     tbar:['->',{
         xtype:'button',				
         text:'保存',
@@ -16,15 +18,7 @@ Ext.define('saas.view.sys.power.GroupGrid', {
     }],
     features : [Ext.create('Ext.grid.feature.Grouping',{
         collapsible:false,
-		showSummaryRow: false,
-        groupHeaderTpl: Ext.create('Ext.XTemplate',
-            '<div>{rows:this.formatName}</div>',
-            {
-                formatName: function(name) {
-                    return name[0].data.moduleName+'模块';
-                }
-            }
-        )
+        showSummaryRow: false
     })],
     dataUrl:'/api/account/role/power/resource',
     selModel: {

+ 5 - 4
frontend/saas-web/ext/packages/ux/src/feature/MySummary.js

@@ -30,12 +30,11 @@ Ext.define('Ext.ux.feature.MySummary', {
         me.callParent([grid]);
 
         grid.store.on('load', function() {
-            this.fireEvent('mysummarychange', grid);
+            this.fireEvent('mysummarychange', this);
         }, grid);
 
-        grid.on({
-            mysummarychange: me.refreshData,
-            scope: me
+        grid.on('mysummarychange', function() {
+            me.refreshData(grid); 
         });
 
         grid.on({
@@ -118,6 +117,8 @@ Ext.define('Ext.ux.feature.MySummary', {
 
         if(summarys.length == 0) {
             me.showSummaryRow = false;
+        }else {
+            me.showSummaryRow = true;
         }
 
         return summarys;

+ 2 - 2
frontend/saas-web/ext/packages/ux/src/feature/MySummary.scss

@@ -1,5 +1,5 @@
-.x-docked-mysummary {
-    border-color: #d0d0d0;
+div.x-component.x-docked-mysummary {
+    border-color: #999 !important;
     border-style: solid;
     background: #fff!important;
 

+ 0 - 112
frontend/saas-web/overrides/grid/buffer/BufferedRenderer.js

@@ -1,112 +0,0 @@
-Ext.define('saas.override.grid.buffer.BufferedRenderer', {
-    override: 'Ext.grid.plugin.BufferedRenderer',
-
-    setViewSize: function(viewSize, fromLockingPartner) {
-        var me = this,
-            store = me.store,
-            view = me.view,
-            ownerGrid,
-            rows = view.all,
-            elCount = rows.getCount(),
-            storeCount = store.getCount(),
-            start, end,
-            lockingPartner = me.view.lockingPartner && me.view.lockingPartner.bufferedRenderer,
-            diff = elCount - viewSize,
-            oldTop = 0,
-            maxIndex = Math.max(0, storeCount - 1),
-            // This is which end is closer to being visible therefore must be the first to have rows added
-            // or the opposite end from which rows get removed if shrinking the view.
-            pointyEnd = Ext.Number.sign((me.getFirstVisibleRowIndex() - rows.startIndex) - (rows.endIndex - me.getLastVisibleRowIndex()));
-        // Synchronize view sizes
-        if (lockingPartner && !fromLockingPartner) {
-            lockingPartner.setViewSize(viewSize, true);
-        }
-        diff = elCount - viewSize;
-        if (diff) {
-            // Must be set for getFirstVisibleRowIndex to work
-            me.scrollTop = me.scroller ? me.scroller.getPosition().y : 0;
-            me.viewSize = viewSize;
-            if (store.isBufferedStore) {
-                store.setViewSize(viewSize);
-            }
-            // If a store loads before we have calculated a viewSize, it loads me.defaultViewSize records.
-            // This may be larger or smaller than the final viewSize so the store needs adjusting when the view size is calculated.
-            if (elCount) {
-                // New start index should be current start index unless that's now too close to the end of the store
-                // to yield a full view, in which case work back from the end of the store.
-                // Ensure we don't go negative.
-                start = Math.max(0, Math.min(rows.startIndex, storeCount - viewSize));
-                // New end index works forward from the new start index ensuring we don't walk off the end
-                end = Math.min(start + viewSize - 1, maxIndex);
-                // Only do expensive adding or removal if range is not already correct
-                if (start === rows.startIndex && end === rows.endIndex) {
-                    // Needs rows adding to or bottom depending on which end is closest
-                    // to being visible (The pointy end)
-                    if (diff < 0) {
-                        me.handleViewScroll(pointyEnd);
-                    }
-                } else {
-                    // While changing our visible range, the locking partner must not sync
-                    if (lockingPartner) {
-                        lockingPartner.disable();
-                    }
-                    // View must expand
-                    if (diff < 0) {
-                        // If it's *possible* to add rows...
-                        if (storeCount > viewSize && storeCount > elCount) {
-                            // Grab the render range with a view to appending and prepending
-                            // nodes to the top and bottom as necessary.
-                            // Store's getRange API always has been inclusive of endIndex.
-                            store.getRange(start, end, {
-                                callback: function(newRecords, start, end) {
-                                    ownerGrid = view.ownerGrid;
-                                    // Append if necessary
-                                    if (end > rows.endIndex) {
-                                        rows.scroll(Ext.Array.slice(newRecords, rows.endIndex + 1, Infinity), 1, 0);
-                                    }
-                                    // Prepend if necessary
-                                    if (start < rows.startIndex) {
-                                        oldTop = rows.first(true);
-                                        rows.scroll(Ext.Array.slice(newRecords, 0, rows.startIndex - start), -1, 0);
-                                        // We just added some rows to the top of the rendered block
-                                        // We have to bump it up to keep the view stable.
-                                        me.bodyTop -= oldTop.offsetTop;
-                                    }
-                                    me.setBodyTop(me.bodyTop);
-                                    // The newly added rows must sync the row heights
-                                    if (lockingPartner && !fromLockingPartner && (ownerGrid.syncRowHeight || ownerGrid.syncRowHeightOnNextLayout)) {
-                                        lockingPartner.setViewSize(viewSize, true);
-                                        ownerGrid.syncRowHeights();
-                                    }
-                                }
-                            });
-                        } else // If not possible just refresh
-                        {
-                            me.refreshView(0);
-                        }
-                    } else // View size is contracting
-                    {
-                        // If removing from top, we have to bump the rendered block downwards
-                        // by the height of the removed rows.
-                        if (pointyEnd === 1) {
-                            oldTop = rows.item(rows.startIndex + diff, true).offsetTop;
-                        }
-                        // Clip the rows off the required end
-                        rows.clip(pointyEnd, diff);
-                        me.setBodyTop(me.bodyTop + oldTop);
-                    }
-                    if (lockingPartner) {
-                        lockingPartner.enable();
-                    }
-                }
-            }
-            // Update scroll range
-            me.refreshSize();
-        }
-        if(this.grid.xtype=='power-grid'){
-            viewSize = 61
-        }
-        return viewSize;
-    },
-});
-

+ 0 - 26
frontend/saas-web/overrides/grid/column/Widget.js

@@ -1,26 +0,0 @@
-Ext.define('saas.override.grid.column.Widget', {
-    override: 'Ext.grid.column.Widget',
-
-    onCellsResized: function(newWidth) {
-        var me = this,
-            liveWidgets = me.ownerGrid.getManagedWidgets(me.getId()),
-            len = liveWidgets.length,
-            view = me.getView(),
-            i, cell;
-        if (!me.isFixedSize && me.rendered && view && view.viewReady) {
-            cell = view.getEl().down(me.getCellInnerSelector());
-            if (cell) {
-                // Subtract innerCell padding width
-                newWidth -= parseInt(me.getCachedStyle(cell, 'padding-left'), 10) + parseInt(me.getCachedStyle(cell, 'padding-right'), 10);
-                for (i = 0; i < len; ++i) {
-                    if(liveWidgets[i]){
-                        liveWidgets[i].ownerLayout = null;
-                        liveWidgets[i].setWidth(newWidth);
-                        liveWidgets[i].ownerLayout = view.componentLayout;
-                    }
-                }
-            }
-        }
-    }
-
-});

+ 30 - 0
frontend/saas-web/overrides/grid/feature/Grouping.js

@@ -1,6 +1,36 @@
 Ext.define('saas.override.grid.feature.Grouping', {
     override: 'Ext.grid.feature.Grouping',
 
+    setup: function(rows, rowValues) {
+        var me = this,
+            data = me.refreshData,
+            view = rowValues.view,
+            // Need to check if groups have been added since init(), such as in the case of stateful grids.
+            isGrouping = view.isGrouping = !me.disabled && me.getGridStore().isGrouped(),
+            bufferedRenderer = view.bufferedRenderer;
+        me.skippedRows = 0;
+        if (bufferedRenderer) {
+            bufferedRenderer.variableRowHeight = view.hasVariableRowHeight() || isGrouping;
+        }
+        data.groupField = me.getGroupField();
+        data.header = me.getGroupedHeader(data.groupField);
+        data.doGrouping = isGrouping;
+        //权限界面的BUG 修改groupHeaderTpl属性会导致报错  暂时修改源码属性  hey
+        if(me.grid.xtype=='power-grid'){
+            me.groupHeaderTpl = Ext.create('Ext.XTemplate',
+                '<div>{rows:this.formatName}</div>',
+                {
+                    formatName: function(name) {
+                        return name[0].data.moduleName+'模块';
+                    }
+                }
+            )
+        }
+        rowValues.groupHeaderTpl = Ext.XTemplate.getTpl(me, 'groupHeaderTpl');
+        if (isGrouping && me.showSummaryRow) {
+            data.summaryData = me.generateSummaryData();
+        }
+    },
     getMetaGroup: function(group) {
         var me = this,
             id = me.getId == null ? me.id : me.getId(),

+ 60 - 0
frontend/saas-web/overrides/ux/TabCloseMenu.js

@@ -0,0 +1,60 @@
+Ext.define('saas.override.ux.TabCloseMenu', {
+    override: 'Ext.ux.TabCloseMenu',
+
+    cls: 'x-tab-close-menu',
+
+    createMenu : function() {
+        var me = this;
+ 
+        if (!me.menu) {
+            var items = [{
+                itemId: 'close',
+                text: me.closeTabText,
+                scope: me,
+                handler: me.onClose
+            }];
+ 
+            if (me.showCloseAll || me.showCloseOthers) {
+                items.push('-');
+            }
+ 
+            if (me.showCloseOthers) {
+                items.push({
+                    itemId: 'closeOthers',
+                    text: me.closeOthersTabsText,
+                    scope: me,
+                    handler: me.onCloseOthers
+                });
+            }
+ 
+            if (me.showCloseAll) {
+                items.push({
+                    itemId: 'closeAll',
+                    text: me.closeAllTabsText,
+                    scope: me,
+                    handler: me.onCloseAll
+                });
+            }
+ 
+            if (me.extraItemsHead) {
+                items = me.extraItemsHead.concat(items);
+            }
+ 
+            if (me.extraItemsTail) {
+                items = items.concat(me.extraItemsTail);
+            }
+ 
+            me.menu = Ext.create('Ext.menu.Menu', {
+                cls: me.cls,
+                items: items,
+                listeners: {
+                    hide: me.onHideMenu,
+                    scope: me
+                }
+            });
+        }
+ 
+        return me.menu;
+    },
+
+});

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

@@ -7,7 +7,7 @@
     "test": "echo \"Error: no test specified\" && exit 1",
     "dev": "sencha app watch",
     "build-dev": "sencha app build --build dev --testing",
-    "build-test": "sencha app build --build test --production",
+    "build-test": "sencha app build --build test --testing",
     "build": "sencha app build --build prod --production"
   },
   "keywords": [

二进制
frontend/saas-web/resources/images/auth-background.jpg


部分文件因为文件数量过多而无法显示