Browse Source

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

huangx 7 years ago
parent
commit
44d8a99dfe
90 changed files with 1489 additions and 163 deletions
  1. 10 7
      README.md
  2. 4 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  3. 4 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/EndProductMapper.java
  4. 8 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/EndProductServiceImpl.java
  5. 1 1
      applications/commons/commons-server/src/main/resources/application.yml
  6. 9 0
      applications/commons/commons-server/src/main/resources/logback-spring.xml
  7. 86 0
      applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml
  8. 12 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/CustomerController.java
  9. 6 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/CustomerMapper.java
  10. 3 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/EmployeeMapper.java
  11. 3 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/CustomerService.java
  12. 8 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java
  13. 22 9
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/EmployeeServiceImpl.java
  14. 2 2
      applications/document/document-server/src/main/resources/application.yml
  15. 9 0
      applications/document/document-server/src/main/resources/logback-spring.xml
  16. 5 0
      applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml
  17. 8 0
      applications/document/document-server/src/main/resources/mapper/EmployeeMapper.xml
  18. 5 2
      applications/money/money-server/src/main/resources/application.yml
  19. 9 0
      applications/money/money-server/src/main/resources/logback-spring.xml
  20. 1 1
      applications/purchase/purchase-server/src/main/resources/application.yml
  21. 9 0
      applications/purchase/purchase-server/src/main/resources/logback-spring.xml
  22. 1 1
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  23. 1 1
      applications/sale/sale-server/src/main/resources/application.yml
  24. 9 0
      applications/sale/sale-server/src/main/resources/logback-spring.xml
  25. 2 1
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/service/impl/MakeServiceImpl.java
  26. 1 1
      applications/storage/storage-server/src/main/resources/application.yml
  27. 9 0
      applications/storage/storage-server/src/main/resources/logback-spring.xml
  28. 10 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java
  29. 4 4
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  30. 8 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountMapper.java
  31. 8 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/AccountService.java
  32. 3 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  33. 5 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java
  34. 2 2
      base-servers/account/account-server/src/main/resources/application.yml
  35. 9 0
      base-servers/account/account-server/src/main/resources/logback-spring.xml
  36. 3 3
      base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml
  37. 3 0
      base-servers/account/account-server/src/main/resources/mapper/AccountMapper.xml
  38. 2 2
      base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml
  39. 1 1
      base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml
  40. 9 0
      base-servers/admin-server/src/main/resources/logback-spring.xml
  41. 2 2
      base-servers/auth/auth-server/src/main/resources/application.yml
  42. 9 0
      base-servers/auth/auth-server/src/main/resources/logback-spring.xml
  43. 9 0
      base-servers/eureka-server/src/main/resources/logback-spring.xml
  44. 2 2
      base-servers/file/file-server/src/main/resources/application.yml
  45. 9 0
      base-servers/file/file-server/src/main/resources/logback-spring.xml
  46. 1 1
      base-servers/gateway-server/src/main/resources/application.yml
  47. 9 0
      base-servers/gateway-server/src/main/resources/logback-spring.xml
  48. 2 2
      base-servers/mail/mail-server/src/main/resources/application.yml
  49. 9 0
      base-servers/mail/mail-server/src/main/resources/logback-spring.xml
  50. 1 1
      base-servers/socket/socket-server/src/main/resources/application.yml
  51. 9 0
      base-servers/socket/socket-server/src/main/resources/logback-spring.xml
  52. 1 1
      base-servers/ui-server/src/main/resources/application.yml
  53. 9 0
      base-servers/ui-server/src/main/resources/logback-spring.xml
  54. 8 0
      base-servers/zipkin-server/src/main/resources/logback-spring.xml
  55. 3 5
      frontend/saas-portal-web/config/dev.env.js
  56. 1 1
      frontend/saas-portal-web/config/index.js
  57. 1 1
      frontend/saas-portal-web/src/components/conenter/addgongsi.vue
  58. 4 6
      frontend/saas-portal-web/src/components/conenter/company.vue
  59. 2 1
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  60. 1 2
      frontend/saas-portal-web/src/components/conenter/home.vue
  61. 8 5
      frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue
  62. 0 0
      frontend/saas-portal-web/src/pages/remove-token/remove-token.html
  63. 0 0
      frontend/saas-portal-web/src/pages/remove-token/remove-token.js
  64. 0 0
      frontend/saas-portal-web/src/pages/remove-token/remove-token.vue
  65. 1 0
      frontend/saas-portal-web/src/store/index.js
  66. 3 0
      frontend/saas-web/app.json
  67. 8 7
      frontend/saas-web/app/Application.scss
  68. 1 0
      frontend/saas-web/app/view/core/base/GridPanel.js
  69. 4 31
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  70. 1 21
      frontend/saas-web/app/view/core/query/QueryPanel.js
  71. 8 1
      frontend/saas-web/app/view/document/bom/FormPanel.js
  72. 1 1
      frontend/saas-web/app/view/document/customer/FormPanel.js
  73. 7 4
      frontend/saas-web/app/view/document/kind/ChildForm.js
  74. 7 16
      frontend/saas-web/app/view/home/InfoCard.js
  75. 6 1
      frontend/saas-web/app/view/home/charts/MonthPurchase.js
  76. 212 0
      frontend/saas-web/app/view/home/infoCardList/InfoList.js
  77. 14 0
      frontend/saas-web/app/view/home/infoCardList/InfoList.scss
  78. 130 0
      frontend/saas-web/app/view/home/infoCardList/Payment.js
  79. 118 0
      frontend/saas-web/app/view/home/infoCardList/PurchaseIn.js
  80. 139 0
      frontend/saas-web/app/view/home/infoCardList/Recment.js
  81. 118 0
      frontend/saas-web/app/view/home/infoCardList/SaleOut.js
  82. 130 0
      frontend/saas-web/app/view/home/infoCardList/UnauditCheckIn.js
  83. 139 0
      frontend/saas-web/app/view/home/infoCardList/UnauditSaleOut.js
  84. 1 1
      frontend/saas-web/app/view/main/Main.js
  85. 6 1
      frontend/saas-web/app/view/sale/sale/QueryPanel.js
  86. 2 0
      frontend/saas-web/app/view/stock/make/FormPanelController.js
  87. 1 1
      frontend/saas-web/app/view/sys/account/DataList.js
  88. 1 1
      frontend/saas-web/app/view/sys/finish/DataList.js
  89. 8 3
      frontend/saas-web/app/view/viewport/ViewportController.js
  90. 9 0
      frontend/saas-web/index.html

+ 10 - 7
README.md

@@ -81,31 +81,34 @@
 
 | 数据库      | 类型   | 地址   |  账号  |  密码  |  说明  |
 | --------   | :-----: | :-----:  | :----:  | :----: | :------  |
-| saas_account | mysql | 192.168.253.12:3306 |  root  | select111*** |  账户中心  |
-| saas_auth | mysql | 192.168.253.12:3306 |  root  | select111*** |  鉴权系统  |
-| saas_file | mysql | 192.168.253.12:3306 |  root  | select111*** |  文件系统  |
-| saas_mail | mysql | 192.168.253.12:3306 |  root  | select111*** |  邮件系统  |
-| saas_biz | mysql | 192.168.253.12:3306 |  root  | select111*** |  业务系统  |
-| saas_ui | mongo | 192.168.253.12:27017 |    |  |  UI配置  |
+| saas_account | mysql | 192.168.0.172:3306 |  root  | select111*** |  账户中心  |
+| saas_auth | mysql | 192.168.0.172:3306 |  root  | select111*** |  鉴权系统  |
+| saas_file | mysql | 192.168.0.172:3306 |  root  | select111*** |  文件系统  |
+| saas_mail | mysql | 192.168.0.172:3306 |  root  | select111*** |  邮件系统  |
+| saas_biz | mysql | 192.168.0.172:3306 |  root  | select111*** |  业务系统  |
+| saas_ui | mongo | 192.168.0.183:27017 |    |  |  UI配置  |
 
 > 中间件
 
 | 类型 | 地址 | 账号 | 密码 | 说明 |
 | ---- | :----: | :----: | :----: | ---- |
 | rabbitmq | 192.168.0.176:5672 | saas | select123*** | 消息中间件 [控制台](http://192.168.0.176:15672)|
-| redis | 192.168.253.12:6379 | | | 内存数据库 |
+| redis | 192.168.0.182:6379 | | | 内存数据库 |
 
 
 > 服务器
 
 | IP      |  账号  |  密码  |  环境  |  资源  |
 | --------   | :----:  | :----: | :------:  | :------:  |
+| 192.168.0.172 |  root  | select123*** |  CentOS7, MySQL  | Cpu: 8, Mem: 16G, Disk: 80G |
 | 192.168.0.176 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.177 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.178 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.179 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.180 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 20G |
 | 192.168.0.181 |  root  | select123*** |  CentOS7, Docker  | Cpu: 4, Mem: 8G, Disk: 80G |
+| 192.168.0.182 |  root  | select123*** |  CentOS7, Redis  | Cpu: 2, Mem: 8G, Disk: 20G |
+| 192.168.0.183 |  root  | select123*** |  CentOS7, Mongo  | Cpu: 4, Mem: 8G, Disk: 50G |
 
 > 构建
 

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

@@ -41,6 +41,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     REPEAT_CODE(79502, "编号重复"),
     REPEAT_CUSTOMERCODE(79503, "客户名称或编号重复"),
     REPEAT_TEL(79504, "电话号码重复"),
+    REPEAT_EMNAMECODE(79505, "姓名或编号重复"),
     NO_DATA(79998, "未找到数据"),
     ILLEGAL_ID(79999, "id不正确"),
     PRODUCT_HAS_WAREHOUSE(79502, "存在物料默认仓库资料为该仓库,无法删除"),
@@ -94,6 +95,9 @@ public enum BizExceptionCode implements BaseExceptionCode {
     DOCUMENTS_UNAUDITED(74010,"存在未审核单据:%S"),
     BANK_AMOUNT_NOTENOUGHS(74011, "资金账号不足:%S"),
 
+    //反结账
+    EARLY_USERING(74012, "期初余额被使用,无法反结账"),
+
 
 
     //库存

+ 4 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/EndProductMapper.java

@@ -17,4 +17,8 @@ public interface EndProductMapper {
     List<MessagelogDTO> getListData(@Param("condition") String condition, @Param("companyId") Long companyId);
 
     void updatePeriodStatus(@Param("status") Long status,@Param("period") String period, @Param("companyId") Long companyId);
+
+    int checkPay(Long companyId);
+    int checkRec(Long companyId);
+    void deleteSub(Long companyId);
 }

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

@@ -58,6 +58,7 @@ public class EndProductServiceImpl implements EndProductService {
     @Override
     public String endAccount() {
         String period = endProductMapper.selectPeriod(BaseContextHolder.getCompanyId());
+
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("yearMonth", period);
         map.put("companyId", BaseContextHolder.getCompanyId());
@@ -71,6 +72,13 @@ public class EndProductServiceImpl implements EndProductService {
 
     @Override
     public void unEndAccount() {
+        int payc = endProductMapper.checkPay(BaseContextHolder.getCompanyId());
+        int recc = endProductMapper.checkRec(BaseContextHolder.getCompanyId());
+        if(payc !=0 || recc != 0){
+            throw new BizException(500, BizExceptionCode.EARLY_USERING.getMessage());
+        }
+        endProductMapper.deleteSub(BaseContextHolder.getCompanyId());
+
         String period = endProductMapper.selectUnPeriod(BaseContextHolder.getCompanyId());
         if (StringUtils.isEmpty(period)){
             throw new BizException(BizExceptionCode.BIZ_UNENDPRODUCT);

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

@@ -7,7 +7,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -31,4 +31,90 @@
     <update id="updatePeriodStatus" >
         update periodsdetail set pd_status=#{status} where pd_detno=#{period} and companyId=#{companyId}
     </update>
+
+    <select id="checkPay" parameterType="java.lang.Long" resultType="java.lang.Integer">
+        select count(1) from vendor where (ve_id,companyid) in (select pb_vendid,companyid from (
+        select pbd_ym,pb_vendid,paybalance.companyid from paybalance,paybalancedetail where pb_id=pbd_pbid and pbd_slkind='期初余额'
+        union all select vd_ym,vc_vendid,verification.companyid from verification,verificationdet where vc_id=vd_vcid and vd_slkind='期初余额'
+        and ifnull(vc_vendid,0)!=0
+        union all select vcd_ym,vc_vendid,verification.companyid from verification,verificationdetail where vc_id=vcd_vcid and vcd_slkind='期初余额' and ifnull(vc_vendid,0)!=0
+        union all select vd_ym,vc_turnvendid,verification.companyid from verification,verificationdet where vc_id=vd_vcid and vd_slkind='期初余额' and ifnull(vc_turnvendid,0)!=0
+        )a where a.pbd_ym =(select min(pd_detno) from periodsdetail where pd_status=0 and companyId = #{companyId} )) ;
+    </select>
+
+    <select id="checkRec" parameterType="java.lang.Long" resultType="java.lang.Integer">
+        SELECT
+        count(1)
+        FROM
+        customer
+        WHERE
+        (cu_id, companyid) IN (
+        SELECT
+        rb_custid,
+        companyid
+        FROM
+        (
+        SELECT
+        rbd_ym,
+        rb_custid,
+        recbalance.companyid
+        FROM
+        recbalance,
+        recbalancedetail
+        WHERE
+        rb_id = rbd_rbid
+        AND rbd_slkind = '期初余额'
+        UNION ALL
+        SELECT
+        vd_ym,
+        vc_custid,
+        verification.companyid
+        FROM
+        verification,
+        verificationdet
+        WHERE
+        vc_id = vd_vcid
+        AND vd_slkind = '期初余额'
+        AND ifnull(vc_custid, 0) != 0
+        UNION ALL
+        SELECT
+        vcd_ym,
+        vc_custid,
+        verification.companyid
+        FROM
+        verification,
+        verificationdetail
+        WHERE
+        vc_id = vcd_vcid
+        AND vcd_slkind = '期初余额'
+        AND ifnull(vc_custid, 0) != 0
+        UNION ALL
+        SELECT
+        vd_ym,
+        vc_turncustid,
+        verification.companyid
+        FROM
+        verification,
+        verificationdet
+        WHERE
+        vc_id = vd_vcid
+        AND vd_slkind = '期初余额'
+        AND ifnull(vc_turncustid, 0) != 0
+        ) a
+        WHERE
+        a.rbd_ym = (
+        SELECT
+        min(pd_detno)
+        FROM
+        periodsdetail
+        WHERE
+        pd_status = 0 and companyid = #{companyId}
+        )
+        )
+    </select>
+
+    <delete id="deleteSub" parameterType="java.lang.Long" >
+    DELETE from subledger where sl_ym =
+    (select min(pd_detno) from periodsdetail where pd_status=0 and companyid=#{companyId}) and companyid = #{companyId}
+  </delete>
 </mapper>

+ 12 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/CustomerController.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.document.controller;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
+import com.usoftchina.saas.commons.dto.ComboDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.document.dto.CustomerFormDTO;
@@ -12,6 +13,8 @@ import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * Created by zdw
  * 2018-10-23 11:39.
@@ -101,6 +104,15 @@ public class CustomerController {
         return Result.success();
     }
 
+
+    @GetMapping("/getAddressCombo")
+    public Result getCombo(Long id){
+        List<ComboDTO> comboDTOList = customerService.getAddressCombo(id);
+        return Result.success(comboDTOList);
+    }
+
+
+
     /**
      * 客户资料批量删除
      *

+ 6 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/CustomerMapper.java

@@ -1,9 +1,11 @@
 package com.usoftchina.saas.document.mapper;
 
 import com.usoftchina.saas.base.mapper.CommonBaseMapper;
+import com.usoftchina.saas.commons.dto.ComboDTO;
 import com.usoftchina.saas.document.entities.Customer;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
 import java.util.Map;
 
 public interface CustomerMapper extends CommonBaseMapper<Customer> {
@@ -24,13 +26,15 @@ public interface CustomerMapper extends CommonBaseMapper<Customer> {
     Integer validateCodeWhenUpdate(@Param("code") String code, @Param("id") Long id,
                                    @Param("companyId") Long companyId);
 
-    int validNameAndCodeWhenInsert(Customer record);
+    int validNameAndCodeWhenInsert(@Param("cu_code") String cu_code,@Param("cu_name") String cu_name,@Param("companyId") Long companyId);
 
-    int validNameAndCodeWhenUpdate(Customer record);
+    int validNameAndCodeWhenUpdate(@Param("cu_code") String cu_code,@Param("cu_name") String cu_name,@Param("id") Long cu_id,@Param("companyId") Long companyId);
 
     int validFinish(@Param("id") Long id,@Param("companyId") Long companyId);
 
     void check(Map<String, Object> map);
 
     int validNameAndCodeWhenRelated(Customer customer);
+
+    List<ComboDTO> getCombo(@Param("id") Long id,@Param("companyId") Long companyId);
 }

+ 3 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/EmployeeMapper.java

@@ -29,4 +29,7 @@ public interface EmployeeMapper extends CommonBaseMapper<Employee> {
     Integer validatePhoneWhenUpdate(@Param("phone") String phone, @Param("id") Long id, @Param("companyId") Long company);
 
 
+    Integer validateNameAndCodeWhenInsert(@Param("code") String code,@Param("name") String em_name,@Param("companyId") Long companyId);
+
+    Integer validateNameAndCodeWhenUpdate(@Param("code") String code,@Param("name") String em_name,@Param("id") Long em_id,@Param("companyId") Long id);
 }

+ 3 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/CustomerService.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.document.service;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.service.CommonBaseService;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
+import com.usoftchina.saas.commons.dto.ComboDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.document.dto.CustomerFormDTO;
@@ -41,4 +42,6 @@ public interface CustomerService extends CommonBaseService<CustomerMapper, Custo
     void batchOpen(BatchDealBaseDTO baseDTOs);
 
     PageInfo<CustomerList> getDbfind(PageRequest page, ListReqDTO listReqDTO);
+
+    List<ComboDTO> getAddressCombo(Long id);
 }

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

@@ -6,6 +6,7 @@ import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
+import com.usoftchina.saas.commons.dto.ComboDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.commons.exception.BizExceptionCode;
@@ -160,7 +161,7 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
         //新增
         if (StringUtils.isEmpty(cu_id) || "0".equals(cu_id.toString())) {
             //检查名称和编号
-            int count = getMapper().validNameAndCodeWhenInsert(customer);
+            int count = getMapper().validNameAndCodeWhenInsert(cu_code,customer.getCu_name(),companyId);
             if (count>0) {
                 throw new BizException(BizExceptionCode.REPEAT_CUSTOMERCODE);
             }
@@ -197,7 +198,7 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
             //更新
         }else {
             //检查名称和编号
-            int count = getMapper().validNameAndCodeWhenUpdate(customer);
+            int count = getMapper().validNameAndCodeWhenUpdate(cu_code,customer.getCu_name(),customer.getId(),companyId);
             if (count > 0) {
                 throw new BizException(BizExceptionCode.REPEAT_CUSTOMERCODE);
             }
@@ -479,6 +480,11 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
         return pageInfo;
     }
 
+    @Override
+    public List<ComboDTO> getAddressCombo(Long id) {
+        return getMapper().getCombo(id,BaseContextHolder.getCompanyId());
+    }
+
 
     private List<CustomerList> getListByMode(ListReqDTO req) {
         List<CustomerList> list = null;

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

@@ -65,29 +65,39 @@ public class EmployeeServiceImpl extends CommonBaseServiceImpl<EmployeeMapper, E
     @Override
     public DocBaseDTO saveFormData(Employee employee) {
         DocBaseDTO docBaseDTO = null;
+        String code = pushMaxnubmer(employee.getEm_code(), employee.getId());
         if(employee.getId() == 0){
-            String code = pushMaxnubmer(employee.getEm_code(), employee.getId());
-            employee.setCompanyId(BaseContextHolder.getCompanyId());
-            employee.setCreatorId(BaseContextHolder.getUserId());
-            employee.setCreateTime(new Date());
-            employee.setCreatorName(BaseContextHolder.getUserName());
+            //检查名称和编号
+            int count = getMapper().validateNameAndCodeWhenInsert(code,employee.getEm_name(),BaseContextHolder.getCompanyId());
+            if (count>0) {
+                throw new BizException(BizExceptionCode.REPEAT_EMNAMECODE);
+            }
             //检查电话号码
-            int count = getMapper().validatePhoneWhenInsert(employee.getEm_mobile(),BaseContextHolder.getCompanyId());
+            count = getMapper().validatePhoneWhenInsert(employee.getEm_mobile(),BaseContextHolder.getCompanyId());
             if (count>0) {
                 throw new BizException(BizExceptionCode.REPEAT_TEL);
             }
+            employee.setCompanyId(BaseContextHolder.getCompanyId());
+            employee.setCreatorId(BaseContextHolder.getUserId());
+            employee.setCreateTime(new Date());
+            employee.setCreatorName(BaseContextHolder.getUserName());
             getMapper().insertSelective(employee);
             docBaseDTO = generateMsgObj(employee.getId(), code);
             //记录LOG
             messageLogService.save(docBaseDTO);
         }else{
-            employee.setUpdaterId(BaseContextHolder.getUserId());
-            employee.setUpdateTime(new Date());
+            //检查名称和编号
+            int count = getMapper().validateNameAndCodeWhenUpdate(code,employee.getEm_name(),employee.getId(),BaseContextHolder.getCompanyId());
+            if (count>0) {
+                throw new BizException(BizExceptionCode.REPEAT_EMNAMECODE);
+            }
             //检查电话号码
-            int count = getMapper().validatePhoneWhenUpdate(employee.getEm_mobile(),employee.getId(),BaseContextHolder.getCompanyId());
+            count = getMapper().validatePhoneWhenUpdate(employee.getEm_mobile(),employee.getId(),BaseContextHolder.getCompanyId());
             if (count>0) {
                 throw new BizException(BizExceptionCode.REPEAT_TEL);
             }
+            employee.setUpdaterId(BaseContextHolder.getUserId());
+            employee.setUpdateTime(new Date());
             getMapper().updateByPrimaryKeySelective(employee);
             docBaseDTO = generateMsgObj(employee.getId(), employee.getEm_code());
             //记录LOG
@@ -199,6 +209,9 @@ public class EmployeeServiceImpl extends CommonBaseServiceImpl<EmployeeMapper, E
             Integer count = "0".equals(String.valueOf(id)) ? getMapper().validateCodeWhenInsert(code, companyId) :
                     getMapper().validateCodeWhenUpdate(code, id, companyId);
             em_code =  maxnumberService.pushMaxnubmer(count, code, BillCodeSeq.EMPLOYEE.getCaller()).getData();
+            if (em_code==null){
+                em_code = code;
+            }
         }
         return em_code;
     }

+ 2 - 2
applications/document/document-server/src/main/resources/application.yml

@@ -9,7 +9,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:
@@ -21,7 +21,7 @@ spring:
   messages:
     basename: i18n/messages
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   rabbitmq:
     host: 192.168.0.176

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

@@ -104,4 +104,13 @@
         </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>

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

@@ -393,4 +393,9 @@
   </select>
 
 
+  <select id="getCombo" resultType="com.usoftchina.saas.commons.dto.ComboDTO">
+    SELECT ca_address display,ca_address value FROM customeraddress WHERE ca_cuid=#{id} and COMPANYID=#{companyId} order by ca_id desc
+  </select>
+
+
 </mapper>

+ 8 - 0
applications/document/document-server/src/main/resources/mapper/EmployeeMapper.xml

@@ -236,4 +236,12 @@
   </select>
 
 
+  <select id="validateNameAndCodeWhenInsert" resultType="int">
+    select count(*) from Employee where (em_code = #{code} or em_name = #{name}) and companyId =#{companyId}
+  </select>
+  <select id="validateNameAndCodeWhenUpdate" resultType="int" >
+    select count(*) from Employee where (em_code = #{code} or em_name = #{name}) and em_id !=#{id} and companyId =#{companyId}
+  </select>
+
+
 </mapper>

+ 5 - 2
applications/money/money-server/src/main/resources/application.yml

@@ -7,7 +7,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:
@@ -19,7 +19,7 @@ spring:
   messages:
     basename: i18n/messages
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   rabbitmq:
     host: 192.168.0.176
@@ -69,5 +69,8 @@ info:
 mybatis:
   type-aliases-package: com.usoftchina.saas.money.po
   mapper-locations: classpath:mapper/*.xml
+logging:
+  level:
+     com.usoftchina.saas.money.mapper : debug
 auth:
   public-key: auth/pub.key

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

@@ -104,4 +104,13 @@
         </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>

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

@@ -9,7 +9,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

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

@@ -104,4 +104,13 @@
         </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>

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

@@ -220,7 +220,6 @@ public class SaleServiceImpl implements SaleService{
     }
 
     @Override
-    @Transactional
     public DocBaseDTO audit(SaleFormDTO formData) {
         Long id = null;
         DocBaseDTO baseDTO = null;
@@ -235,6 +234,7 @@ public class SaleServiceImpl implements SaleService{
         return baseDTO;
     }
 
+    @Transactional
     private void singleAudit(Long id) {
         /*Sale sale = new Sale();
         //生成更新对象

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

@@ -7,7 +7,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

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

@@ -104,4 +104,13 @@
         </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>

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

@@ -101,9 +101,10 @@ public class MakeServiceImpl extends CommonBaseServiceImpl<MakeMapper, Make> imp
         if(make.getId() == 0){
             //保存主表
             make.setCompanyId(BaseContextHolder.getCompanyId());
-
+            make.setCreateTime(new Date());
             make.setMa_code(code);
             getMapper().insertSelective(make);
+            ma_id = make.getId();
             //录入人
             getMapper().updateCreator(userId, userName, ma_id);
             if (makeMaterialList.size() > 0) {

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

@@ -9,7 +9,7 @@ spring:
       password: select111***
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://192.168.0.172:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

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

@@ -104,4 +104,13 @@
         </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>

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

@@ -43,6 +43,16 @@ public class CompanyRspDTO implements Serializable {
 
     private Long adminId;
 
+    private String adminEmail;
+
+    public String getAdminEmail() {
+        return adminEmail;
+    }
+
+    public void setAdminEmail(String adminEmail) {
+        this.adminEmail = adminEmail;
+    }
+
     public String getType() {
         return type;
     }

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

@@ -420,9 +420,9 @@ public class AccountController {
      */
     @PostMapping("/disable")
     public Result disableAccount(@RequestParam long accountId) {
-        accountService.disable(accountId);
+        //accountService.disable(accountId);
         //移除账户绑定的企业关系
-        accountService.unbindCompany(accountId, BaseContextHolder.getCompanyId());
+        accountService.updateBindCompanyStatus(accountId, BaseContextHolder.getCompanyId(), "0");
         //同步到优软云
         Long userUU = accountService.findByPrimaryKey(accountId).getUu();
         Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
@@ -439,9 +439,9 @@ public class AccountController {
      */
     @PostMapping("/enable")
     public Result enableAccount(@RequestParam long accountId) {
-        accountService.enable(accountId);
+        //accountService.enable(accountId);
         //添加账户绑定的企业关系
-        accountService.bindCompany(accountId, BaseContextHolder.getCompanyId());
+        accountService.updateBindCompanyStatus(accountId, BaseContextHolder.getCompanyId(), "1");
         //同步到优软云
         Long userUU = accountService.findByPrimaryKey(accountId).getUu();
         Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();

+ 8 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountMapper.java

@@ -122,4 +122,12 @@ public interface AccountMapper {
      * @return
      */
     int findByUsernameOrMobileOrEmail(@Param("username") String username, @Param("mobile") String mobile, @Param("email") String email);
+
+    /**
+     * 更新账户公司绑定状态
+     * @param accountId
+     * @param companyId
+     * @param status
+     */
+    void updateBindCompanyStatus(@Param("accountId") Long accountId, @Param("companyId") Long companyId, @Param("status") String status);
 }

+ 8 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/AccountService.java

@@ -194,4 +194,12 @@ public interface AccountService {
      * @return
      */
     boolean findByUsernameOrMobileOrEmail(String username, String mobile, String email);
+
+    /**
+     * 更新账户公司的绑定状态
+     * @param accountId
+     * @param companyId
+     * @param status
+     */
+    void updateBindCompanyStatus(Long accountId, Long companyId, String status);
 }

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

@@ -75,6 +75,7 @@ public class AccountCenterServiceImpl implements AccountCenterService {
             company.setBusinessCode(StringUtils.createBusinessCode());
         }
         companyService.save(company);
+        companyService.bindApp(company.getId(), "trade-app");
         //b. 同步企业信息到优软云 ——>  创建企业
         if ("0".equals(type)) {
             String result = ssoUserSpaceApi.registerLogin(company.getName(), company.getBusinessCode(), Long.parseLong(accountRegDTO.getUu()));
@@ -100,7 +101,7 @@ public class AccountCenterServiceImpl implements AccountCenterService {
         if (role != null) {
             accountService.bindRole(accountId, role.getId());
         }
-        return Result.success();
+        return Result.success(company.getId());
     }
 
     @Override
@@ -163,7 +164,7 @@ public class AccountCenterServiceImpl implements AccountCenterService {
                         ssoUserSpace.getRegAddress(),
                         false,
                         false,
-                        ssoUserSpace.getSpaceUU().toString(),
+                        ssoUserSpace.getSpaceUU()!=null ? ssoUserSpace.getSpaceUU().toString() : "0",
                         ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getVipName() : null,
                         0L,
                         ssoUserSpace.getProfession()

+ 5 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java

@@ -209,4 +209,9 @@ public class AccountServiceImpl implements AccountService {
         return accountMapper.findByUsernameOrMobileOrEmail(username, mobile, email) > 0;
     }
 
+    @Override
+    public void updateBindCompanyStatus(Long accountId, Long companyId, String status) {
+        accountMapper.updateBindCompanyStatus(accountId, companyId, status);
+    }
+
 }

+ 2 - 2
base-servers/account/account-server/src/main/resources/application.yml

@@ -24,7 +24,7 @@ spring:
       probability: 1.0
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_account?characterEncoding=utf-8&useSSL=false
+    url: jdbc:mysql://192.168.0.172:3306/saas_account?characterEncoding=utf-8&useSSL=false
     username: root
     password: select111***
     hikari:
@@ -36,7 +36,7 @@ spring:
   messages:
     basename: i18n/messages
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.usoftchina.saas.account.mapper.AccountCompanyMapper">
     <insert id="insert">
-        insert into ac_account_company(account_id,company_id) values (#{accountId}, #{companyId})
+        insert into ac_account_company(account_id,company_id,status) values (#{accountId}, #{companyId}, 1)
     </insert>
     <delete id="delete">
         delete from ac_account_company where account_id=#{accountId} and company_id=#{companyId}
@@ -14,11 +14,11 @@
         delete from ac_account_company where company_id=#{companyId}
     </delete>
     <select id="getCompanyListByAccountMobile" resultType="com.usoftchina.saas.account.dto.CompanyRspDTO">
-        SELECT cmp.id,cmp.name,cmp.uu,cmp.business_code businessCode,cmp.address,accmp.is_default default_,'1' saas_,aci.realname admin,cmp.creator_id adminId,cmp.type from ac_company cmp
+        SELECT cmp.id,cmp.name,cmp.uu,cmp.business_code businessCode,cmp.address,accmp.is_default default_,'1' saas_,aci.realname admin,cmp.creator_id adminId,cmp.type,ac.email adminEmail from ac_company cmp
         left join ac_account_company accmp on accmp.company_id=cmp.id
         left join ac_account ac on ac.id = accmp.account_id
         left join ac_account aci on aci.id = cmp.creator_id
-        where ac.mobile = #{mobile}
+        where ac.mobile = #{mobile} and accmp.status = 1
         order by is_default desc
     </select>
     <update id="unBindDefault" >

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/AccountMapper.xml

@@ -210,4 +210,7 @@
         SELECT COUNT(*) FROM AC_ACCOUNT
         WHERE USERNAME = #{username} OR MOBILE = #{mobile} OR EMAIL = #{email};
     </select>
+    <update id="updateBindCompanyStatus">
+        UPDATE AC_ACCOUNT_COMPANY SET STATUS = #{status} WHERE ACCOUNT_ID = #{accountId} AND COMPANY_ID = #{companyId}
+    </update>
 </mapper>

+ 2 - 2
base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml

@@ -17,7 +17,7 @@
         delete from ac_account_role where company_id=#{companyId}
     </delete>
     <select id="selectAccountRole" resultType="com.usoftchina.saas.account.dto.AccountRoleDTO">
-        SELECT a.id id,a.username,a.realname,a.email,a.mobile,GROUP_CONCAT(c.name) roleNames,GROUP_CONCAT(c.id) roleIds,a.enabled
+        SELECT a.id id,a.username,a.realname,a.email,a.mobile,GROUP_CONCAT(c.name) roleNames,GROUP_CONCAT(c.id) roleIds,d.status enabled
         FROM ac_account a
         left join ac_account_company d on a.id = d.account_id
         left join ac_account_role b on a.id=b.account_id and d.company_id = b.company_id
@@ -30,7 +30,7 @@
                 AND d.COMPANY_ID = #{companyId}
             </if>
         </where>
-        group by a.id,a.username,a.realname,a.email,a.mobile,a.enabled
+        group by a.id,a.username,a.realname,a.email,a.mobile,d.status
     </select>
     <delete id="unBindRolesById" >
         DELETE FROM AC_ACCOUNT_ROLE WHERE ACCOUNT_ID = #{id} and company_id = #{companyId}

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

@@ -104,7 +104,7 @@
         select <include refid="baseColumns"/> from ac_role,ac_account_role
         where ac_role.id=ac_account_role.role_id and ac_account_role.account_id=#{accountId,jdbcType=BIGINT}
     </select>
-    <select id="findManagerByCompanyId" parameterType="int" resultType="com.usoftchina.saas.account.po.Role">
+    <select id="findManagerByCompanyId" resultType="com.usoftchina.saas.account.po.Role">
         SELECT * FROM AC_ROLE WHERE COMPANY_ID = #{companyId} AND TYPE = 0 limit 1
     </select>
 </mapper>

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

@@ -103,4 +103,13 @@
         </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>

+ 2 - 2
base-servers/auth/auth-server/src/main/resources/application.yml

@@ -24,7 +24,7 @@ spring:
       probability: 1.0
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_auth?characterEncoding=utf-8&useSSL=false
+    url: jdbc:mysql://192.168.0.172:3306/saas_auth?characterEncoding=utf-8&useSSL=false
     username: root
     password: select111***
     hikari:
@@ -36,7 +36,7 @@ spring:
   messages:
     basename: i18n/messages
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -109,4 +109,13 @@
         </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>

+ 2 - 2
base-servers/file/file-server/src/main/resources/application.yml

@@ -22,7 +22,7 @@ spring:
       probability: 1.0
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_file?characterEncoding=utf-8&useSSL=false
+    url: jdbc:mysql://192.168.0.172:3306/saas_file?characterEncoding=utf-8&useSSL=false
     username: root
     password: select111***
     hikari:
@@ -34,7 +34,7 @@ spring:
   messages:
     basename: i18n/messages
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -109,7 +109,7 @@ spring:
         predicates:
         - Path=/ws/**
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss

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

@@ -110,4 +110,13 @@
         </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>

+ 2 - 2
base-servers/mail/mail-server/src/main/resources/application.yml

@@ -22,7 +22,7 @@ spring:
       probability: 1.0
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.253.12:3306/saas_mail?characterEncoding=utf-8&useSSL=false
+    url: jdbc:mysql://192.168.0.172:3306/saas_mail?characterEncoding=utf-8&useSSL=false
     username: root
     password: select111***
     hikari:
@@ -34,7 +34,7 @@ spring:
   messages:
     basename: i18n/messages
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -23,7 +23,7 @@ spring:
     sampler:
       probability: 1.0
   redis:
-    host: 192.168.253.12
+    host: 192.168.0.182
     port: 6379
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -24,7 +24,7 @@ spring:
       probability: 1.0
   data:
     mongodb:
-      uri: mongodb://192.168.253.12:27017/saas_ui
+      uri: mongodb://192.168.0.183:27017/saas_ui
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss
     time-zone: GMT+8

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

@@ -110,4 +110,13 @@
         </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>

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

@@ -103,4 +103,12 @@
         </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>

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

@@ -8,11 +8,9 @@ module.exports = merge(prodEnv, {
     // 前端地址
     web: '"http://192.168.0.181"',
     // 后端接口网关
-    // api: '"http://192.168.0.181:8560"',
-    //api:'"http://192.168.253.58:8560"',
-    api: '"https://saas-api.usoftchina.com"',
+    api: '"http://192.168.0.181:8560"',
+    // api:'"http://192.168.253.31:8560"',
     // 账户中心接口
-    // sso: '"http://192.168.253.12:32323"'
-    sso: '"https://sso.ubtob.com"'
+    sso: '"http://192.168.253.12:32323"'
   }
 })

+ 1 - 1
frontend/saas-portal-web/config/index.js

@@ -14,7 +14,7 @@ module.exports = {
 
     // Various Dev Server settings
     // host: 'localhost', // can be overwritten by process.env.HOST
-    host: '192.168.253.183', // can be overwritten by process.env.HOST
+    host: '127.0.0.1', // can be overwritten by process.env.HOST
     port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
     autoOpenBrowser: false,
     errorOverlay: true,

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

@@ -69,7 +69,7 @@
                         <li><span class="qy-biaoti">手机号</span><span>{{mytoken.account.mobile}}</span></li>
                         <li style='margin:0'>
                             <span class="qy-biaoti">邮箱</span>
-                            <input class="inpind" @change="email" ref="email" type="email">
+                            <input class="inpind" @change="email" ref="email" type="email" value="">
                             <div class="qy-Tips Tips-buttom"><span style="color:red">{{Email}}</span></div>
                         </li>
                     </ul>

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

@@ -107,8 +107,7 @@
         },
         computed :{
             setTokenPage() {
-                return 'http://192.168.253.39/set-token.html'
-                //return this.$url.web + '/set-token.html'
+                return this.$url.web + '/set-token.html'
             }
         },
         watch:{
@@ -151,6 +150,7 @@
                     }
                     this.$store.commit('Loginfalse')
                     // console.log(res.data.data)
+                    this.$store.state.email = this.arr[0].adminEmail
                 })
                 .catch(err=>{
                     // console.log("请求失败",err)
@@ -205,10 +205,8 @@
                     session.account.companyId=id;
                     session.span = session.timestamp - new Date().getTime();
                     session.token=mytoken;
-                    // frame.postMessage(JSON.stringify(session), '*');
-                    // window.location.href = this.$url.web
                     frame.postMessage(JSON.stringify(session), '*');
-                    window.open('http://192.168.253.39:1841/#main','_blank');
+                    window.location.href = this.$url.web
                 })
                 .catch(err=>{
                     // console.log('请求失败',err)
@@ -245,7 +243,7 @@
                 let account = {'realname':name,'email':email,'mobile':mobile, 'uu':uu}
                 // let id = this.saasid;
                 this.$ajax({
-                    url: "http://192.168.253.31:8560/api/account/accountCenter/companyAccount/save",
+                    url: this.$url.api+"/api/account/accountCenter/companyAccount/save",
                     method: 'post',
                     data: {
                         companyRegDTO:company,

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

@@ -61,7 +61,7 @@
                                     <span>UU号</span><span>{{mytoken.uu}}</span>
                                 </li>
                                 <li>
-                                    <span>邮箱</span><span>{{mytoken.email}}</span>
+                                    <span>邮箱</span><span>{{email}}</span>
                                 </li>
                                 <li>
                                     <span>手机号</span><span>{{mytoken.mobile}}</span>
@@ -111,6 +111,7 @@ import { setTimeout } from 'timers';
             return{
                 nowindex: 0,//tab切换
                 tianjiaqiye: true,//添加企业切换
+                email: this.$store.state.email,
                 mytoken: JSON.parse(localStorage.getItem('app-state-session')).account,//本地储存的用户信息
                 tab: [
                     {name: '企业信息'},

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

@@ -430,8 +430,7 @@
                 session.account = account
                 const frame = window.frames[window.frames.length - 1]
                 frame.postMessage(JSON.stringify(session), '*')
-                // window.location.href = me.$url.web
-                    window.open('http://192.168.253.39:1841/#main','_blank');
+                window.location.href = me.$url.web
                 // console.log("请求成功",res)
                 phone = ''
             })

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

@@ -25,7 +25,7 @@
                     <ul>
                         <li><span class="qy-biaoti">姓名</span><span>{{content.admin}}</span></li>
                         <li><span class="qy-biaoti">手机号</span><span>{{mytoken.account.mobile}}</span></li>
-                        <li><span class="qy-biaoti">邮箱</span><span>{{mytoken.account.email}}</span></li>
+                        <li><span class="qy-biaoti">邮箱</span><span>{{content.adminEmail}}</span></li>
                     </ul>
                 </div>
             </div>
@@ -120,13 +120,15 @@
         },
         methods: {
             selects(){
-                let selects = this.$refs.qyindustry
-                let options = selects.options
+                let selects = this.$refs.qyindustry;
+                let options = selects.options;
                 for (let i = 0; i < options.length; i++) {
                     if (options[i].innerHTML == this.content.type) {
                         options[i].selected = true
                     }
-                }
+                };
+                let email = this.$refs.email;
+                email.value = this.content.adminEmail;
             },
             //修改企业信息
             xiugaiqiye(){
@@ -187,7 +189,8 @@
                         if (res.data.success) {
                             document.documentElement.scrollTop = 0;
                             this.xiugai = true;
-                            this.content.type = qyindustry
+                            this.content.type = qyindustry;
+                            this.content.adminEmail = email
                         };
                     })
                     .catch(err=>{

+ 0 - 0
frontend/saas-portal-web/src/pages/cell/cell.html → frontend/saas-portal-web/src/pages/remove-token/remove-token.html


+ 0 - 0
frontend/saas-portal-web/src/pages/cell/cell.js → frontend/saas-portal-web/src/pages/remove-token/remove-token.js


+ 0 - 0
frontend/saas-portal-web/src/pages/cell/cell.vue → frontend/saas-portal-web/src/pages/remove-token/remove-token.vue


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

@@ -5,6 +5,7 @@ Vue.use(Vuex)
 export default new Vuex.Store({
     state:{
         data: [],
+        email:'',
         isAutoLogin: false,
     },
     mutations:{

+ 3 - 0
frontend/saas-web/app.json

@@ -295,6 +295,7 @@
             "type": "yui"
         },
         "server": {
+            "accountCenter":"https://saas.usoftchina.com",
             "basePath": "https://saas-api.usoftchina.com",
             "urlPattern": "^\/api\/"
         }
@@ -305,6 +306,7 @@
      */
     "testing": {
         "server": {
+            "accountCenter":"http://192.168.0.181:8000",
             "basePath": {
                 "https": "https://saas-api-dev.usoftchina.com:5443",
                 "http": "http://192.168.0.181:8560"
@@ -321,6 +323,7 @@
             "delay": 250
         },
         "server": {
+            "accountCenter":"http://192.168.0.181:8000",
             "basePath": {
                 "https": "https://saas-api-dev.usoftchina.com:5443",
                 "http": "http://192.168.0.181:8560"

+ 8 - 7
frontend/saas-web/app/Application.scss

@@ -187,7 +187,6 @@ body.launching {
 
 .x-btn-default-small,
 .x-btn-default-toolbar-small{
-  min-width: 86px !important;
   border-radius: 2px !important;
 }
 
@@ -257,15 +256,17 @@ body.launching {
 }
 
 .x-grid-header-ct {
-  border-top-color: #ABDAFF;
+  border-top-color: #ABDAFF !important;
+  border-right-color: #ABDAFF !important;
+  border-left-color: #ABDAFF !important;
   border-top-width: 1px;
+  border-right-width: 1px;
+  border-left-width: 1px;
 }
 
-.x-panel-default-outer-border-rl {
-  border-right-color: #ABDAFF !important;
-  border-right-width: 1px !important;
-  border-left-color: #ABDAFF !important;
-  border-left-width: 1px !important;
+.x-panel-default-outer-border-rl,
+.x-panel-default-outer-border-rbl {
+  border-color: #ABDAFF !important;
 }
 
 .x-grid-item-alt {

+ 1 - 0
frontend/saas-web/app/view/core/base/GridPanel.js

@@ -93,6 +93,7 @@ Ext.define('saas.view.core.base.GridPanel', {
                     },
                     items:['->',{
                         xtype:'button',
+                        cls:'x-formpanel-btn-blue',
                         text:'新增',
                         handler:function(b){
                             var form = b.ownerCt.ownerCt.ownerCt;

+ 4 - 31
frontend/saas-web/app/view/core/query/QueryGridPanel.js

@@ -53,7 +53,6 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
     initComponent: function () {
         var me = this;
 
-        console.log(me.idField);
         if(me.idField == 'id') {
             me.idField = '_id';
         }
@@ -120,20 +119,14 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                         viewModel = queryPanel.getViewModel(),
                         moreQuery = viewModel.get('moreQuery'),
                         condition = queryPanel.getConditions(moreQuery),
-                        defaultCondition1 = queryPanel.defaultCondition,
-                        defaultCondition2 = me.defaultCondition,
+                        defaultCondition = me.defaultCondition,
                         mode = queryPanel.getQueryMode();
 
-                        if(defaultCondition1) {
+                        if(defaultCondition) {
                             condition.push({
                                 type: 'condition',
                                 value: defaultCondition1
                             });
-                        }else if(defaultCondition2) {
-                            condition.push({
-                                type: 'condition',
-                                value: defaultCondition2
-                            });
                         }
                         Ext.apply(store.proxy.extraParams, {
                             number: store.exportNumber?store.exportNumber:op._page,
@@ -166,8 +159,7 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
             dockedItems: [{
                 xtype: 'toolbar',
                 dock: 'top',
-                hidden: me.simpleMode,
-                defaults: { // defaults 将会应用所有的子组件上,而不是父容器
+                defaults: {
                     listeners: {
                         'mouseover':function(){
                             this.showMenu(); 
@@ -183,6 +175,7 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                 },
                 items: ['->', {
                     text: '新增',
+                    cls:'x-formpanel-btn-blue',
                     handler: 'onAddClick',
                     bind: {
                         hidden: '{!addEnable}'
@@ -212,21 +205,6 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
                 },  {
                     text: '导出',
                     handler: me.onImport,
-                    // menu: {
-                    //     cls:'x-query-menu',
-                    //     width: 80,
-                    //     items: [{
-                    //         text:'导出',
-                    //         handler:function(){
-                    //             me.onExport(this)
-                    //         }
-                    //     }],
-                    //     // listeners: {
-                    //     //     'mouseleave':function(enu){
-                    //     //         this.hide();
-                    //     //     } 
-                    //     // }
-                    // },
                     bind: {
                         hidden: '{!importEnable}'
                     }
@@ -270,11 +248,6 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
         me.callParent(arguments);
     },
     listeners: {
-        afterrender: function(grid) {
-            if(grid.simpleMode) {
-                grid.headerCt.child('gridcolumn[isCheckerHd]').hide();
-            }
-        },
         boxready: function(grid, width, height, eOpts) {
             var store = grid.getStore(),
             gridBodyBox = grid.body.dom.getBoundingClientRect(),

+ 1 - 21
frontend/saas-web/app/view/core/query/QueryPanel.js

@@ -29,22 +29,11 @@ Ext.define('saas.view.core.query.QueryPanel', {
 
     initComponent: function () {
         var me = this;
-        me.initQueryPanel();
-        // me.setQueryFormItems();
+        me.setQueryFormItems();
         me.setQuertGridConfigs();
         me.callParent(arguments);
     },
 
-    initQueryPanel: function() {
-        var me = this;
-        if(me.simpleMode) {
-            me.items[0].hidden = true;
-        }else {
-            me.items[0].hidden = false;
-            me.setQueryFormItems();
-        }
-    },
-
     getQueryForm: function () {
         var me = this,
         queryForm = me.items[0];
@@ -129,7 +118,6 @@ Ext.define('saas.view.core.query.QueryPanel', {
         }
 
         me.queryGridConfig['columns']=columns;
-        me.queryGridConfig['simpleMode'] = me.simpleMode;
         Ext.apply(queryGrid,me.queryGridConfig);
     },
 
@@ -147,10 +135,6 @@ Ext.define('saas.view.core.query.QueryPanel', {
         condition,
         conditions = [];
 
-        if(me.simpleMode) {
-            return conditions;
-        }
-
         if(moreQuery) {
             for(k in moreItems) {
                 var item = Ext.Array.findBy(moreQueryFormItems, function(i) {
@@ -292,10 +276,6 @@ Ext.define('saas.view.core.query.QueryPanel', {
         formData = viewModelData['form'],
         detailModel = false;
 
-        if(me.simpleMode) {
-            return 'DETAIL';
-        }
-
         for(var i = 0; i < formItems.length; i++) {
             var item = formItems[i],
             showDetail = item.showDetail,

+ 8 - 1
frontend/saas-web/app/view/document/bom/FormPanel.js

@@ -161,7 +161,14 @@ Ext.define('saas.view.document.bom.FormPanel', {
                     xtype : "numberfield",
                     decimalPrecision: 0,
                     minValue:0,
-                    maxLength: 10
+                    maxLength: 10,
+                    listeners: {
+                        change: function(f, v) {
+                            if((v+'').length > 10) {
+                                f.setValue(Number((v+'').substr(0, 10)));
+                            }
+                        }
+                    }
                 },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');

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

@@ -347,7 +347,7 @@ Ext.define('saas.view.document.customer.FormPanel', {
                     xtype : "textfield"
                 },
                 dataIndex : "ca_address", 
-                width:110 
+                width:300 
             },  
             {
                 allowBlank:true,

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

@@ -290,7 +290,7 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 beforeLabelTextTpl: "",
             },{
                 xtype:'textfield',
-                fieldLabel: '手机号码',
+                fieldLabel: '联系电话',
                 name: 'mobile',
                 readOnly:true,
                 editable:false,
@@ -311,7 +311,7 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
         accountadd:{
             items:[{
                 xtype:'textfield',
-                fieldLabel: '手机号码',
+                fieldLabel: '联系号码',
                 name: 'mobile',
                 hideTrigger:true,
                 allowBlank:false,
@@ -343,14 +343,17 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                                         }
                                     }else{
                                         saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
+                                        f.setValue('');
                                     }
                                 },
                                 failure: function (response) {
                                     if(response.responseText){
                                         var localJson = Ext.decode(response.responseText);
                                         saas.util.BaseUtil.showErrorToast('校验失败:'+localJson.message);
+                                        f.setValue('');
                                     }else{
                                         saas.util.BaseUtil.showErrorToast('手机号校验接口连接超时');
+                                        f.setValue('');
                                     }
                                 }
                             });
@@ -367,7 +370,7 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 xtype:'textfield',
                 fieldLabel: '邮箱',
                 name: 'email',
-                allowBlank:false,
+                allowBlank:true,
                 beforeLabelTextTpl: "",
                 regex:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
                 regexText:'请输入正确的邮箱',
@@ -417,7 +420,7 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 fieldLabel: '关联角色',
                 name: 'roleIds',
                 allowBlank:false,
-                maxLength: 20,
+                maxLength: 30,
             }]
         },
         warehouse:{

+ 7 - 16
frontend/saas-web/app/view/home/InfoCard.js

@@ -41,38 +41,32 @@ Ext.define('saas.view.home.InfoCard', {
                 unship: {
                     title: '待出货销售',
                     color: 'yellow',
-                    viewType: 'sale-sale-querypanel',
-                    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)'
+                    viewType: 'home-infocardlist-saleout',
                 },
                 unstorage: {
                     title: '待入库采购',
                     color: 'purple',
-                    viewType: 'purchase-purchase-querypanel',
-                    condition: 'purchase.companyId=' + companyId + ' and pu_statuscode=\'AUDITED\' and exists (select 1 from purchasedetail detail where pd_id=purchasedetail.pd_id and IFNULL(pd_acceptqty,0) < ifnull(pd_qty,0) and TO_DAYS(PD_DELIVERY)-TO_DAYS(now()) <= 7)'
+                    viewType: 'home-infocardlist-purchasein',
                 },
                 unpay: {
                     title: '待付款',
                     color: 'red',
-                    viewType: 'purchase-purchasein-querypanel',
-                    condition: 'pi_class in(\'采购验收单\',\'采购验退单\') and prodinout.companyId=' + companyId + ' and TO_DAYS(pi_date+ifnull(ve_promisedays,0))-TO_DAYS(now()) <= 7 and exists (select 1 from subledger where sl_code=pi_inoutno and sl_kind=pi_class and subledger.companyId=' + companyId + ' and ifnull(sl_namount,0)<>0)'
+                    viewType: 'home-infocardlist-payment',
                 },
                 unreceive: {
                     title: '待收款',
                     color: 'pink',
-                    viewType: 'sale-saleout-querypanel',
-                    condition: 'pi_class in(\'出货单\',\'销售退货单\') and prodinout.companyId=' + companyId + ' and TO_DAYS(pi_date+ifnull(cu_promisedays,0))-TO_DAYS(now()) <= 7 and exists (select 1 from subledger where sl_code=pi_inoutno and sl_kind=pi_class and subledger.companyId=' + companyId + ' and ifnull(sl_namount,0)<>0)'
+                    viewType: 'home-infocardlist-recment',
                 },
                 unauditcheck: {
                     title: '未审核验收',
                     color: 'blue',
-                    viewType: 'purchase-purchasein-querypanel',
-                    condition: 'pi_statuscode<>\'AUDITED\' and pi_class=\'采购验收单\' and prodinout.companyId=' + companyId
+                    viewType: 'home-infocardlist-unauditcheckin',
                 },
                 unauditship: {
                     title: '未审核出货',
                     color: 'default',
-                    viewType: 'sale-saleout-querypanel',
-                    condition: 'pi_statuscode<>\'AUDITED\' and pi_class=\'出货单\' and prodinout.companyId=' + companyId
+                    viewType: 'home-infocardlist-unauditsaleout',
                 }
             },
             userCls: 'x-info-card ' + me.userCls,
@@ -147,10 +141,7 @@ Ext.define('saas.view.home.InfoCard', {
                 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'), {
-                            simpleMode: true,
-                            defaultCondition: record.get('condition')
-                        });
+                        saas.util.BaseUtil.openTab(record.get('viewType'), record.get('title'), record.get('id'));
                     }
                 }
             });

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

@@ -27,12 +27,13 @@ Ext.define('saas.view.home.charts.MonthPurchase', {
                     position: 'bottom',
                     label: {
                         fontSize: '12px',
-                        fillStyle: '#485465'
+                        fillStyle: '#485465',
                     },
                     style: {
                         fill: '#F7F8FA',
                         strokeStyle: 'transparent'
                     },
+                    renderer: me.onCategoryLabelRender
                 },{
                     type: 'numeric',
                     fields: ['y'],
@@ -79,6 +80,10 @@ Ext.define('saas.view.home.charts.MonthPurchase', {
         me.callParent(arguments);
     },
 
+    onCategoryLabelRender: function(axis, label, layoutContent, lastLabel) {
+        return label.substr(0,2) + '...';
+    },
+
     onBarTipRender: function (tooltip, record, item) {
         tooltip.setHtml(record.get('x') + ': ' + record.get('y') + '万元');
     },

+ 212 - 0
frontend/saas-web/app/view/home/infoCardList/InfoList.js

@@ -0,0 +1,212 @@
+Ext.define('saas.view.home.infoCardList.InfoList', {
+    extend: 'Ext.grid.Panel',
+    xtype: 'home-infocardlist-infolist',
+
+    cls: 'x-infocardlist',
+
+    //基础属性
+    border: 1,
+    loadMask: true,
+    showIndex: true,
+    columnWidth: 1.0,
+    showRowNum: true,
+
+    codeField: '',
+    columns: [],
+    condition: '1=1',
+
+    initComponent: function () {
+        var me = this,
+        listUrl = me.listUrl,
+        condition = me.initCondition(me.condition);
+
+        if(me.idField == 'id') {
+            me.idField = '_id';
+        }
+
+        Ext.apply(me, {
+            actions: {
+                copy: {
+                    iconCls: 'x-fa fa-copy',
+                    text: '复制单元格',
+                    handler: function() {
+                        me.onCopy(me.selectedData);
+                    }
+                }
+            },
+            viewConfig: {
+                deferEmptyText: false,
+                emptyText: '无数据',
+                listeners: {
+                    itemcontextmenu: function(view, rec, node, index, e) {
+                        e.stopEvent();
+                        me.getContextMenu().show().setLocalXY(e.getXY());
+                        me.selectedData = e.target.innerText;
+                        return false;
+                    }
+                }
+            },
+            columns: me.initColumns(),
+            store: Ext.create('Ext.data.Store', {
+                fields: me.getFields(),
+                autoLoad: true,
+                pageSize: 15,
+                data: [],
+                proxy: {
+                    type: 'ajax',
+                    url: listUrl,
+                    timeout: 8000,
+                    actionMethods: {
+                        read: 'GET'
+                    },
+                    reader: {
+                        type: 'json',
+                        rootProperty: 'data.list',
+                        totalProperty: 'data.total',
+                    },
+                    listeners: {
+                        exception: function(proxy, response, operation, eOpts) {
+                            if(operation.success) {
+                                if(response.timedout) {
+                                    saas.util.BaseUtil.showErrorToast('请求超时');
+                                }
+                            }else {
+                                if(response.timedout) {
+                                    saas.util.BaseUtil.showErrorToast('请求超时');
+                                }else{
+                                    saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                                }
+                            }
+                        }
+                    }
+                },
+                listeners: {
+                    beforeload: function (store, op) {
+                        var conditions = [{
+                            type: 'condition',
+                            value: condition
+                        }];
+
+                        Ext.apply(store.proxy.extraParams, {
+                            number: store.exportNumber?store.exportNumber:op._page,
+                            size: store.exportPageSize?store.exportPageSize:store.pageSize,
+                            mode: 'DETAIL',
+                            condition: JSON.stringify(conditions)
+                        });
+    
+                    },
+                    load: function(store, records, successful, operation, eOpts) {
+                        var datas = [];
+
+                        Ext.Array.each(records, function(r, i) {
+                            var d = Object.assign({}, r.data, { _id: r.data.id, id: Ext.id() });
+                            datas.push(d);
+                        });
+
+                        store.loadData(datas, false);
+                        me.reconfigure(store, me.initColumns());
+                    }
+                }
+            }),
+            dockedItems: [{
+                xtype: 'pagingtoolbar',
+                cls: 'core-query-pagingtoolbar',
+                dock: 'bottom',
+                displayInfo: true,
+                store: me.store
+            }]
+        });
+        me.callParent(arguments);
+    },
+    listeners: {
+        boxready: function(grid, width, height, eOpts) {
+            var store = grid.getStore(),
+            gridBodyBox = grid.body.dom.getBoundingClientRect(),
+            gridBodyBoxHeight = gridBodyBox.height;
+
+            var pageSize = Math.floor(gridBodyBoxHeight / 32);
+
+            store.setPageSize(pageSize);
+        },
+        itemClick: function(tableView, record, item, index, e, eOpts) {
+            var grid = tableView.up('grid');
+
+            if(!grid.fireEvent('beforeopendetail', grid, record)) {
+                return false;
+            }
+
+            var idField = grid.idField,
+            codeField = grid.codeField,
+            detailTitle = grid.detailTitle,
+            detailXType = grid.detailXType;
+
+            if(e.target.parentElement.classList.contains('x-code-column')) {
+                var idValue = record.get(idField),
+                codeValue = record.get(codeField),
+                id = detailXType + '-' + idValue;
+                saas.util.BaseUtil.openTab(detailXType, detailTitle+"("+codeValue+")", id, {
+                    initId: idValue
+                });
+            }
+        },
+    },
+
+    initCondition: function(condition) {
+        var companyId = saas.util.BaseUtil.getCurrentUser().companyId;
+        return condition.replace('#{companyId}', companyId);;
+    },
+
+    initColumns: function() {
+        var me = this,
+        columns = me.listColumns;
+
+        Ext.Array.each(columns, function(c) {
+            if(c.dataIndex == me.codeField) {
+                Ext.applyIf(c, {
+                    tdCls: 'x-code-column'
+                });
+            }
+        });
+
+        return columns;
+    },
+    getFields: function() {
+        var me = this;
+
+        return me.columns.filter(function(c) {
+            return !!c.dataIndex;
+        }).map(function(c) {
+            return c.dataIndex;
+        });
+    },
+
+    getContextMenu: function() {
+        var me = this;
+
+        return me.contextMenu || (me.contextMenu = me.add({
+            xtype: 'menu',
+            items: [
+                // Actions can be converted into MenuItems
+                '@copy',
+            ]
+        }));
+    },
+
+    onCopy: function(text) {
+		var target = Ext.DomHelper.append(document.body, {
+			tag: 'textarea',
+			style: 'opacity: 0;position: absolute;top: -10000px;right: 0;',
+			html: text
+		});
+		target.focus();
+		target.select();
+	    document.execCommand('Copy');
+	    target.blur();
+	    document.body.removeChild(target);
+    },
+    
+    refresh: function() {
+        var me = this;
+        me.store.reload();
+    }
+});

+ 14 - 0
frontend/saas-web/app/view/home/infoCardList/InfoList.scss

@@ -0,0 +1,14 @@
+.x-infocardlist {
+    .x-grid-header-ct {
+        border-top-color: #ABDAFF !important;
+    }
+
+    .x-code-column {
+
+        .x-grid-cell-inner {
+            text-decoration: underline;
+            color: #3E80F6;
+            cursor: pointer;
+        }
+    }
+}

+ 130 - 0
frontend/saas-web/app/view/home/infoCardList/Payment.js

@@ -0,0 +1,130 @@
+/**
+ * 待付款
+ */
+Ext.define('saas.view.home.infoCardList.Payment', {
+    extend: 'saas.view.home.infoCardList.InfoList',
+    xtype: 'home-infocardlist-payment',
+
+    listUrl: '/api/purchase/prodinout/list',
+    idField: 'id',
+    codeField: 'pi_inoutno',
+    // detailTitle: '采购验收单',
+    // detailXType: 'purchase-purchasein-formpanel',
+    condition: 'pi_class in (\'采购验收单\',\'采购验退单\') and prodinout.companyId=#{companyId} and TO_DAYS(pi_date+ifnull(ve_promisedays,0))-TO_DAYS(now()) <= 7 and exists (select 1 from subledger where sl_code=pi_inoutno and sl_kind=pi_class and subledger.companyId=#{companyId} and ifnull(sl_namount,0)<>0)',
+    listColumns: [{
+        text: 'id',
+        dataIndex: 'pu_id',
+        xtype: 'numbercolumn',
+        hidden: true
+    }, {
+        text: '单据编号',
+        dataIndex: 'pi_inoutno',
+        width: 150
+    }, {
+        text: '单据类型',
+        dataIndex: 'pd_piclass',
+        width: 0
+    }, {
+        text: '单据日期',
+        dataIndex: 'pi_date',
+        xtype: 'datecolumn',
+        width: 110
+    }, {
+        text: '供应商编号',
+        dataIndex: 'pi_vendcode',
+        width: 0
+    }, {
+        text: '供应商名称',
+        dataIndex: 'pi_vendname',
+        width: 150
+    }, {
+        text: '审核状态',
+        align: 'center',
+        dataIndex: 'pi_status',
+        width: 90
+    }, {
+        text: '序号',
+        dataIndex: 'pd_pdno',
+        width: 80
+    }, {
+        text: '相关单号',
+        dataIndex: 'pd_ordercode',
+        width: 150
+    }, {
+        text: '物料编号',
+        dataIndex: 'pd_prodcode',
+        width: 150
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 200
+    }, {
+        text: '物料规格',
+        dataIndex: 'pr_spec',
+        width: 150
+    }, {
+        text: '单位',
+        dataIndex: 'pr_unit',
+        width: 80
+    }, {
+        text: '数量',
+        dataIndex: 'pd_inqty',
+        xtype: 'numbercolumn',
+        width: 110,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '仓库',
+        dataIndex: 'pd_whname',
+        width: 150
+    }, {
+        text: '单价',
+        dataIndex: 'pd_orderprice',
+        xtype: 'numbercolumn',
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+        width: 110
+    }, {
+        text: '税率',
+        dataIndex: 'pd_taxrate',
+        xtype: 'numbercolumn',
+        width: 80,
+        renderer: function (v) {
+            return Ext.util.Format.number(v, '0');
+        },
+    }, {
+        text: '金额',
+        dataIndex: 'pd_total',
+        xtype: 'numbercolumn',
+        width: 110,
+        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);
+        },
+    }],
+    listeners: {
+        beforeopendetail: function(grid, record) {
+            var pi_class = record.get('pi_class'),
+            detailTitle = '采购验收单',
+            detailXType = 'purchase-purchasein-formpanel';
+
+            if(pi_class == '采购验退单') {
+                detailTitle = '采购验退单';
+                detailXType = 'purchase-purchaseout-formpanel';
+            }
+            grid.detailTitle = detailTitle;
+            grid.detailXType = detailXType;
+            return true;
+        }
+    }
+});

+ 118 - 0
frontend/saas-web/app/view/home/infoCardList/PurchaseIn.js

@@ -0,0 +1,118 @@
+/**
+ * 待入库采购
+ */
+Ext.define('saas.view.home.infoCardList.PurchaseIn', {
+    extend: 'saas.view.home.infoCardList.InfoList',
+    xtype: 'home-infocardlist-purchasein',
+
+    listUrl: '/api/purchase/purchase/list',
+    idField: 'pu_id',
+    codeField: 'pu_code',
+    detailTitle: '采购订单',
+    detailXType: 'purchase-purchase-formpanel',
+    condition: 'purchase.companyId=#{companyId} and pu_statuscode=\'AUDITED\' and exists (select 1 from purchasedetail detail where pd_id=purchasedetail.pd_id and IFNULL(pd_acceptqty,0) < ifnull(pd_qty,0) and TO_DAYS(PD_DELIVERY)-TO_DAYS(now()) <= 7)',
+    listColumns: [{
+        text: 'id',
+        dataIndex: 'pu_id',
+        width: 0,
+        hidden: true
+    }, {
+        text: '采购单号',
+        dataIndex: 'pu_code',
+        width: 150
+    }, {
+        text: '单据日期',
+        dataIndex: 'pu_date',
+        xtype: 'datecolumn',
+        width: 110
+    }, {
+        text: '供应商名称',
+        dataIndex: 'pu_vendname',
+        width: 150
+    }, {
+        text: '审核状态',
+        align: 'center',
+        dataIndex: 'pu_status',
+        width: 90
+    }, {
+        text: '业务状态',
+        align: 'center',
+        dataIndex: 'pu_acceptstatus',
+        width: 90
+    }, {
+        text: '序号',
+        dataIndex: 'pd_detno',
+        xtype: 'numbercolumn',
+        width: 80,
+        renderer: function (v) {
+            return Ext.util.Format.number(v, '0');
+        }
+    }, {
+        text: '物料编号',
+        dataIndex: 'pd_prodcode',
+        width: 150
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 200
+    }, {
+        text: '物料规格',
+        dataIndex: 'pr_spec',
+        width: 150
+    }, {
+        text: '单位',
+        dataIndex: 'pr_unit',
+        width: 80
+    }, {
+        text: '采购数量',
+        dataIndex: 'pd_qty',
+        xtype: 'numbercolumn',
+        width: 110,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '需求日期',
+        dataIndex: 'pd_delivery',
+        xtype: 'datecolumn',
+        width: 110
+    }, {
+        text: '单价',
+        dataIndex: 'pd_price',
+        xtype: 'numbercolumn',
+        width: 110,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '税率',
+        dataIndex: 'pd_taxrate',
+        xtype: 'numbercolumn',
+        width: 80,
+        renderer: function (v) {
+            return Ext.util.Format.number(v, '0');
+        },
+    }, {
+        text: '金额',
+        dataIndex: 'pd_total',
+        xtype: 'numbercolumn',
+        width: 110,
+        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);
+        }
+    }, {
+        text: '备注',
+        dataIndex: 'pd_remark',
+        width: 250
+    }]
+
+});

+ 139 - 0
frontend/saas-web/app/view/home/infoCardList/Recment.js

@@ -0,0 +1,139 @@
+/**
+ * 待收款
+ */
+Ext.define('saas.view.home.infoCardList.Recment', {
+    extend: 'saas.view.home.infoCardList.InfoList',
+    xtype: 'home-infocardlist-recment',
+
+    listUrl: '/api/sale/prodinout/list',
+    idField: 'id',
+    codeField: 'pi_inoutno',
+    // detailTitle: '出货单',
+    // detailXType: 'sale-saleout-formpanel',
+    condition: 'pi_class in (\'出货单\',\'销售退货单\') and prodinout.companyId=#{companyId} and TO_DAYS(pi_date+ifnull(cu_promisedays,0))-TO_DAYS(now()) <= 7 and exists (select 1 from subledger where sl_code=pi_inoutno and sl_kind=pi_class and subledger.companyId=#{companyId} and ifnull(sl_namount,0)<>0)',
+    listColumns: [{
+        text: 'id',
+        dataIndex: 'id',
+        hidden:true,
+        xtype: 'numbercolumn'
+    }, {
+        text: '出货单号',
+        dataIndex: 'pi_inoutno',
+        width: 150
+    }, {
+        text: '单据日期',
+        dataIndex: 'pi_date',
+        xtype:'datecolumn',
+        width: 110
+    },{
+        text: '客户名称',
+        dataIndex: 'pi_custname',
+        width: 250
+    }, {
+        text: '单据状态',
+        align: 'center',
+        dataIndex: 'pi_status',
+        width: 90
+    }, {
+        text: '明细序号',
+        dataIndex: 'pd_pdno',
+        xtype: 'numbercolumn',
+        width: 100,
+        renderer : function(v) {
+            var format = '0'
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '关联销售单号',
+        dataIndex: 'pd_ordercode',
+        width: 150
+    }, {
+        text: '订单序号',
+        dataIndex: 'pd_orderdetno',
+        xtype:'numbercolumn',
+        width: 100,
+        renderer : function(v) {
+            var format = '0'
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '物料编号',
+        dataIndex: 'pd_prodcode',
+        width: 150
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 150
+    }, {
+        text: '出货数量',
+        dataIndex: 'pd_outqty',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '销售单价',
+        dataIndex: 'pd_sendprice',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '金额',
+        dataIndex: 'pd_ordertotal',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '税率',
+        dataIndex: 'pd_taxrate',
+        xtype:'numbercolumn',
+        width: 80,
+        renderer : function(v) {
+            return Ext.util.Format.number(v, '0');
+        }
+    }, {
+        text: '成本单价',
+        dataIndex: 'pd_price',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : 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);
+        }
+    }, {
+        text: '备注',
+        dataIndex: 'pd_remark',
+        width: 250
+    }],
+    listeners: {
+        beforeopendetail: function(grid, record) {
+            var pi_class = record.get('pi_class'),
+            detailTitle = '出货单',
+            detailXType = 'sale-saleout-formpanel';
+
+            if(pi_class == '销售退货单') {
+                detailTitle = '销售退货单';
+                detailXType = 'sale-salein-formpanel';
+            }
+            grid.detailTitle = detailTitle;
+            grid.detailXType = detailXType;
+            return true;
+        }
+    }
+});

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

@@ -0,0 +1,118 @@
+/**
+ * 待出货销售
+ */
+Ext.define('saas.view.home.infoCardList.SaleOut', {
+    extend: 'saas.view.home.infoCardList.InfoList',
+    xtype: 'home-infocardlist-saleout',
+
+    listUrl: '/api/sale/sale/list',
+    idField: 'sa_id',
+    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(sd_sendqty,0)<ifnull(sd_qty,0) and TO_DAYS(sd_delivery)-TO_DAYS(now())<= 7)',
+    listColumns: [{
+        text: 'id',
+        dataIndex: 'sa_id',
+        hidden: true,
+        xtype: 'numbercolumn'
+    }, {
+        text: '单据编号',
+        dataIndex: 'sa_code',
+        width: 200
+    }, {
+        text: '单据状态',
+        align: 'center',
+        dataIndex: 'sa_status',
+        width: 120
+    }, {
+        text: '单据日期',
+        dataIndex: 'sa_date',
+        xtype: 'datecolumn',
+        width: 200
+    }, {
+        text: '客户名称',
+        dataIndex: 'sa_custname',
+        width: 120
+    }, {
+        text: '明细序号',
+        dataIndex: 'sd_detno',
+        xtype: 'numbercolumn',
+        width: 120,
+        renderer: function (v) {
+            return Ext.util.Format.number(v, '0');
+        }
+    }, {
+        text: '物料编号',
+        dataIndex: 'sd_prodcode',
+        width: 120
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 120
+    }, {
+        text: '物料规格',
+        dataIndex: 'pr_spec',
+        width: 120
+    }, {
+        text: '数量',
+        dataIndex: 'sd_qty',
+        xtype: 'numbercolumn',
+        width: 120,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '单价',
+        dataIndex: 'sd_price',
+        xtype: 'numbercolumn',
+        width: 120,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '已转数',
+        dataIndex: 'sd_yqty',
+        xtype: 'numbercolumn',
+        width: 120,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '已出货数',
+        dataIndex: 'sd_sendqty',
+        xtype: 'numbercolumn',
+        width: 120,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '已审核采购单数',
+        dataIndex: 'sd_pdqty',
+        xtype: 'numbercolumn',
+        width: 180,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '备注',
+        dataIndex: 'sd_remark',
+        width: 250
+    }],
+
+});

+ 130 - 0
frontend/saas-web/app/view/home/infoCardList/UnauditCheckIn.js

@@ -0,0 +1,130 @@
+/**
+ * 未审核验收
+ */
+Ext.define('saas.view.home.infoCardList.UnauditCheckIn', {
+    extend: 'saas.view.home.infoCardList.InfoList',
+    xtype: 'home-infocardlist-unauditcheckin',
+
+    listUrl: '/api/purchase/prodinout/list',
+    idField: 'id',
+    codeField: 'pi_inoutno',
+    // detailTitle: '采购验收单',
+    // detailXType: 'purchase-purchasein-formpanel',
+    condition: 'pi_statuscode<>\'AUDITED\' and pi_class in (\'采购验收单\',\'采购验退单\') and prodinout.companyId=#{companyId}',
+    listColumns: [{
+        text: 'id',
+        dataIndex: 'pu_id',
+        xtype: 'numbercolumn',
+        hidden: true
+    }, {
+        text: '单据编号',
+        dataIndex: 'pi_inoutno',
+        width: 150
+    }, {
+        text: '单据类型',
+        dataIndex: 'pd_piclass',
+        width: 0
+    }, {
+        text: '单据日期',
+        dataIndex: 'pi_date',
+        xtype: 'datecolumn',
+        width: 110
+    }, {
+        text: '供应商编号',
+        dataIndex: 'pi_vendcode',
+        width: 0
+    }, {
+        text: '供应商名称',
+        dataIndex: 'pi_vendname',
+        width: 150
+    }, {
+        text: '审核状态',
+        align: 'center',
+        dataIndex: 'pi_status',
+        width: 90
+    }, {
+        text: '序号',
+        dataIndex: 'pd_pdno',
+        width: 80
+    }, {
+        text: '相关单号',
+        dataIndex: 'pd_ordercode',
+        width: 150
+    }, {
+        text: '物料编号',
+        dataIndex: 'pd_prodcode',
+        width: 150
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 200
+    }, {
+        text: '物料规格',
+        dataIndex: 'pr_spec',
+        width: 150
+    }, {
+        text: '单位',
+        dataIndex: 'pr_unit',
+        width: 80
+    }, {
+        text: '数量',
+        dataIndex: 'pd_inqty',
+        xtype: 'numbercolumn',
+        width: 110,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        text: '仓库',
+        dataIndex: 'pd_whname',
+        width: 150
+    }, {
+        text: '单价',
+        dataIndex: 'pd_orderprice',
+        xtype: 'numbercolumn',
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length)).fill('0');
+            var format = '0,000.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+        width: 110
+    }, {
+        text: '税率',
+        dataIndex: 'pd_taxrate',
+        xtype: 'numbercolumn',
+        width: 80,
+        renderer: function (v) {
+            return Ext.util.Format.number(v, '0');
+        },
+    }, {
+        text: '金额',
+        dataIndex: 'pd_total',
+        xtype: 'numbercolumn',
+        width: 110,
+        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);
+        },
+    }],
+    listeners: {
+        beforeopendetail: function(grid, record) {
+            var pi_class = record.get('pi_class'),
+            detailTitle = '采购验收单',
+            detailXType = 'purchase-purchasein-formpanel';
+
+            if(pi_class == '采购验退单') {
+                detailTitle = '采购验退单';
+                detailXType = 'purchase-purchaseout-formpanel';
+            }
+            grid.detailTitle = detailTitle;
+            grid.detailXType = detailXType;
+            return true;
+        }
+    }
+});

+ 139 - 0
frontend/saas-web/app/view/home/infoCardList/UnauditSaleOut.js

@@ -0,0 +1,139 @@
+/**
+ * 未审核出货
+ */
+Ext.define('saas.view.home.infoCardList.UnauditSaleOut', {
+    extend: 'saas.view.home.infoCardList.InfoList',
+    xtype: 'home-infocardlist-unauditsaleout',
+
+    listUrl: '/api/sale/prodinout/list',
+    idField: 'id',
+    codeField: 'pi_inoutno',
+    // detailTitle: '出货单',
+    // detailXType: 'sale-saleout-formpanel',
+    condition: 'pi_statuscode<>\'AUDITED\' and pi_class in (\'出货单\',\'销售退货单\') and prodinout.companyId=#{companyId}',
+    listColumns: [{
+        text: 'id',
+        dataIndex: 'id',
+        hidden:true,
+        xtype: 'numbercolumn'
+    }, {
+        text: '出货单号',
+        dataIndex: 'pi_inoutno',
+        width: 150
+    }, {
+        text: '单据日期',
+        dataIndex: 'pi_date',
+        xtype:'datecolumn',
+        width: 110
+    },{
+        text: '客户名称',
+        dataIndex: 'pi_custname',
+        width: 250
+    }, {
+        text: '单据状态',
+        align: 'center',
+        dataIndex: 'pi_status',
+        width: 90
+    }, {
+        text: '明细序号',
+        dataIndex: 'pd_pdno',
+        xtype: 'numbercolumn',
+        width: 100,
+        renderer : function(v) {
+            var format = '0'
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '关联销售单号',
+        dataIndex: 'pd_ordercode',
+        width: 150
+    }, {
+        text: '订单序号',
+        dataIndex: 'pd_orderdetno',
+        xtype:'numbercolumn',
+        width: 100,
+        renderer : function(v) {
+            var format = '0'
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '物料编号',
+        dataIndex: 'pd_prodcode',
+        width: 150
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 150
+    }, {
+        text: '出货数量',
+        dataIndex: 'pd_outqty',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '销售单价',
+        dataIndex: 'pd_sendprice',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '金额',
+        dataIndex: 'pd_ordertotal',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        }
+    }, {
+        text: '税率',
+        dataIndex: 'pd_taxrate',
+        xtype:'numbercolumn',
+        width: 80,
+        renderer : function(v) {
+            return Ext.util.Format.number(v, '0');
+        }
+    }, {
+        text: '成本单价',
+        dataIndex: 'pd_price',
+        xtype:'numbercolumn',
+        width: 110,
+        renderer : 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);
+        }
+    }, {
+        text: '备注',
+        dataIndex: 'pd_remark',
+        width: 250
+    }],
+    listeners: {
+        beforeopendetail: function(grid, record) {
+            var pi_class = record.get('pi_class'),
+            detailTitle = '出货单',
+            detailXType = 'sale-saleout-formpanel';
+
+            if(pi_class == '销售退货单') {
+                detailTitle = '销售退货单';
+                detailXType = 'sale-salein-formpanel';
+            }
+            grid.detailTitle = detailTitle;
+            grid.detailXType = detailXType;
+            return true;
+        }
+    }
+});

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

@@ -140,7 +140,7 @@ Ext.define('saas.view.main.Main', {
                             text: '账户中心',
                             iconCls:'x-fa fa-user-o sa-navicon',
                             handler:function(){
-                                window.open('http://www.usoftchina.com','_blank');
+                                window.open(Ext.manifest.server.accountCenter,'_blank');
                             }
                         },{  
                             text: '意见反馈',

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

@@ -124,7 +124,7 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
             text: '业务状态',
             align: 'center',
             dataIndex: 'sa_sendstatus',
-            width: 90
+            width: 100
         }, {
             text: '业务员',
             dataIndex: 'sa_seller',
@@ -170,6 +170,11 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
             text: '客户名称',
             dataIndex: 'sa_custname',
             width: 120
+        },  {
+            text: '业务状态',
+            align: 'center',
+            dataIndex: 'sa_sendstatus',
+            width: 90
         }, {
             text: '明细序号',
             dataIndex: 'sd_detno',

+ 2 - 0
frontend/saas-web/app/view/stock/make/FormPanelController.js

@@ -47,6 +47,8 @@ Ext.define('saas.view.stock.make.FormPanelController', {
                             from:'pr_spec',to:'pr_spec'
                         },{
                             from:'pr_unit',to:'pr_unit'
+                        },{
+                            from:'pr_purcprice',to:'mm_price'
                         }],
                     }) ;   
 

+ 1 - 1
frontend/saas-web/app/view/sys/account/DataList.js

@@ -84,7 +84,7 @@ Ext.define('saas.view.sys.account.DataList', {
         dataIndex : 'mobile', 
         width : 110.0,
     },{
-        text : '联系邮箱', 
+        text : '邮箱', 
         dataIndex : 'email', 
         width : 180.0, 
         xtype : '', 

+ 1 - 1
frontend/saas-web/app/view/sys/finish/DataList.js

@@ -84,7 +84,7 @@ Ext.define('saas.view.sys.finish.DataList', {
         width : 110.0, 
     },{
         text : "操作日期", 
-        width : 150.0, 
+        width : 220.0, 
         format:'Y-m-d H:i:s',
         dataIndex : "createTime", 
         xtype:'datecolumn',

+ 8 - 3
frontend/saas-web/app/view/viewport/ViewportController.js

@@ -23,6 +23,8 @@ Ext.define('saas.view.viewport.ViewportController', {
     },
 
     mainviewboxready: function() {
+        //初始化accountPage地址
+        document.getElementsByName('accountPage')[0].setAttribute('src',getTokenPage());
         if(!Ext.isChrome && !Ext.isFirefox) {
             saas.util.BaseUtil.showConfirm('温馨提示', '为了更好地呈现页面效果,推荐使用Chrome浏览器或火狐浏览器');
         }
@@ -117,7 +119,7 @@ Ext.define('saas.view.viewport.ViewportController', {
     terminateSession: function() {
         this.setRequestToken(null);
         this.saveSession(null);
-        this.showAuth();
+        //this.showAuth();
     },
 
     saveSession: function(session) {
@@ -141,7 +143,6 @@ Ext.define('saas.view.viewport.ViewportController', {
         var me = this,
             view = me.getView(),
             session = me.session;
-
         if (!session || !session.isValid()) {
             return false;
         }
@@ -153,7 +154,11 @@ Ext.define('saas.view.viewport.ViewportController', {
             me.originalRoute = Ext.History.getToken();
             me.terminateSession();
             view.unmask();
-            me.redirectTo('login', {replace: true});
+            //跳转到账户中心
+            const frame = window.frames[window.frames.length - 1];
+            frame.postMessage('removeToken','*');
+            window.location.href = getAccountPage();
+            //me.redirectTo('login', {replace: true});
         });
     },
 

+ 9 - 0
frontend/saas-web/index.html

@@ -12,6 +12,15 @@
 
     <!-- The line below must be kept intact for Sencha Cmd to build your application -->
     <script id="microloader" data-app="a20e1670-7932-41f6-8e9c-55b77cba3f26" type="text/javascript" src="bootstrap.js"></script>
+    <script>
+        function getTokenPage(){
+            return Ext.manifest.server.accountCenter + "/remove-token.html"
+        }
+        function getAccountPage(){
+            return Ext.manifest.server.accountCenter
+        }
+    </script>
 </head>
+<iframe name="accountPage" hidden></iframe>
 <body class="launching"></body>
 </html>