Jelajahi Sumber

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

rainco 7 tahun lalu
induk
melakukan
62cef1f745
89 mengubah file dengan 975 tambahan dan 552 penghapusan
  1. 1 0
      README.md
  2. 3 2
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  3. 2 2
      applications/commons/commons-server/src/main/resources/mapper/HomePageMapper.xml
  4. 1 1
      applications/document/document-server/src/main/resources/mapper/CustomeraddressMapper.xml
  5. 1 1
      applications/document/document-server/src/main/resources/mapper/VendorcontactMapper.xml
  6. 4 0
      applications/money/money-server/pom.xml
  7. 2 0
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/FundtransferMapper.java
  8. 10 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/FundtransferServiceImpl.java
  9. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthreceiptsServiceImpl.java
  10. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthspendingsServiceImpl.java
  11. 12 24
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/PaybalanceServiceImpl.java
  12. 6 2
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/RecbalanceServiceImpl.java
  13. 15 1
      applications/money/money-server/src/main/resources/mapper/FundtransferMapper.xml
  14. 2 3
      applications/money/money-server/src/main/resources/mapper/OthreceiptsMapper.xml
  15. 2 4
      applications/money/money-server/src/main/resources/mapper/OthspendingsMapper.xml
  16. 2 3
      applications/money/money-server/src/main/resources/mapper/PaybalanceMapper.xml
  17. 2 3
      applications/money/money-server/src/main/resources/mapper/RecbalanceMapper.xml
  18. 13 2
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/ProdInOutController.java
  19. 2 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/PurchaseMapper.java
  20. 4 6
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  21. 3 0
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseMapper.xml
  22. 2 0
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml
  23. 2 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java
  24. 13 4
      applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/controller/ProdInOutController.java
  25. 1 1
      applications/storage/storage-server/src/main/resources/mapper/StockTakingMapper.xml
  26. 33 4
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  27. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleMapper.java
  28. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java
  29. 12 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  30. 5 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java
  31. 3 0
      base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml
  32. 5 0
      base-servers/auth/auth-common/pom.xml
  33. 17 0
      base-servers/auth/auth-common/src/test/java/com/usoftchina/saas/auth/common/jwt/JwtHelperTest.java
  34. TEMPAT SAMPAH
      base-servers/auth/auth-common/src/test/resources/pub.key
  35. 18 5
      base-servers/auth/sso-api/src/main/java/com/usoftchina/sso/api/SsoUserApi.java
  36. 7 0
      base-servers/auth/sso-api/src/test/java/com/usoftchina/sso/test/SsoUserApiTest.java
  37. 8 0
      base-servers/zipkin-server/src/main/resources/config/application-docker-prod.yml
  38. 2 0
      framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java
  39. 11 5
      frontend/saas-portal-web/index.html
  40. 25 13
      frontend/saas-portal-web/src/components/conenter/addgongsi.vue
  41. 17 13
      frontend/saas-portal-web/src/components/conenter/company.vue
  42. 5 1
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  43. 1 2
      frontend/saas-portal-web/src/components/conenter/home.vue
  44. 34 29
      frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue
  45. 6 6
      frontend/saas-portal-web/src/components/footer/footer.vue
  46. 2 2
      frontend/saas-portal-web/static/css/main.css
  47. TEMPAT SAMPAH
      frontend/saas-portal-web/static/img/assets/beijing2x.png
  48. TEMPAT SAMPAH
      frontend/saas-portal-web/static/img/banner@3x@2x.png
  49. TEMPAT SAMPAH
      frontend/saas-portal-web/static/img/logo.png
  50. 1 0
      frontend/saas-portal-web/static/js/mains.js
  51. 1 0
      frontend/saas-web/app/Application.scss
  52. 1 0
      frontend/saas-web/app/view/core/base/GridPanel.js
  53. 8 0
      frontend/saas-web/app/view/core/dbfind/DbfindTrigger.js
  54. 1 1
      frontend/saas-web/app/view/core/form/FormPanel.js
  55. 14 1
      frontend/saas-web/app/view/core/form/FormPanelController.js
  56. 13 14
      frontend/saas-web/app/view/core/query/QueryFormPanel.js
  57. 6 1
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  58. 1 1
      frontend/saas-web/app/view/core/query/QueryPanel.js
  59. 81 43
      frontend/saas-web/app/view/core/report/ReportPanel.js
  60. 16 4
      frontend/saas-web/app/view/core/report/ReportPanelController.js
  61. 2 1
      frontend/saas-web/app/view/document/bom/FormPanel.js
  62. 1 1
      frontend/saas-web/app/view/document/customer/FormPanel.js
  63. 6 6
      frontend/saas-web/app/view/home/InfoCard.js
  64. 1 0
      frontend/saas-web/app/view/home/InfoCard.scss
  65. 10 2
      frontend/saas-web/app/view/home/charts/SaleTrend.js
  66. 1 3
      frontend/saas-web/app/view/main/Main.js
  67. 4 2
      frontend/saas-web/app/view/main/MainController.js
  68. 1 1
      frontend/saas-web/app/view/main/Navigation.scss
  69. 2 0
      frontend/saas-web/app/view/money/fundtransfer/FormPanel.js
  70. 5 1
      frontend/saas-web/app/view/money/recBalance/FormPanel.js
  71. 163 138
      frontend/saas-web/app/view/money/report/CustomerCheck.js
  72. 13 1
      frontend/saas-web/app/view/money/report/CustomerCheckModel.js
  73. 26 0
      frontend/saas-web/app/view/money/report/VendorCheck.js
  74. 14 1
      frontend/saas-web/app/view/money/report/VendorCheckModel.js
  75. 21 9
      frontend/saas-web/app/view/money/verification/FormPanel.js
  76. 12 11
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  77. 12 11
      frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js
  78. 9 0
      frontend/saas-web/app/view/purchase/purchaseIn/FormPanelController.js
  79. 12 11
      frontend/saas-web/app/view/purchase/purchaseOut/FormPanel.js
  80. 9 0
      frontend/saas-web/app/view/purchase/purchaseOut/FormPanelController.js
  81. 4 0
      frontend/saas-web/app/view/sale/saleOut/QueryPanel.js
  82. 3 1
      frontend/saas-web/app/view/stock/make/FormPanel.js
  83. 96 45
      frontend/saas-web/app/view/stock/make/FormPanelController.js
  84. 12 11
      frontend/saas-web/app/view/stock/otherIn/FormPanel.js
  85. 1 41
      frontend/saas-web/app/view/stock/otherIn/FormPanelController.js
  86. 2 1
      frontend/saas-web/app/view/stock/otherOut/FormPanel.js
  87. 1 41
      frontend/saas-web/app/view/stock/otherOut/FormPanelController.js
  88. 10 5
      frontend/saas-web/app/view/sys/feedback/FormPanel.js
  89. 47 0
      frontend/saas-web/app/view/sys/feedback/FormPanel.scss

+ 1 - 0
README.md

@@ -160,6 +160,7 @@
 | --------   | :----:  | :----: | :------:  | :------:  |
 | 10.10.100.103 |  centos  | mykey.key |  CentOS6, RabbitMQ  | Cpu: 4, Mem: 8G, Disk: 35G |
 | 10.10.100.123 |  centos  | mykey.key |  CentOS6, MongoDB  | Cpu: 8, Mem: 8G, Disk: 60G |
+| 10.10.100.127 |  centos  | mykey.key |  CentOS6, Nginx  | Cpu: 4, Mem: 8G, Disk: 35G |
 | 10.10.100.160 |  centos  | mykey.key |  CentOS6, ELK  | Cpu: 8, Mem: 8G, Disk: 60G |
 | 10.10.100.173 |  centos  | mykey.key |  CentOS6, Redis  | Cpu: 4, Mem: 8G, Disk: 35G |
 | 10.10.100.23 |  root  | 62cddbcc624b1b072d84117cc0e5a4db |  CentOS7, Docker  | Cpu: 40, Mem: 128G, Disk: 800G |

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

@@ -86,10 +86,11 @@ public enum BizExceptionCode implements BaseExceptionCode {
     BANK_AMOUNT_NOTENOUGH(74004, "资金账号不足"),
     SUBLEDGER_NOT_EXIS(74005,"来源单据不存在"),
     CHECK_SETACOUNT_EXIS(74006, "不能删除单据日期小于等于结账期间<u>%s</u>的单据"),
-    VERIFICATION_CHECK_BALANCE(74007,"核销金额不能大于未核销金额"),
+    VERIFICATION_CHECK_BALANCE(74007,"保存失败,本次核销金额不相等!"),
     DELETE_NOT_EXIS(74008,"删除失败,当前单据不存在!"),
     DOCUMENTS_AUDITED(74009,"存在已审核单据:%S"),
-    DOCUMENTS_UNAUDITED(74009,"存在未审核单据:%S"),
+    DOCUMENTS_UNAUDITED(74010,"存在未审核单据:%S"),
+    BANK_AMOUNT_NOTENOUGHS(74011, "资金账号不足:%S"),
 
 
 

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

@@ -17,7 +17,7 @@
       (
 	  select concat('{"x":"其它","y":',ifnull(round((all_sum - five_sum)/10000,2),0),'}') other from (
 		(select sum(si_amount) all_sum from statsinfo  where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='PURC')a,
-        (select sum(si_amount) five_sum from statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='PURC' ORDER BY si_amount desc limit 0,5) b)
+        (select sum(si_amount) five_sum from (select si_amount from  statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='PURC' ORDER BY si_amount desc limit 0,5)e) b)
 	  ) b1
     </select>
 
@@ -72,7 +72,7 @@
     ) c)d,(
 
     select concat('{"x":"其它","y":',ifnull(round((all_sum - five_sum)/10000,2),0),'}') other from ( (select sum(si_amount) all_sum from statsinfo  where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE')a,
-    (select sum(si_amount) five_sum from statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE' ORDER BY si_amount desc limit 0,5)b))e)
+    ( select sum(si_amount) five_sum from (select si_amount from statsinfo where companyid=#{componyId} and si_yearmonth=DATE_FORMAT(now(),'%Y%m') and si_type='SALE' ORDER BY si_amount desc limit 0,5)f)b))e)
     </select>
 
     <select id="getSaleFutureData" parameterType="long" resultType="string">

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

@@ -251,7 +251,7 @@
       #{item.ca_text3,jdbcType=VARCHAR},
       #{item.ca_text4,jdbcType=VARCHAR},
       #{item.ca_text5,jdbcType=VARCHAR},
-      #{creatorId,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{creatorName,jdbcType=VARCHAR}
+      #{item.creatorId,jdbcType=INTEGER}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.creatorName,jdbcType=VARCHAR}
        )
     </foreach>
   </insert>

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

@@ -262,7 +262,7 @@
       #{item.updateTime,jdbcType=TIMESTAMP}, #{item.vc_text1,jdbcType=VARCHAR}, #{item.vc_text2,jdbcType=VARCHAR},
       #{item.vc_text3,jdbcType=VARCHAR}, #{item.vc_text4,jdbcType=VARCHAR}, #{item.vc_text5,jdbcType=VARCHAR},
       #{item.vc_default,jdbcType=VARCHAR},
-      #{creatorId,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{creatorName,jdbcType=VARCHAR}
+      #{item.creatorId,jdbcType=INTEGER}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.creatorName,jdbcType=VARCHAR}
       )
     </foreach>
   </insert>

+ 4 - 0
applications/money/money-server/pom.xml

@@ -107,6 +107,10 @@
             <version>1.0.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 2 - 0
applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/FundtransferMapper.java

@@ -35,4 +35,6 @@ public interface FundtransferMapper extends CommonBaseMapper<Fundtransfer> {
     String validateBatchUnAudit(List<DocBaseDTO> baseDTOs);
 
     String validateAudit(List<DocBaseDTO> baseDTOs);
+
+    List<String> checkAmount(@Param("companyId") Long companyId, @Param("id") Long id);
 }

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

@@ -19,6 +19,7 @@ import com.usoftchina.saas.money.service.FundtransferService;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import java.util.Date;
@@ -47,11 +48,11 @@ public class FundtransferServiceImpl extends CommonBaseServiceImpl<FundtransferM
     private BankinformationMapper bankinformationMapper;
 
     @Override
+    @Transactional
     public DocBaseDTO insert(Fundtran fundtran) {
         Fundtransfer fundtransfer = fundtran.getMain();
         List<Fundtransferdetail> fundtransferdetails = fundtran.getItems();
 
-
         String ft_code = fundtransfer.getFt_code();
 
         //编号校验
@@ -111,6 +112,13 @@ public class FundtransferServiceImpl extends CommonBaseServiceImpl<FundtransferM
         DocBaseDTO docBaseDTO = this.insert(fundtran);
         Long id = docBaseDTO.getId();
 
+        List<String> bankName = fundtransferMapper.checkAmount(BaseContextHolder.getCompanyId(), id);
+        if (bankName.size() > 0){
+            String name = org.apache.commons.lang3.StringUtils.join(bankName, ",");
+            String message = BizExceptionCode.BANK_AMOUNT_NOTENOUGHS.getMessage();
+            throw new BizException(500, String.format(message, name));
+        }
+
 
         //取从表金额更新中间表、资金账号表
         List<Fundtransferdetail> fundtransferdetailList = fundtran.getItems();
@@ -126,6 +134,7 @@ public class FundtransferServiceImpl extends CommonBaseServiceImpl<FundtransferM
             banksubledger.setBl_bankcode(fundtransferdetail.getFtd_inbankcode());
             banksubledger.setBl_bankname(fundtransferdetail.getFtd_inbankname());
             banksubledger.setBl_code(fundtransfer.getFt_code());
+
             banksubledger.setBl_kind("资金转账");
             banksubledger.setBl_date(fundtransfer.getFt_date());
             banksubledger.setBl_income(fundtransferdetail.getFtd_nowbalance());

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

@@ -336,7 +336,7 @@ public class OthreceiptsServiceImpl extends CommonBaseServiceImpl<OthreceiptsMap
 
     @Override
     public void othreceiptsBatchAudit(BatchDealBaseDTO baseDTO){
-        String validate = othreceiptsMapper.validateBatchUnAudit(baseDTO.getBaseDTOs());
+        String validate = othreceiptsMapper.validateAudit(baseDTO.getBaseDTOs());
         if (!StringUtils.isEmpty(validate)){
             String message = BizExceptionCode.DOCUMENTS_AUDITED.getMessage();
             throw new BizException(500, String.format(message, validate));

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

@@ -332,7 +332,7 @@ public class OthspendingsServiceImpl extends CommonBaseServiceImpl<OthspendingsM
     @Override
     public void othspendingBatchAudit(BatchDealBaseDTO baseDTO){
 
-        String validate = othspendingsMapper.validateBatchUnAudit(baseDTO.getBaseDTOs());
+        String validate = othspendingsMapper.validateAudit(baseDTO.getBaseDTOs());
         if (!StringUtils.isEmpty(validate)){
             String message = BizExceptionCode.DOCUMENTS_AUDITED.getMessage();
             throw new BizException(500, String.format(message, validate));

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

@@ -436,7 +436,7 @@ public class PaybalanceServiceImpl extends CommonBaseServiceImpl<PaybalanceMappe
 
     @Override
     public void paybalanceBatchAudit(BatchDealBaseDTO baseDTO){
-        String validate = paybalanceMapper.validateBatchUnAudit(baseDTO.getBaseDTOs());
+        String validate = paybalanceMapper.validateAudit(baseDTO.getBaseDTOs());
         if (!StringUtils.isEmpty(validate)){
             String message = BizExceptionCode.DOCUMENTS_AUDITED.getMessage();
             throw new BizException(500, String.format(message, validate));
@@ -515,32 +515,20 @@ public class PaybalanceServiceImpl extends CommonBaseServiceImpl<PaybalanceMappe
         subledger.setSl_vendid(paybalance.getPb_vendid());
         subledger.setSl_date(paybalance.getPb_date());
         subledger.setSl_ym(DateUtils.getYm(paybalance.getPb_date()));
-        if (paybalance.getPb_pdamount() == null){
-            subledger.setSl_amount((double) 0);
-        }else {
-            subledger.setSl_amount(paybalance.getPb_pdamount() * -1);
-        }
-        subledger.setSl_orderamount(paybalance.getPb_pdamount());
+        Double pdamount = paybalance.getPb_pdamount()==null?new Double(0):paybalance.getPb_pdamount();
+        Double preamount = paybalance.getPb_preamount()==null?new Double(0):paybalance.getPb_preamount();
+        Double pbdamount = new Double(0);
+        subledger.setSl_amount(-pdamount);
+        subledger.setSl_yamount(preamount);
+        subledger.setSl_orderamount(pdamount);
 
-        Double yamount = paybalance.getPb_preamount();
-        if (yamount == null){
-            yamount = Double.valueOf(0);
-        }
-        if (yamount > 0 || yamount < 0){
-            subledger.setSl_yamount(yamount);
-        }else {
-            subledger.setSl_yamount((double) 0);
+        if(preamount!=0){
+            pbdamount = paybalance.getPb_pbdamount()==null?new Double(0):paybalance.getPb_pbdamount();
         }
-        if (subledger.getSl_orderamount() == null){
-            subledger.setSl_orderamount((double) 0);
-        }
-
-        if (subledger.getSl_discount() == null){
-            subledger.setSl_discount((double) 0);
-        }
-        subledger.setSl_namount(subledger.getSl_orderamount() + subledger.getSl_discount() - subledger.getSl_yamount());
+        subledger.setSl_namount(pdamount-pbdamount);
         subledger.setSl_remark(subledger.getSl_remark());
-        subledger.setSl_preamount(subledger.getSl_preamount());
+        subledger.setSl_preamount(preamount);
+
 
         subledgerMapper.insertSelective(subledger);
     }

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

@@ -441,7 +441,7 @@ public class RecbalanceServiceImpl extends CommonBaseServiceImpl<RecbalanceMappe
 
     @Override
     public void recbalanceBatchAudit(BatchDealBaseDTO baseDTO){
-        String validate = recbalanceMapper.validateBatchUnAudit(baseDTO.getBaseDTOs());
+        String validate = recbalanceMapper.validateAudit(baseDTO.getBaseDTOs());
         if (!StringUtils.isEmpty(validate)){
             String message = BizExceptionCode.DOCUMENTS_AUDITED.getMessage();
             throw new BizException(500, String.format(message, validate));
@@ -521,11 +521,15 @@ public class RecbalanceServiceImpl extends CommonBaseServiceImpl<RecbalanceMappe
         subledger.setSl_ym(DateUtils.getYm(recbalance.getRb_date()));
         Double rdamount = recbalance.getRb_rdamount()==null?new Double(0):recbalance.getRb_rdamount();
         Double preamount = recbalance.getRb_preamount()==null?new Double(0):recbalance.getRb_preamount();
+        Double pbdamount = new Double(0);
         subledger.setSl_amount(-rdamount);
         subledger.setSl_yamount(preamount);
         subledger.setSl_orderamount(rdamount);
 
-        subledger.setSl_namount(rdamount-preamount);
+        if(preamount!=0){
+            pbdamount = recbalance.getRb_rbdamount()==null?new Double(0):recbalance.getRb_rbdamount();
+        }
+        subledger.setSl_namount(rdamount-pbdamount);
         subledger.setSl_remark(subledger.getSl_remark());
         subledger.setSl_preamount(preamount);
 

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

@@ -279,9 +279,23 @@
     </foreach>
   </select>
   <select id="validateBatchUnAudit" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
-    select GROUP_CONCAT(ft_code) from fundtransfer where sa_statuscode='UNAUDITED' and ft_id in
+    select GROUP_CONCAT(ft_code) from fundtransfer where ft_statuscode='UNAUDITED' and ft_id in
     <foreach collection="list" item="item" open="(" close=")" separator=",">
       #{item.id}
     </foreach>
   </select>
+
+  <select id="checkAmount" resultType="java.lang.String">
+    select b.ftd_bankname from
+    (select a.ft_id,a.ft_code,a.companyid,a.ftd_bankid,a.ftd_bankcode,a.ftd_bankname,sum(a.ftd_nowbalance) ftd_nowbalance from
+    (SELECT ft_id,ft_code,fundtransfer.companyid,ftd_bankid,ftd_bankcode,ftd_bankname,-1*ftd_nowbalance ftd_nowbalance
+    FROM fundtransfer,fundtransferdetail
+    WHERE ft_id=ftd_ftid
+    UNION ALL select ft_id,ft_code,fundtransfer.companyid,ftd_inbankid,ftd_inbankcode,ftd_inbankname,ftd_nowbalance
+    FROM fundtransfer,fundtransferdetail
+    WHERE ft_id=ftd_ftid) a group by a.ft_id,a.ft_code,a.companyid,a.ftd_bankid,a.ftd_bankcode,a.ftd_bankname) b,
+    BANKINFORMATION
+    where b.ftd_bankid=BK_ID and 0 > ftd_nowbalance and abs(ftd_nowbalance)>bk_thisamount and b.companyid = #{companyId}
+     and b.ft_id = #{id}
+  </select>
 </mapper>

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

@@ -310,9 +310,8 @@
   </select>
   <select id="selectOthreceiptsBycondition" resultMap="BaseResultMap">
     select
-    <include refid="Base_Column_List" />,
-    <include refid="Detail_Column_List" />
-    from Othreceipts left join othreceiptsdetail on ord_orid=or_id and Othreceipts.companyId=othreceiptsdetail.companyId
+    <include refid="Base_Column_List" />
+    from Othreceipts
     <where>
       <if test="con != null">
         ${con}

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

@@ -306,10 +306,8 @@
 
   <select id="selectOthspendingsBycondition" resultMap="BaseResultMap">
     select
-    <include refid="Base_Column_List" />,
-    <include refid="Detail_Column_List" />
-    from Othspendings left join othspendingsdetail on osd_osid=os_id
-    and Othspendings.companyId=othspendingsdetail.companyId
+    <include refid="Base_Column_List" />
+    from Othspendings
     <where>
       <if test="con != null">
         ${con}

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

@@ -424,9 +424,8 @@
 
   <select id="selectPaybalanceBycondition" resultMap="BaseResultMap">
     select
-    <include refid="Base_Column_List" />,
-    <include refid="detail_Column_List" />
-    from paybalance left join paybalancedet on pd_pbid=pb_id and paybalance.companyId=paybalancedet.companyId
+    <include refid="Base_Column_List" />
+    from paybalance
     <where>
       <if test="con != null">
         ${con}

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

@@ -138,9 +138,8 @@
 
   <select id="selectRecbalanceBycondition" resultMap="BaseResultMap">
     select
-    <include refid="Base_Column_List" />,
-    <include refid="detail_Column_List" />
-    from recbalance left join recbalancedet on rd_rbid=rb_id and recbalance.companyId=recbalancedet.companyId
+    <include refid="Base_Column_List" />
+    from recbalance
     <where>
       <if test="con != null">
         ${con}

+ 13 - 2
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/ProdInOutController.java

@@ -9,6 +9,7 @@ import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.purchase.dto.ProdInOutFormDTO;
 import com.usoftchina.saas.purchase.po.ProdInOutList;
 import com.usoftchina.saas.purchase.service.ProdInOutService;
+import com.usoftchina.saas.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -130,7 +131,12 @@ public class ProdInOutController {
      */
     @PostMapping("/batchAudit")
     public Result batchAudit(@RequestBody BatchDealBaseDTO baseDTOs) {
-        return Result.success(prodInOutService.batchAudit(baseDTOs));
+        String mess = prodInOutService.batchAudit(baseDTOs);
+        if (StringUtils.hasLength(mess)){
+            return Result.error(mess);
+        }else {
+            return Result.success(mess);
+        }
     }
 
     /**
@@ -141,7 +147,12 @@ public class ProdInOutController {
      */
     @PostMapping("/batchUnAudit")
     public Result batchUnAudit(@RequestBody BatchDealBaseDTO baseDTOs) {
-        return Result.success(prodInOutService.batchUnAudit(baseDTOs));
+        String mess = prodInOutService.batchUnAudit(baseDTOs);
+        if (StringUtils.hasText(mess)){
+            return Result.error(mess);
+        }else {
+            return Result.success(mess);
+        }
     }
 
     /**

+ 2 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/PurchaseMapper.java

@@ -36,4 +36,6 @@ public interface PurchaseMapper extends CommonBaseMapper<Purchase>{
     Integer validateVendor(@Param("id") Long id);
 
     Integer validateProduct(@Param("id") Long id);
+
+    void updateDelivery(@Param("id")Long id);
 }

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

@@ -15,7 +15,6 @@ import com.usoftchina.saas.commons.po.BillCodeSeq;
 import com.usoftchina.saas.commons.po.Operation;
 import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
-import com.usoftchina.saas.document.api.ProductApi;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageRequest;
@@ -51,8 +50,6 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
     @Autowired
     private PurchaseListMapper purchaseListMapper;
     @Autowired
-    private ProductApi productApi;
-    @Autowired
     private MaxnumberService maxnumberService;
     @Autowired
     private ProdInOutMapper prodInOutMapper;
@@ -143,7 +140,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
                 detail.setPd_puid(pu_id);
                 detail.setPd_code(pu_code);
                 detail.setPd_yqty(new Double(0));
-                detail.setPd_delivery(item.getPd_delivery()==null?purchase.getPu_delivery():item.getPd_delivery());
+//                detail.setPd_delivery(item.getPd_delivery()==null?purchase.getPu_delivery():item.getPd_delivery());
                 detail.setCompanyId(companyId);
                 detail.setCreatorId(userId);
                 detail.setCreateTime(new Date());
@@ -169,7 +166,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             PurchaseDetail detail = BeanMapper.map(item, PurchaseDetail.class);
             detail.setPd_puid(pu_id);
             detail.setPd_code(pu_code);
-            detail.setPd_delivery(item.getPd_delivery()==null?purchase.getPu_delivery():item.getPd_delivery());
+//            detail.setPd_delivery(item.getPd_delivery()==null?purchase.getPu_delivery():item.getPd_delivery());
             detail.setUpdaterId(userId);
             detail.setUpdateTime(new Date());
             if (StringUtils.isEmpty(detail.getId()) || "0".equals(detail.getId().toString())) {
@@ -190,7 +187,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             purchasedetailMapper.batchUpdate(updateDetails);
         }
         baseDTO = getBaseDTOById(pu_id);
-
+        //明细需求日期为空时==主表交货日期
+        getMapper().updateDelivery(pu_id);
         //计算金额,未税单价,未税金额等
         calcPurchase(pu_id);
         //日志

+ 3 - 0
applications/purchase/purchase-server/src/main/resources/mapper/PurchaseMapper.xml

@@ -439,6 +439,9 @@
     select count(1) from purchasedetail left join product on PD_PRODID=pr_id where  pd_puid=#{id} and pr_statuscode='CLOSE';
   </select>
 
+  <update id="updateDelivery" parameterType="long">
+    update purchasedetail set PD_DELIVERY = (select PU_DELIVERY from purchase where pu_id=#{id}) where pd_puid=#{id} and PD_DELIVERY is null
+  </update>
 
 
 </mapper>

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

@@ -69,6 +69,8 @@
     <result column="pi_auditdate" jdbcType="TIMESTAMP" property="pi_auditdate" />
     <result column="pi_auditman" jdbcType="VARCHAR" property="pi_auditman" />
     <result column="pi_remark" jdbcType="VARCHAR" property="pi_remark" />
+    <result column="pi_prstatus" jdbcType="VARCHAR" property="pi_prstatus" />
+    <result column="pi_prstatuscode" jdbcType="VARCHAR" property="pi_prstatuscode" />
   </resultMap>
 
 

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

@@ -166,4 +166,6 @@ public class ProdInOutList extends CommonBaseEntity{
     private String pr_text2;
     private String pr_text3;
     private String pr_text4;
+    private String pi_prstatus;
+    private String pi_prstatuscode;
 }

+ 13 - 4
applications/storage/storage-server/src/main/java/com/usoftchina/saas/storage/controller/ProdInOutController.java

@@ -9,6 +9,7 @@ import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.storage.dto.ProdInOutFormDTO;
 import com.usoftchina.saas.storage.po.ProdInOutList;
 import com.usoftchina.saas.storage.service.ProdInOutService;
+import com.usoftchina.saas.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -131,8 +132,12 @@ public class ProdInOutController {
      */
     @PostMapping("/batchAudit")
     public Result batchAudit(@RequestBody BatchDealBaseDTO baseDTOs) {
-        String res = prodInOutService.batchAudit(baseDTOs);
-        return Result.success(res);
+        String mess = prodInOutService.batchAudit(baseDTOs);
+        if (StringUtils.hasLength(mess)){
+            return Result.error(mess);
+        }else {
+            return Result.success(mess);
+        }
     }
 
     /**
@@ -143,8 +148,12 @@ public class ProdInOutController {
      */
     @PostMapping("/batchUnAudit")
     public Result batchUnAudit(@RequestBody BatchDealBaseDTO baseDTOs) {
-        String res = prodInOutService.batchUnAudit(baseDTOs);
-        return Result.success(res);
+        String mess = prodInOutService.batchUnAudit(baseDTOs);
+        if (StringUtils.hasText(mess)){
+            return Result.error(mess);
+        }else {
+            return Result.success(mess);
+        }
     }
 
     /**

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

@@ -263,7 +263,7 @@
 
   <select id="checkUnPostStockProfit" resultType="int">
     select
-    count(*)
+    count(a.st_prodid)
     from
     (select pd_prodid,pd_whid from prodiodetail left join prodinout on pd_piid = pi_id
     where prodinout.companyId=#{companyId,jdbcType=INTEGER} and (pi_remark='盘盈单' or pi_remark='盘亏单')) b

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

@@ -11,6 +11,7 @@ import com.usoftchina.saas.auth.client.annotation.IgnoreAuth;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
@@ -18,6 +19,7 @@ import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.RegexpUtils;
 import com.usoftchina.sso.api.SsoUserApi;
+import com.usoftchina.sso.dto.SsoCheckMobile;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -116,10 +118,20 @@ public class AccountController {
         Account account = null;
         // 根据手机号、邮箱、用户名片段判断是否已注册
         boolean checked = accountService.findByUsernameOrMobileOrEmail(accountAddDTO.getUsername(), accountAddDTO.getMobile(), accountAddDTO.getEmail());
+        //不存在 ——> 保存 , 存在 ——> 更新
         if (!checked) {
             account = BeanMapper.map(accountAddDTO, Account.class);
             account.setEnabled(true);
             accountService.save(account);
+        }else{
+            Account accountTemp = accountService.findByMobile(accountAddDTO.getMobile());
+            if (accountTemp == null){
+                accountTemp = accountService.findByEmail(accountAddDTO.getEmail());
+            }
+            account = BeanMapper.map(accountAddDTO, Account.class);
+            account.setEnabled(true);
+            account.setId(accountTemp.getId());
+            accountService.updateByPrimaryKeySelective(account);
         }
         account = accountService.findByMobile(accountAddDTO.getMobile());
         //绑定企业
@@ -137,7 +149,20 @@ public class AccountController {
      */
     @GetMapping("/checkMobile")
     public Result checkMobile(@RequestParam("mobile") String mobile){
-        return Result.success(ssoUserApi.checkMobile(mobile));
+        SsoCheckMobile ssoCheckMobile = ssoUserApi.checkMobile(mobile);
+        Long companyId = BaseContextHolder.getCompanyId();
+        if (ssoCheckMobile.isHasRegister()){
+            Account account = accountService.findByMobile(mobile);
+            if (account != null){
+                List<CompanyBaseVO> companyBaseVOList = companyService.findBaseByAccountId(account.getId());
+                for (CompanyBaseVO companyBaseVO : companyBaseVOList){
+                    if (companyBaseVO.getId().equals(companyId)){
+                        throw new BizException(ExceptionCode.USER_COMPANY_EXIST);
+                    }
+                }
+            }
+        }
+        return Result.success(ssoCheckMobile);
     }
 
     @GetMapping("/checkEmail")
@@ -396,6 +421,8 @@ public class AccountController {
     @PostMapping("/disable")
     public Result disableAccount(@RequestParam long accountId) {
         accountService.disable(accountId);
+        //移除账户绑定的企业关系
+        accountService.unbindCompany(accountId, BaseContextHolder.getCompanyId());
         //同步到优软云
         Long userUU = accountService.findByPrimaryKey(accountId).getUu();
         Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
@@ -413,10 +440,12 @@ public class AccountController {
     @PostMapping("/enable")
     public Result enableAccount(@RequestParam long accountId) {
         accountService.enable(accountId);
+        //添加账户绑定的企业关系
+        accountService.bindCompany(accountId, BaseContextHolder.getCompanyId());
         //同步到优软云
-//        Long userUU = accountService.findByPrimaryKey(accountId).getUu();
-//        Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
-//        String result = ssoUserApi.bind("bind", "trade-app", userUU, companyUU);
+        Long userUU = accountService.findByPrimaryKey(accountId).getUu();
+        Long companyUU = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId()).getUu();
+        String result = ssoUserApi.bind("bind", "trade-app", userUU, companyUU);
         accountService.clearCache(accountId);
         return Result.success();
     }

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

@@ -19,4 +19,11 @@ public interface RoleMapper extends CommonBaseMapper<Role> {
      * @return
      */
     List<Role> selectByAccountId(@Param("accountId") long accountId);
+
+    /**
+     * 查找公司管理员角色
+     * @param companyId
+     * @return
+     */
+    Role findManagerByCompanyId(@Param("companyId") Long companyId);
 }

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

@@ -52,4 +52,11 @@ public interface RoleService extends CommonBaseService<RoleMapper, Role> {
      * @return
      */
     boolean saveRoleResource(PowerSetListDTO powerSetListDTO);
+
+    /**
+     *
+     * @param companyId
+     * @return
+     */
+    Role findManagerByCompanyId(Long companyId);
 }

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

@@ -4,12 +4,15 @@ import com.usoftchina.saas.account.dto.*;
 import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
 import com.usoftchina.saas.account.po.Account;
 import com.usoftchina.saas.account.po.Company;
+import com.usoftchina.saas.account.po.Role;
 import com.usoftchina.saas.account.service.AccountCenterService;
 import com.usoftchina.saas.account.service.AccountService;
 import com.usoftchina.saas.account.service.CompanyService;
+import com.usoftchina.saas.account.service.RoleService;
 import com.usoftchina.saas.auth.api.AuthApi;
 import com.usoftchina.saas.auth.dto.TokenDTO;
 import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.StringUtils;
@@ -38,6 +41,8 @@ public class AccountCenterServiceImpl implements AccountCenterService {
     @Autowired
     private AccountService accountService;
     @Autowired
+    private RoleService roleService;
+    @Autowired
     private SsoUserApi ssoUserApi;
     @Autowired
     private SsoUserSpaceApi ssoUserSpaceApi;
@@ -57,7 +62,8 @@ public class AccountCenterServiceImpl implements AccountCenterService {
         //a. 判断是否已注册
         Company company = companyService.findByName(companyRegDTO.getName());
         if (null != company) {
-            return Result.error(ExceptionCode.COMPANY_NAME_EXIST);
+            Account account = accountService.findByPrimaryKey(company.getCreatorId());
+            throw new BizException(ExceptionCode.COMPANY_CODE_EXIST.getCode(), String.format(ExceptionCode.COMPANY_NAME_HASREGISTER.getMessage(), account.getRealname()+"("+account.getMobile()+")"));
         }
         company = companyService.findByBusinessCode(companyRegDTO.getBusinessCode());
         if (null != company) {
@@ -89,6 +95,11 @@ public class AccountCenterServiceImpl implements AccountCenterService {
         map.put("result", null);
         accountCompanyMapper.initData(map);
 
+        //账户绑定角色    默认管理员
+        Role role = roleService.findManagerByCompanyId(company.getId());
+        if (role != null) {
+            accountService.bindRole(accountId, role.getId());
+        }
         return Result.success();
     }
 

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

@@ -166,6 +166,11 @@ public class RoleServiceImpl extends CommonBaseServiceImpl<RoleMapper, Role> imp
         return true;
     }
 
+    @Override
+    public Role findManagerByCompanyId(Long companyId) {
+        return getMapper().findManagerByCompanyId(companyId);
+    }
+
     /**
      * 设置其他默认权限,用于生成设置按钮
      * @param powerDTO

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

@@ -104,4 +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 * FROM AC_ROLE WHERE COMPANY_ID = #{companyId} AND TYPE = 0 limit 1
+    </select>
 </mapper>

+ 5 - 0
base-servers/auth/auth-common/pom.xml

@@ -44,6 +44,11 @@
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 17 - 0
base-servers/auth/auth-common/src/test/java/com/usoftchina/saas/auth/common/jwt/JwtHelperTest.java

@@ -0,0 +1,17 @@
+package com.usoftchina.saas.auth.common.jwt;
+
+import static org.junit.Assert.*;
+
+public class JwtHelperTest {
+    @org.junit.Test
+    public void generateToken() throws Exception {
+    }
+
+    @org.junit.Test
+    public void getInfoFromToken() throws Exception {
+        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzdWx5IiwiYXBwSWQiOiJ0cmFkZS1hcHAiLCJ1c2VySWQiOjQzLCJjb21wYW55SWQiOjEsInVzZXJOYW1lIjoic3VseSIsInJlYWxOYW1lIjoi6IuP54G16LCjIiwiZXhwIjoxNTQzNDExNzY0fQ.KMZV5H4tH4ifYBmY7rV4HSsW1fZHU2k-Yl47b9C3bt6S1_BqzTO-RbVDNMR-WXHpHFwXiq0aoHbqaA512z_-icLPcmeCb2TmnERisgjhnqn7OYordtAWahNlZfiaExnnttLvcNHQSiOWK9vYxxHnf2gC34XdKI0Bo8QZRSR3eo8";
+        String keyPath = "pub.key";
+        JwtInfo info = JwtHelper.getInfoFromToken(token, keyPath);
+    }
+
+}

TEMPAT SAMPAH
base-servers/auth/auth-common/src/test/resources/pub.key


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

@@ -8,10 +8,7 @@ import com.usoftchina.sso.dto.SsoUser;
 import com.usoftchina.sso.dto.SsoUserSpaceList;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author yingp
@@ -57,9 +54,20 @@ public interface SsoUserApi {
      * @param spaceUU
      * @return
      */
-    @PostMapping("")
+    @RequestMapping(params = "_operate=unbind", method = RequestMethod.POST)
     String unbind(@RequestParam("_operate") String _operate, @RequestParam("userUU") Long userUU, @RequestParam("spaceUU") Long spaceUU);
 
+    /**
+     * 绑定用户和企业
+     * @param _operate
+     * @param appId
+     * @param userUU
+     * @param spaceUU
+     * @return
+     */
+    @RequestMapping(params = "_operate=bind", method = RequestMethod.POST)
+    String bind(@RequestParam("_operate") String _operate, @RequestParam("appId") String appId, @RequestParam("userUU") Long userUU, @RequestParam("spaceUU") Long spaceUU);
+
     @Component
     class DefaultFallback implements SsoUserApi{
         @Override
@@ -82,5 +90,10 @@ public interface SsoUserApi {
             return null;
         }
 
+        @Override
+        public String bind(String _operate, String appId, Long userUU, Long spaceUU) {
+            return null;
+        }
+
     }
 }

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

@@ -62,4 +62,11 @@ public class SsoUserApiTest {
         System.out.println(result);
     }
 
+    @Test
+    public void testF_bind(){
+        Long companyUU = 10050435l;
+        Long userUU = 1000027276l;
+        String result = ssoUserApi.bind("bind","trade-app", userUU, companyUU);
+        System.out.println(result);
+    }
 }

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

@@ -9,5 +9,13 @@ zipkin:
   collector:
     rabbitmq:
       uri: amqp://saas:select123***@10.10.100.103:5672/docker
+  storage:
+    type: elasticsearch
+    elasticsearch:
+      hosts: 10.10.100.160:9200
+      index: zipkin
+      index-shards: 5
+      index-replicas: 1
+      max-requests: 64
 logging:
   destination: 10.10.100.160:5000

+ 2 - 0
framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java

@@ -30,6 +30,7 @@ public enum ExceptionCode implements BaseExceptionCode {
 
     // 账户管理相关
     COMPANY_NAME_EXIST(52000, "公司名称已注册"),
+    COMPANY_NAME_HASREGISTER(52000, "企业已开通saas,请联系管理员 %s 将您添加至企业"),
     COMPANY_CODE_EXIST(52001, "公司商业登记证号已注册"),
     COMPANY_DOMAIN_EXIST(52002, "域名已存在"),
     COMPANY_NOT_EXIST(52003, "公司不存在"),
@@ -43,6 +44,7 @@ public enum ExceptionCode implements BaseExceptionCode {
     USER_NOT_ENABLE(53006, "用户禁止使用"),
     ROLE_NOT_EXIST(53020, "角色不存在"),
     MISSING_PERMISSIONS(53030, "权限缺失"),
+    USER_COMPANY_EXIST(53007, "企业已存在账户"),
 
     // 文件相关
     FOLDER_NOT_EXISTS(55000, "文件夹不存在"),

+ 11 - 5
frontend/saas-portal-web/index.html

@@ -6,10 +6,16 @@
     <!-- meta character set -->
 		<!-- Always force latest IE rendering engine or request Chrome Frame -->
         <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-		<!-- Meta Description -->
-        <meta name="description" content="Blue One Page Creative HTML5 Template">
-        <meta name="keywords" content="one page, single page, onepage, responsive, parallax, creative, business, html5, css3, css3 animation">
-        <meta name="author" content="Themefisher">
+    <!-- Meta Description -->
+        <!-- 网站主要内容 -->
+        <meta name="description" content="SAAS、软件及服务、云ERP、进销存、企业管理、电子行业、任务管理、寻源管理、资金管理、甘特图、项目管理、找供应商、电子元器件、贸易、贸易版、贸易版ERP">
+        <!-- 网页关键词 -->
+        <meta name="keywords" content="SAAS、软件及服务、云ERP、进销存、企业管理、电子行业、任务管理、寻源管理、资金管理、甘特图、项目管理、找供应商、电子元器件、贸易、贸易版、贸易版ERP">
+        <!-- 网页制作作者 -->
+        <meta name="author" content="优软科技">
+        <meta name="Robots" content="all|index|follow">
+        
+        <link rel="icon" type="image/x-icon" href="./static/img/logo.png"/>
 
         <link rel="stylesheet" href="./static/css/animate.css">
         <link rel="stylesheet" href="./static/css/bootstrap.min.css">
@@ -36,7 +42,7 @@
 
         <script src="./static/js/sockjs.min.js"></script>
         <script src="./static/js/stomp.min.js"></script>
-    <title>saas</title>
+    <title>优企云服</title>
   </head>
   <body>
     <div id="app"></div>

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

@@ -14,12 +14,13 @@
                     <ul>
                         <li style="margin: 0">
                             <span class="qy-biaoti"><span class="xingxing">*</span>公司名称</span>
-                            <input ref="qyname" @change= "spaceName" type="text">
+                            <input class="inpind" ref="qyname" @change= "spaceName" type="text">
                             <dir class="qy-Tips"><span ref="qyno" style="color:red"></span></dir>
                         </li>
                         <li>
                             <span class="qy-biaoti">所属行业</span>
-                            <select ref="qyindustry" style="width:59%;height: 30px" name="selectAge" id="selectAge">   
+                            <select ref="qyindustry" style="width:59%;height: 30px;padding-left:5px" name="selectAge" id="selectAge">   
+                                <option value="">请选择所属行业</option>
                                 <option value="贸易零售">贸易零售</option>
                                 <option value="制造加工">制造加工</option>
                                 <option value="服务业">服务业</option>
@@ -40,7 +41,7 @@
                             </select>
                         </li>
                         <li style="height:70px;">
-                            <span class="qy-biaoti left">公司地址</span>
+                            <span class="qy-biaoti left"><span class="xingxing">*</span>公司地址</span>
                             <div class="addbiaoqian">
                                 <!-- <v-distpicker @province= 'qyprovince' @city= 'qycity' @area= 'qyarea'></v-distpicker> -->
                                 <v-distpicker @selected= 'selected'></v-distpicker>
@@ -62,13 +63,13 @@
                     <ul>
                         <li style="margin:0">
                             <span class="qy-biaoti"><span class="xingxing">*</span>姓名</span>
-                            <input @change= "yzusername" ref="name" type="text">
+                            <input class="inpind" @change= "yzusername" ref="name" type="text">
                             <div class="qy-Tips Tips-buttom"><span ref="usname" style="color:red"></span></div>
                         </li>
                         <li><span class="qy-biaoti">手机号</span><span>{{mytoken.account.mobile}}</span></li>
                         <li style='margin:0'>
                             <span class="qy-biaoti">邮箱</span>
-                            <input @change="email" ref="email" type="email">
+                            <input class="inpind" @change="email" ref="email" type="email">
                             <div class="qy-Tips Tips-buttom"><span style="color:red">{{Email}}</span></div>
                         </li>
                     </ul>
@@ -93,7 +94,7 @@ import VDistpicker from 'v-distpicker'
                 isaddress: false,//公司地址验证
                 isname: false,//姓名验证
                 isspaceName: false,//公司名验证
-                isemail: false,//邮箱
+                isemail: true,//验证邮箱
                 disabled: true
             }
         },
@@ -133,7 +134,7 @@ import VDistpicker from 'v-distpicker'
                             if (res.data.data.success) {
                                 this.qymingzi = true;
                             } else {
-                                this.$refs.qyno.innerHTML = '企业已注册';
+                                this.$refs.qyno.innerHTML = '企业已在优软云注册';
                                 this.qymingzi = false
                             }
                         })
@@ -176,12 +177,17 @@ import VDistpicker from 'v-distpicker'
             email(){
                 let reg = new RegExp("^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$"); 
                 let email = this.$refs.email.value;//邮箱
-                if (!reg.test(email)) {
-                    this.Email = '请填写正确的邮箱'
-                    this.isemail = false
-                } else {
+                if (email == '') {
+                    this.isemail = true;
                     this.Email = ''
-                    this.isemail = true
+                } else {
+                    if (!reg.test(email)) {
+                        this.Email = '请填写正确的邮箱';
+                        this.isemail = false
+                    } else {
+                        this.Email = '';
+                        this.isemail = true;
+                    }
                 }
             },
             //保存
@@ -219,7 +225,7 @@ import VDistpicker from 'v-distpicker'
                         // console.log("请求失败",err)
                     })
                 } else {
-                    this.$refs.tjtishi.innerHTML = '企业名称姓名不能为空或包含有非法字符'
+                    this.$refs.tjtishi.innerHTML = '企业名称,地址,姓名不能为空或包含有非法字符'
                     setTimeout(() => {
                         this.$refs.tjtishi.innerHTML = ''
                     }, 3000);
@@ -268,6 +274,9 @@ import VDistpicker from 'v-distpicker'
 .addbiaoqian>>>.distpicker-address-wrapper select {
     height: 30px;
 }
+.addbiaoqian>>>.distpicker-address-wrapper {
+    width: 110%
+}
 .qy-Tips {
     margin: 0;
     text-align: left;
@@ -277,4 +286,7 @@ import VDistpicker from 'v-distpicker'
 .Tips-buttom {
     margin-left: 22%;
 }
+.inpind {
+    padding-left: 10px;
+}
 </style>

+ 17 - 13
frontend/saas-portal-web/src/components/conenter/company.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <!-- 遮罩 -->
-    <div class="zhezhao" v-if="issetDefault || isOpensaas || isNoopen"></div>
+    <div class="zhezhao" v-if="issetDefault || isOpensaas || isNoopen || isokopensaas"></div>
     <!-- 设置默认弹窗 -->
     <div class="tanchuang szmoren" v-if="issetDefault">
       <div class="over"><img @click="guanbitc" class="right xs" src="/static/img/qiye/chahao.png" alt=""></div>
@@ -33,12 +33,12 @@
       </div>
     </div>
     <!-- 该企业已开通服务弹窗 -->
-    <div class="tanchuang qy-yikaitong" style="display: none">
+    <div class="tanchuang qy-yikaitong" v-if="isokopensaas">
       <div class="over"><img @click="guanbitc" class="right xs" src="/static/img/qiye/chahao.png" alt=""></div>
       <div>
         <div class="tc-okkaitong"><span>该企业已开通服务,联系管理员邀请加入</span></div>
         <div class="tc-context">
-          <!-- <p><span>管理员:</span><span>{{arr[0].admin}}</span></p> -->
+          <p><span>管理员:</span><span>{{arr[0].admin}}</span></p>
           <p><span>管理员手机号:</span><span>{{mytoken.account.mobile}}</span></p>
           <p><span>管理员邮箱:</span><span></span></p>
         </div>
@@ -73,7 +73,7 @@
                     </div>
                     <div>
                         <span v-if = "d.default_" class="gs-btn2 gs-btn3">默认企业</span>
-                        <span v-else @click="showDefaultWin(i)" class="gs-btn2 xs">设为默认</span>
+                        <span v-if="d.saas_" @click="showDefaultWin(i)" class="gs-btn2 xs">设为默认</span>
                     </div>
                 </div>
             </div>
@@ -94,12 +94,12 @@
                 issetDefault: false,//设置默认
                 isOpensaas: false,//开通saas弹窗
                 isNoopen: false,//开通10个不能继续开通
+                isokopensaas: false,//已开通服务
                 index:0,
                 saasid:null,
                 saasindex:0,
                 ktsass: true,//开通saas
                 isDefault: true,//开通默认
-                comdata: this.$store.state.data,//登录成功后的本地数据
                 isAutoLogin: this.$store.state.isAutoLogin,
                 mytoken: JSON.parse(localStorage.getItem('app-state-session')),//本地储存的用户信息
                 arr: []//企业列表信息
@@ -189,13 +189,13 @@
             },
             //进入服务
             selectServe(id){
-                let token = this.mytoken.token;
+                let token1 = this.mytoken.token;
                 const frame = window.frames[window.frames.length - 1];
                 this.$ajax({
                     url: this.$url.api+'/api/auth/switch/company?companyId='+id,
                     method :'get',
                     headers: {
-                        "Authorization":token
+                        "Authorization":token1
                     }
                 })
                 .then(res=>{
@@ -242,7 +242,7 @@
                 let account = {'realname':name,'email':email,'mobile':mobile, 'uu':uu}
                 // let id = this.saasid;
                 this.$ajax({
-                    url: this.$url.api+"/api/account/accountCenter/companyAccount/save",
+                    url: "http://192.168.253.31:8560/api/account/accountCenter/companyAccount/save",
                     method: 'post',
                     data: {
                         companyRegDTO:company,
@@ -254,20 +254,23 @@
                     }
                 })
                 .then(res=>{
-                    console.log('请求成功',res)
-                    if (res.data.data.success) {
+                    // console.log('请求成功',res)
+                    if (res.data.success) {
                         this.ktsass = false;
+                    } else {
+                        this.isokopensaas = true;
                     }
                 })
                 .catch(err=>{
-                    console.log('请求失败',err)
+                    // console.log('请求失败',err)
                 })
             },
             //进入saas服务
             showServeWin(){
                 let id = this.saasid;
                 this.isOpensaas = false;
-                this.$options.methods.selectServe(id)
+                // this.$options.methods.selectServe(id);
+                this.selectServe(id)
             },
             //查看企业详情
             getEnterpriseInfo(d){
@@ -283,7 +286,8 @@
             guanbitc(){
                 this.issetDefault = false;
                 this.isOpensaas = false;
-                this.isNoopen = false
+                this.isNoopen = false;
+                this.isokopensaas = false
             },
             //没有内容也要有一定的高度
             boxheight(){

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

@@ -105,6 +105,7 @@
 
 <script>
 import Session from '@/utils/session'
+import { setTimeout } from 'timers';
     export default {
         data(){
             return{
@@ -133,10 +134,13 @@ import Session from '@/utils/session'
             },
             //退出
             loginout(){
+                this.$router.push({path:'/name'});
+                this.loginout2()
+            },
+            loginout2(){
                 const frame = window.frames[window.frames.length - 1]
                 frame.postMessage('', '*')
                 Session.remove()
-                this.$router.push({name:'name'});
             } 
         },
     }

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

@@ -87,8 +87,7 @@
                  data-slice1-scale="2" data-slice2-scale="2">
               <div class="mask-overly"></div>
               <div class="bg-img slider-1">
-                <!-- <img src="/static/img/assets/beijing2x.png" alt=""> -->
-                <img src="../../../static/img/gongneng/Group 32.png" alt="">
+                <img src="/static/img/banner@3x@2x.png" alt="">
               </div>
               <!-- 首页内容 -->
               <div class="my-text">

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

@@ -1,17 +1,5 @@
 <template>
     <div>
-        <!-- 遮罩 -->
-        <div class="zhezhao" v-if="isId"></div>
-        <!-- 不是管理员不能修改企业信息 -->
-        <div class="tanchuang nokaitong" v-if="isId">
-            <div class="over"><img @click="guanbitc" class="right xs" src="/static/img/qiye/chahao.png" alt=""></div>
-            <div>
-                <div class="tc-conent"><img src="/static/img/qiye/buneng kaitong@1x.png" alt=""></div>
-                <div class="tc-text">
-                <p>您不是管理员不能修改企业信息</p>
-                </div>
-            </div>
-        </div>
         <span class="Tips" ref="Tips"></span>
         <!-- 企业详细信息 -->
         <div v-if="xiugai">
@@ -19,7 +7,7 @@
                 <div class="qy-title">
                     <span><img @click= "gobick" style="float: left;padding: 20px; cursor:pointer" src="../../../static/img/fanhui.png" alt=""></span>
                     <span>企业基本信息</span>
-                    <span @click="xiugaiqiye" class="qy-xiugai dianji">修改</span>
+                    <span v-if="isxiugaiId" @click="xiugaiqiye" class="qy-xiugai dianji">修改</span>
                 </div>
                 <div class="qy-conent">
                     <ul>
@@ -118,33 +106,50 @@
                 Email: '',
                 mytoken: JSON.parse(localStorage.getItem('app-state-session')),//本地储存的用户信息
                 isId: false,
-                isemail: false,//正则邮箱
+                isemail: true,//正则邮箱
+                isxiugaiId: false
             }
         },
         mounted(){
-
+            //不是管理员隐藏修改按钮
+            if (this.content.adminId == this.mytoken.account.id) {
+                this.isxiugaiId = true;
+            } else {
+                this.isxiugaiId = false
+            }
         },
-        methods: {//修改企业信息
-            xiugaiqiye(){
-                if (this.content.adminId == this.mytoken.account.id) { //如果不是管理员不能修改企业信息
-                    document.documentElement.scrollTop = 0;
-                    this.xiugai = false;
-                } else {
-                    this.isId = true
+        methods: {
+            selects(){
+                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
+                    }
                 }
             },
-            guanbitc(){
-                this.isId = false
+            //修改企业信息
+            xiugaiqiye(){
+                document.documentElement.scrollTop = 0;
+                this.xiugai = false;
+                setTimeout(()=>{
+                    this.selects()
+                },10)
             },
             email(){ //验证邮箱
                 let reg = new RegExp("^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$"); 
                 let email = this.$refs.email.value;//邮箱
-                if (!reg.test(email)) {
-                    this.Email = '请填写正确的邮箱'
-                    this.isemail = false
-                } else {
-                    this.Email = '',
+                if (email == '') {
+                    this.Email = ''
                     this.isemail = true
+                } else {
+                    if (!reg.test(email)) {
+                        this.Email = '请填写正确的邮箱'
+                        this.isemail = false
+                    } else {
+                        this.Email = ''
+                        this.isemail = true
+                    }
                 }
             },
             // 取消修改

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

@@ -22,10 +22,10 @@
 						</ul>
 						<ul>
 							<li><span>产品</span></li>
-							<li><a href="#">u企云服</a></li>
-							<li><a href="https://mall.usoftchina.com/" target="_blank">u软商城</a></li>
-							<li><a href="https://fin.yitoa-fintech.com/" target="_blank">u智融</a></li>
-							<li><a href="https://zb.usoftchina.com/" target="_blank">u创客</a></li>
+							<li><a href="#">U企云服</a></li>
+							<li><a href="https://mall.usoftchina.com/" target="_blank">U软商城</a></li>
+							<li><a href="https://fin.yitoa-fintech.com/" target="_blank">U智融</a></li>
+							<li><a href="https://zb.usoftchina.com/" target="_blank">U创客</a></li>
 						</ul>
 					</div>
 					
@@ -55,8 +55,8 @@
 		<div class="friend-link">
 			<ul>
 				<li><span>常用链接:</span></li>
-				<li><a href="https://uas.usoftchina.com/" target="_blank">uas官网</a></li>
-				<li><a href="https://www.usoftchina.com/" target="_blank">u软云</a></li>
+				<li><a href="https://uas.usoftchina.com/" target="_blank">UAS官网</a></li>
+				<li><a href="https://www.usoftchina.com/" target="_blank">U软云</a></li>
 				<li><a href="http://www.yitoa.com/" target="_blank">英唐官网</a></li>
 			</ul>
 		</div>

+ 2 - 2
frontend/saas-portal-web/static/css/main.css

@@ -308,7 +308,7 @@ main > section {
 /* 首页内容 ..........................................*/
 .my-text {
     position: absolute;
-    top: 76%;
+    top: 64%;
     left: 7%;
 }
 .my-tiyan {
@@ -961,7 +961,7 @@ h1.navbar-brand {
 }
 .slider-1 img{
     width: 100%;
-    /* height: 100%; */
+    height: 100%;
 }
 .sl-slider-wrapper {
     width: 100%;

TEMPAT SAMPAH
frontend/saas-portal-web/static/img/assets/beijing2x.png


TEMPAT SAMPAH
frontend/saas-portal-web/static/img/banner@3x@2x.png


TEMPAT SAMPAH
frontend/saas-portal-web/static/img/logo.png


+ 1 - 0
frontend/saas-portal-web/static/js/mains.js

@@ -123,6 +123,7 @@ $(document).ready(function(){
 
     $(window).resize(function(){
         $('#home-slider, #slider, .sl-slider, .sl-content-wrapper').css('height',slideHeight);
+        $(".slider-1 img").css("height",slideHeight)
     });
     // $(window).resize(function(){'use strict',
     //     $('#home-slider, #slider, .sl-slider, .sl-content-wrapper').css('height',slideHeight);

+ 1 - 0
frontend/saas-web/app/Application.scss

@@ -187,6 +187,7 @@ body.launching {
 
 .x-btn-default-small,
 .x-btn-default-toolbar-small{
+  min-width: 86px !important;
   border-radius: 2px !important;
 }
 

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

@@ -300,6 +300,7 @@ Ext.define('saas.view.core.base.GridPanel', {
                 width:70,
                 dataIndex:'actioncolumn',
                 text:'操作',
+                align: 'center',
                 items: [{
                     tooltip: '编辑',
                     iconCls: 'x-fa fa-pencil fa-fw',

+ 8 - 0
frontend/saas-web/app/view/core/dbfind/DbfindTrigger.js

@@ -18,6 +18,9 @@ Ext.define('saas.view.core.dbfind.DbfindTrigger', {
     },
     //输入值之后进行模糊查询
     doQuery: function(queryString, forceAll, rawQuery) {
+        if(!this.fireEvent('beforequery', this)) {
+            return;
+        };
     	queryString = queryString || '';
     	var me = this;
     	if(me.lastQueryValue!=queryString){
@@ -308,6 +311,11 @@ Ext.define('saas.view.core.dbfind.DbfindTrigger', {
         return true;
     },
 
+    setValue: function(v) {
+        this.callParent(arguments);
+        this.publishState('value', v);
+    },
+
     getValue: function(f) {
         var me = this,val = me.rawToValue(me.processRawValue(me.getRawValue()));
         me.value = val;

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

@@ -438,7 +438,7 @@ Ext.define('saas.view.core.form.FormPanel', {
     isValid: function() {
         var me = this;
         var viewModel = me.getViewModel();
-        var formItems = me.formItems;
+        var formItems = me.formItems || [];
         var valid = !Ext.Array.findBy(formItems, function(f) {
             return !f.isValid();
         });

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

@@ -16,7 +16,9 @@ Ext.define('saas.view.core.form.FormPanelController', {
         var me = this,
         form = me.getView(),
         xtype = form.xtype,
-        _config = form._config,
+        _config = {
+            initId: form.initId,
+        },
         currentTab = saas.util.BaseUtil.getCurrentTab();
         
         var view = {
@@ -60,6 +62,17 @@ Ext.define('saas.view.core.form.FormPanelController', {
         // 单据状态为录入状态(未审核)
         main[form._statusCodeField] = auditTexts.unAuditCode;
         main[form._statusField] = auditTexts.unAuditText;
+        //录入人,录入日期,审核人,审核日期清空
+        main['creatorId'] = null;
+        main['creatorName'] = null;
+        main['createTime'] = null;
+        main['updaterId'] = null;
+        main['updaterName'] = null;
+        main['updateTime'] = null;
+        main[form._auditmanField] = null;
+        main[form._auditdateField] = null;
+
+
 
         for(var k in main) {
             // 主表日期改为当前日期

+ 13 - 14
frontend/saas-web/app/view/core/query/QueryFormPanel.js

@@ -81,20 +81,19 @@ Ext.define('saas.view.core.query.QueryFormPanel', {
             }
         },
         beforerender: function(form) {
-            // var fiels = form.getForm().getFields();
-            // fiels.each(function(f) {
-            //     console.log(f, f.on);
-            //     f.on && f.on({
-            //         keydown: {
-            //             // fn: 'onQuery',
-            //             fn: function(th, e, eOpts) {
-            //                 if(e.keyCode == 13) {
-            //                     form.up('core-query-querypanel').getController().onQuery()
-            //                 }
-            //             }
-            //         }
-            //     });
-            // });
+            var fiels = form.getForm().getFields();
+            fiels.each(function(f) {
+                f.enableKeyEvents = true;
+                f.on && f.on({
+                    keydown: {
+                        fn: function(th, e, eOpts) {
+                            if(e.keyCode == 13) {
+                                form.up('core-query-querypanel').getController().onQuery()
+                            }
+                        }
+                    }
+                });
+            });
         }
     }
 

+ 6 - 1
frontend/saas-web/app/view/core/query/QueryGridPanel.js

@@ -166,7 +166,7 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
             dockedItems: [{
                 xtype: 'toolbar',
                 dock: 'top',
-                hidden: !me.showtool,
+                hidden: me.simpleMode,
                 defaults: { // defaults 将会应用所有的子组件上,而不是父容器
                     listeners: {
                         'mouseover':function(){
@@ -270,6 +270,11 @@ 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 - 1
frontend/saas-web/app/view/core/query/QueryPanel.js

@@ -129,7 +129,7 @@ Ext.define('saas.view.core.query.QueryPanel', {
         }
 
         me.queryGridConfig['columns']=columns;
-        me.queryGridConfig['showtool'] = !me.simpleMode;
+        me.queryGridConfig['simpleMode'] = me.simpleMode;
         Ext.apply(queryGrid,me.queryGridConfig);
     },
 

+ 81 - 43
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -218,24 +218,28 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     type: 'json',
                     // rootProperty: 'data.list',
                     rootProperty: function(data) {
-                        var grid = me.items.items[1],
-                        columns = grid.columns,
-                        summaryData = data.data.calculate || [];
-
-                        Ext.Array.each(columns, function(c) {
-                            var type = c.summaryType,
-                            name = c.dataIndex;
-
-                            var d = Ext.Array.findBy(summaryData, function(s) {
-                                return s.hasOwnProperty(name);
-                            })
-                            if(type && d) {
-                                c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
-                            }else {
-                                c.summaryValue = 0;
-                            }
-                        });
-                        return data.data.list.list;
+                        try {
+                            var grid = me.items.items[1],
+                            columns = grid.columns,
+                            summaryData = data.data.calculate || [];
+    
+                            Ext.Array.each(columns, function(c) {
+                                var type = c.summaryType,
+                                name = c.dataIndex;
+    
+                                var d = Ext.Array.findBy(summaryData, function(s) {
+                                    return s.hasOwnProperty(name);
+                                })
+                                if(type && d) {
+                                    c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
+                                }else {
+                                    c.summaryValue = 0;
+                                }
+                            });
+                            return data.data.list.list;
+                        }catch(e) {
+                            saas.util.BaseUtil.showErrorToast(e.message);
+                        }
                     },
                     totalProperty: 'data.list.total',
                 },
@@ -390,6 +394,22 @@ Ext.define('saas.view.core.report.ReportPanel', {
             if(defaultValue) {
                 viewModel.set('form.' + bind, defaultValue);
             }
+
+            item.enableKeyEvents = true;
+            item.listeners = item.listeners || {};
+            Ext.applyIf(item.listeners, {
+                keydown: {
+                    fn: function(th, e, eOpts) {
+                        if(e.keyCode == 13) {
+                            if(!th.fireEvent('beforequery', th)) {
+                                return;
+                            }else {
+                                me.getController().onQuery()
+                            }
+                        }
+                    }
+                }
+            });
         });
 
         return items;
@@ -397,7 +417,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
 
     getConditions: function() {
         var me = this,
-        formItems = me.searchItems,
+        form = me.down('form'),
+        formItems = form.items.items,
         viewModel = me.getViewModel(),
         viewModelData = viewModel.getData(),
         bindItems = viewModelData['form'],
@@ -419,10 +440,10 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     value: func(value)
                 }
             }else {
-                var xtype = item.xtype || 'textfield',
-                type = item.fieldType || me.getDefaultFieldType(xtype),
-                operation = item.operation || me.getDefaultFieldOperation(xtype),
-                conditionValue = me.getConditionValue(xtype, value);
+                // var xtype = item.xtype || 'textfield',
+                type = item.fieldType || me.getDefaultFieldType(item),
+                operation = item.operation || me.getDefaultFieldOperation(item),
+                conditionValue = me.getConditionValue(item, value);
     
                 if(!conditionValue) {
                     continue;
@@ -440,14 +461,16 @@ Ext.define('saas.view.core.report.ReportPanel', {
         return conditions;
     },
 
-    getDefaultFieldType: function(xtype) {
-        var type;
+    getDefaultFieldType: function(field) {
+        var me = this,
+        xtypes = field.getXTypes().split('/'),
+        type;
 
-        if(Ext.Array.contains(['numberfield'], xtype)) {
+        if(me.isContainsAny(xtypes, ['numberfield'])) {
             type = 'number';
-        }else if(Ext.Array.contains(['datefield', 'condatefield'], xtype)) {
+        }else if(me.isContainsAny(xtypes, ['datefield', 'condatefield'])) {
             type = 'date';
-        }else if(Ext.Array.contains(['combobox', 'multicombo', 'combo', 'radiofield', 'radio'], xtype)) {
+        }else if(me.isContainsAny(xtypes, ['combobox', 'multicombo', 'combo', 'radiofield', 'radio'])) {
             type = 'enum';
         }else {
             type = 'string';
@@ -456,16 +479,29 @@ Ext.define('saas.view.core.report.ReportPanel', {
         return type;
     },
 
-    getDefaultFieldOperation: function(xtype) {
-        var operation;
+    /**
+     * 只要arr1和arr2中存在相同项即返回真
+     */
+    isContainsAny: function(arr1, arr2) {
+        for(var i = 0; i < arr2.length; i++) {
+            var a2 = arr2[i];
+            if(!!arr1.find(function(a1) {return a1==a2})) {
+                return true;
+            }
+        }
+        return false;
+    },
+
+    getDefaultFieldOperation: function(field) {
+        var me = this,
+        xtypes = field.getXTypes().split('/'),
+        operation;
 
-        if(Ext.Array.contains(['numberfield'], xtype)) {
-            operation = '=';
-        }else if(Ext.Array.contains(['datefield'], xtype)) {
+        if(me.isContainsAny(xtypes, ['numberfield', 'datefield', 'dbfindtrigger'])) {
             operation = '=';
-        }else if(Ext.Array.contains(['condatefield'], xtype)) {
+        }else if(me.isContainsAny(xtypes, ['condatefield'])) {
             operation = 'between';
-        }else if(Ext.Array.contains(['combobox', 'multicombo', 'combo'], xtype)) {
+        }else if(me.isContainsAny(xtypes, ['multidbfindtrigger', 'combobox', 'multicombo', 'combo'])) {
             operation = 'in';
         }else {
             operation = 'like';
@@ -477,21 +513,23 @@ Ext.define('saas.view.core.report.ReportPanel', {
     /**
      * 处理部分字段值
      */
-    getConditionValue: function(xtype, value) {
-        var conditionValue;
-        if(xtype == 'datefield') {
+    getConditionValue: function(field, value) {
+        var me = this,
+        xtypes = field.getXTypes().split('/'),
+        conditionValue;
+        if(me.isContainsAny(xtypes, ['datefield'])) {
             conditionValue = Ext.Date.format(new Date(from), 'Y-m-d H:i:s');
-        }else if(xtype == 'condatefield') {
+        }else if(me.isContainsAny(xtypes, ['condatefield'])) {
             var from = value.from,
             to = value.to;
 
             conditionValue = Ext.Date.format(new Date(from), 'Y-m-d 00:00:00') + ',' + Ext.Date.format(new Date(to), 'Y-m-d 23:59:59');
-        }else if(xtype == 'combobox' || xtype == 'combo') {
+        }else if(me.isContainsAny(xtypes, ['combobox', 'combo'])) {
             conditionValue = '\'' + value + '\'';
-        }else if(xtype == 'multicombo') {
-            conditionValue = value.map(function(v) {
+        }else if(me.isContainsAny(xtypes, ['multicombo'])) {
+            conditionValue = value.map ? value.map(function(v) {
                 return '\'' + v.value + '\'';
-            }).join(',');
+            }).join(',') : '';
         }else {
             conditionValue = value;
         }

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

@@ -45,9 +45,21 @@ Ext.define('saas.view.core.report.ReportPanelController', {
         });
     },
     printHtml: function(html){
-        var d = window.open("", "print");
-        d.document.write(html);
-        d.document.close();
-        d.print();
+        var iframe=document.getElementById("saas-print-iframe");
+        if(!iframe){
+            iframe = document.createElement('IFRAME');
+            var doc = null;
+            iframe.setAttribute("id", "saas-print-iframe");
+            iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
+            document.body.appendChild(iframe);
+            doc = iframe.contentWindow.document;
+            doc.write(html);
+            doc.close();
+            iframe.contentWindow.focus();
+        }
+        iframe.contentWindow.print();
+        if (navigator.userAgent.indexOf("MSIE") > 0){
+            document.body.removeChild(iframe);
+        }
     },
 });

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

@@ -160,7 +160,8 @@ Ext.define('saas.view.document.bom.FormPanel', {
                 editor : {
                     xtype : "numberfield",
                     decimalPrecision: 0,
-                    minValue:0
+                    minValue:0,
+                    maxLength: 10
                 },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');

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

@@ -159,7 +159,7 @@ Ext.define('saas.view.document.customer.FormPanel', {
         name : "cu_sellername", 
         fieldLabel : "业务员", 
         editable:false,
-        allowBlank : true, 
+        allowBlank : false, 
         columnWidth : 0.25
     },{
         xtype : "hidden", 

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

@@ -39,31 +39,31 @@ Ext.define('saas.view.home.InfoCard', {
         Ext.apply(me, {
             cards: {
                 unship: {
-                    title: '未出货销售订单',
+                    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)'
                 },
                 unstorage: {
-                    title: '未入库采购订单',
+                    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)'
                 },
                 unpay: {
-                    title: '未付款验收单',
+                    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)'
                 },
                 unreceive: {
-                    title: '未收款出货',
+                    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)'
                 },
                 unauditcheck: {
-                    title: '未审核验收',
+                    title: '未审核验收',
                     color: 'blue',
                     viewType: 'purchase-purchasein-querypanel',
                     condition: 'pi_statuscode<>\'AUDITED\' and pi_class=\'采购验收单\' and prodinout.companyId=' + companyId
@@ -71,7 +71,7 @@ Ext.define('saas.view.home.InfoCard', {
                 unauditship: {
                     title: '未审核出货',
                     color: 'default',
-                    viewType: 'purchase-purchasein-querypanel',
+                    viewType: 'sale-saleout-querypanel',
                     condition: 'pi_statuscode<>\'AUDITED\' and pi_class=\'出货单\' and prodinout.companyId=' + companyId
                 }
             },

+ 1 - 0
frontend/saas-web/app/view/home/InfoCard.scss

@@ -31,6 +31,7 @@ $max-card-width: 235px;
                         }
 
                         h3 {
+                            text-align: center;
                             font-size: 16px;
                         }
             

+ 10 - 2
frontend/saas-web/app/view/home/charts/SaleTrend.js

@@ -67,7 +67,7 @@ Ext.define('saas.view.home.charts.SaleTrend', {
                 }],
                 series: [{
                     type: 'line',
-                    smooth: true,
+                    // smooth: true,
                     title: '销售额',
                     xField: 'x',
                     yField: 'sale',
@@ -100,7 +100,7 @@ Ext.define('saas.view.home.charts.SaleTrend', {
                     // renderer: me.onSeriesRenderer
                 }, {
                     type: 'line',
-                    smooth: true,
+                    // smooth: true,
                     title: '销售回款',
                     xField: 'x',
                     yField: 'saleback',
@@ -131,6 +131,14 @@ Ext.define('saas.view.home.charts.SaleTrend', {
                         fillOpacity: 0.1,
                     },
                 }],
+                legend: {
+                    type: 'dom',
+                    docked: 'top',
+                    padding: 0,
+                    bodyPadding: 0,
+                    border: 0,
+                    cls: 'x-monthio-legend'
+                },
                 listeners: {
                     itemhighlightchange: me.itemhighlightchange
                 }

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

@@ -54,9 +54,7 @@ Ext.define('saas.view.main.Main', {
                     },
                     arrowVisible: true,
                     menu: {
-                        items: [{
-                            xtype: 'menuseparator'
-                        }]
+                        items: []
                     }
                 },
                 '->',

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

@@ -94,9 +94,11 @@ Ext.define('saas.view.main.MainController', {
         if (!win) {
              win = Ext.create('Ext.window.Window', {
                 modal: true,
+                draggable: false,
+                resizable: false,
                 id:"feedbackWin",
-                height: '50%',
-                width: '70%',
+                height: 343,
+                width: 756,
                 title: '意见反馈',
                 scrollable: true,
                 constrain: true,

+ 1 - 1
frontend/saas-web/app/view/main/Navigation.scss

@@ -1,5 +1,5 @@
 $nav-font-size: 16px;
-$nav-font-color: #9697AC;
+$nav-font-color: #EEEEF2;
 $nav-font-color-over: #fff;
 
 .x-navpanel {

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

@@ -68,6 +68,7 @@ Ext.define('saas.view.money.fundtransfer.FormPanel', {
                 dataIndex : "ftd_bankname", 
                 xtype : "", 
                 items : null,
+                allowBlank : false,
                 editor : {
                     xtype : "bandinfoDbfindTrigger",
                     displayField : "display", 
@@ -99,6 +100,7 @@ Ext.define('saas.view.money.fundtransfer.FormPanel', {
                 dataIndex : "ftd_inbankname", 
                 xtype : "", 
                 items : null,
+                allowBlank : false,
                 editor : {
                     displayField : "display", 
                     editable : true, 

+ 5 - 1
frontend/saas-web/app/view/money/recBalance/FormPanel.js

@@ -56,7 +56,11 @@ Ext.define('saas.view.money.recBalance.FormPanel', {
         xtype: 'hidden',
         name: 'rb_rbdamount',
         fieldLabel: '本次核销金额'
-    }, {
+    },{
+        xtype: 'hidden',
+        name: 'rb_rdamount',
+        fieldLabel: '本次付款金额',
+    },  {
         xtype: "datefield",
         name: "rb_date",
         fieldLabel: "日期",

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

@@ -11,15 +11,20 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
     listUrl: '/api/money/report/customercheck',
     defaultCondition: null,
     reportTitle: '客户对账单',
-    QueryWidth:0.2,
-    autoLoad:false,
+    QueryWidth: 0.2,
+    autoLoad: false,
     //筛选:客户、日期(必填)
-    searchItems: [ {
+    searchItems: [{
         xtype: 'customerDbfindTrigger',
         name: 'pi_custname',
         fieldLabel: '客户名称',
         columnWidth: 0.2,
-        allowBlank:false,
+        allowBlank: false,
+        listeners: {
+            beforequery: function(f) {
+                return !!f.value;
+            }
+        }
     }, {
         xtype: 'monthdatefield',
         name: 'ym',
@@ -32,141 +37,161 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
         columnWidth: 0.4
     }],
 
-    reportColumns: [
-        {
-            text: 'id',
-            dataIndex: 'pi_id',
-            hidden: true
-        }, {
-            text: '单号',
-            dataIndex: 'pi_inoutno',
-            width: 150
-        }, {
-            text: '单据类型',
-            dataIndex: 'pi_class',
-            width: 110
-        }, {
-            text: '单据日期',
-            dataIndex: 'pi_date',
-            xtype: 'datecolumn',
-            width: 110
-        }, {
-            text: '序号',
-            dataIndex: 'pd_pdno',
-            xtype: 'numbercolumn',
-            width: 80
-        },{
-            text: '物料编号',
-            width: 150,
-            dataIndex: 'pr_code'
-        }, {
-            text: '物料名称',
-            dataIndex: 'pr_detail',
-            width: 200
-        }, {
-            text: '物料规格',
-            dataIndex: 'pr_spec',
-            width: 150
-        }, {
-            text: '单位',
-            dataIndex: 'pd_unit',
-            width: 80
-        }, {
-            text: '数量',
-            xtype: 'numbercolumn',
-            dataIndex: 'qty',
-            xtype: 'numbercolumn',
-            width: 110
-        }, {
-            text: '单价',
-            dataIndex: 'pd_orderprice',
-            xtype: 'numbercolumn',
-            width: 110
-        }, {
-            text: '税率',
-            dataIndex: 'pd_taxrate',
-            xtype: 'numbercolumn',
-            width: 80
-        }, {
-            text: '金额',
-            xtype: 'numbercolumn',
-            width: 110,
-            dataIndex: 'pd_total',
-            xtype: 'numbercolumn',
-            // renderer : function(v) {
-            //     var arr = (v + '.').split('.');
-            //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
-            //     var format = '0,000.' + xr.join();
-            //     return Ext.util.Format.number(v, format);
-            // },
-            // summaryType: 'sum',
-            // summaryRenderer: function(v) {
-            //     var arr = (v + '.').split('.');
-            //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
-            //     var format = '0,000.' + xr.join();
-            //     return Ext.util.Format.number(v, format);
-            // }
-        }, {
-            text: '不含税单价',
-            width: 110,
-            dataIndex: 'pd_netprice',
-            xtype: 'numbercolumn'
-        }, {
-            text: '不含税金额',
-            width: 110,
-            xtype: 'numbercolumn',
-            dataIndex: 'pd_nettotal',
-            xtype: 'numbercolumn',
-            // renderer : function(v) {
-            //     var arr = (v + '.').split('.');
-            //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
-            //     var format = '0,000.' + xr.join();
-            //     return Ext.util.Format.number(v, format);
-            // },
-            // summaryType: 'sum',
-            // summaryRenderer: function(v) {
-            //     var arr = (v + '.').split('.');
-            //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
-            //     var format = '0,000.' + xr.join();
-            //     return Ext.util.Format.number(v, format);
-            // }
-        }, {
-            text: '备注',
-            dataIndex: 'pd_remark',
-            width: 250
-        }, {
-            text: '期初应付',
-            dataIndex: 'beginamount',
-            hidden: true,
-            width: 0,
-            summaryType: 'cus',
-        }, {
-            text: '本期发生',
-            dataIndex: 'nowamount',
-            hidden: true,
-            width: 0,
-            summaryType: 'cus',
-        }, {
-            text: '本期付款',
-            dataIndex: 'nowpay',
-            hidden: true,
-            width: 0,
-            summaryType: 'cus',
-        }, {
-            text: '本期结余',
-            dataIndex: 'nowbalance',
-            hidden: true,
-            width: 0,
-            summaryType: 'cus',
-        }],
-        applyParams: function(p) {
-            var me = this,
+    reportColumns: [{
+        text: 'id',
+        dataIndex: 'pi_id',
+        hidden: true
+    }, {
+        text: '单号',
+        dataIndex: 'pi_inoutno',
+        width: 150
+    }, {
+        text: '单据类型',
+        dataIndex: 'pi_class',
+        width: 110
+    }, {
+        text: '单据日期',
+        dataIndex: 'pi_date',
+        xtype: 'datecolumn',
+        width: 110
+    }, {
+        text: '序号',
+        dataIndex: 'pd_pdno',
+        xtype: 'numbercolumn',
+        width: 80
+    }, {
+        text: '物料编号',
+        width: 150,
+        dataIndex: 'pr_code'
+    }, {
+        text: '物料名称',
+        dataIndex: 'pr_detail',
+        width: 200
+    }, {
+        text: '物料规格',
+        dataIndex: 'pr_spec',
+        width: 150
+    }, {
+        text: '单位',
+        dataIndex: 'pd_unit',
+        width: 80
+    }, {
+        text: '数量',
+        xtype: 'numbercolumn',
+        dataIndex: 'qty',
+        xtype: 'numbercolumn',
+        width: 110
+    }, {
+        text: '单价',
+        dataIndex: 'pd_orderprice',
+        xtype: 'numbercolumn',
+        width: 110
+    }, {
+        text: '税率',
+        dataIndex: 'pd_taxrate',
+        xtype: 'numbercolumn',
+        width: 80
+    }, {
+        text: '金额',
+        xtype: 'numbercolumn',
+        width: 110,
+        dataIndex: 'pd_total',
+        xtype: 'numbercolumn',
+        // renderer : function(v) {
+        //     var arr = (v + '.').split('.');
+        //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+        //     var format = '0,000.' + xr.join();
+        //     return Ext.util.Format.number(v, format);
+        // },
+        // summaryType: 'sum',
+        // summaryRenderer: function(v) {
+        //     var arr = (v + '.').split('.');
+        //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+        //     var format = '0,000.' + xr.join();
+        //     return Ext.util.Format.number(v, format);
+        // }
+    }, {
+        text: '不含税单价',
+        width: 110,
+        dataIndex: 'pd_netprice',
+        xtype: 'numbercolumn'
+    }, {
+        text: '不含税金额',
+        width: 110,
+        xtype: 'numbercolumn',
+        dataIndex: 'pd_nettotal',
+        xtype: 'numbercolumn',
+        // renderer : function(v) {
+        //     var arr = (v + '.').split('.');
+        //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+        //     var format = '0,000.' + xr.join();
+        //     return Ext.util.Format.number(v, format);
+        // },
+        // summaryType: 'sum',
+        // summaryRenderer: function(v) {
+        //     var arr = (v + '.').split('.');
+        //     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+        //     var format = '0,000.' + xr.join();
+        //     return Ext.util.Format.number(v, format);
+        // }
+    }, {
+        text: '备注',
+        dataIndex: 'pd_remark',
+        width: 250
+    }, {
+        text: '期初应付',
+        dataIndex: 'beginamount',
+        hidden: true,
+        width: 0,
+        summaryType: 'cus',
+    }, {
+        text: '本期发生',
+        dataIndex: 'nowamount',
+        hidden: true,
+        width: 0,
+        summaryType: 'cus',
+    }, {
+        text: '本期付款',
+        dataIndex: 'nowpay',
+        hidden: true,
+        width: 0,
+        summaryType: 'cus',
+    }, {
+        text: '本期结余',
+        dataIndex: 'nowbalance',
+        hidden: true,
+        width: 0,
+        summaryType: 'cus',
+    }],
+
+    listeners: {
+        afterrender: function(panel) {
+            panel.setLoadButtonDisabled(true);
+        },
+    },
+
+    setLoadButtonDisabled: function (disabled) {
+        var panel = this,
+            grid = panel.down('grid'),
+            p = grid.down('pagingtoolbar'),
+            bs = p.query('button'),
+            loadButton = Ext.Array.findBy(bs, function (b) {
+                return b.iconCls == 'x-tbar-loading';
+            });
+
+        if (loadButton) {
+            loadButton.setDisabled(disabled);
+        }
+    },
+
+    applyParams: function (p) {
+        var me = this,
             viewModel = me.getViewModel(),
             formData = viewModel.get('form'),
             ym = formData.ym;
-    
-            return Ext.Object.merge(p, {
-                ym: ym
-            });
-        }
+
+        return Ext.Object.merge(p, {
+            ym: ym
+        });
+    }
 });

+ 13 - 1
frontend/saas-web/app/view/money/report/CustomerCheckModel.js

@@ -1,4 +1,16 @@
 Ext.define('saas.view.money.report.CustomerCheckModel', {
     extend: 'saas.view.core.report.ReportPanelModel',
-    alias: 'viewmodel.money-report-customercheck'
+    alias: 'viewmodel.money-report-customercheck',
+
+    formulas: {
+        pi_custname_change: {
+            bind: '{form.pi_custname}',
+            get: function(v) {
+                var me = this,
+                panel = me.getView();
+
+                panel.setLoadButtonDisabled(!v);
+            }
+        }
+    }
 });

+ 26 - 0
frontend/saas-web/app/view/money/report/VendorCheck.js

@@ -20,6 +20,11 @@ Ext.define('saas.view.money.report.VendorCheck', {
         fieldLabel: '供应商名称',
         columnWidth: 0.2,
         allowBlank:false,
+        listeners: {
+            beforequery: function(f) {
+                return !!f.value;
+            }
+        }
     }, {
         xtype: 'monthdatefield',
         name: 'ym',
@@ -164,6 +169,27 @@ Ext.define('saas.view.money.report.VendorCheck', {
         width: 0,
         summaryType: 'cus',
     }],
+
+    listeners: {
+        afterrender: function(panel) {
+            panel.setLoadButtonDisabled(true);
+        },
+    },
+
+    setLoadButtonDisabled: function (disabled) {
+        var panel = this,
+            grid = panel.down('grid'),
+            p = grid.down('pagingtoolbar'),
+            bs = p.query('button'),
+            loadButton = Ext.Array.findBy(bs, function (b) {
+                return b.iconCls == 'x-tbar-loading';
+            });
+
+        if (loadButton) {
+            loadButton.setDisabled(disabled);
+        }
+    },
+
     applyParams: function(p) {
         var me = this,
         viewModel = me.getViewModel(),

+ 14 - 1
frontend/saas-web/app/view/money/report/VendorCheckModel.js

@@ -1,4 +1,17 @@
 Ext.define('saas.view.money.report.VendorCheckModel', {
     extend: 'saas.view.core.report.ReportPanelModel',
-    alias: 'viewmodel.money-report-vendorcheck'
+    alias: 'viewmodel.money-report-vendorcheck',
+
+    formulas: {
+        pi_vendname_change: {
+            bind: '{form.pi_vendname}',
+            get: function(v) {
+                var me = this,
+                panel = me.getView();
+
+                panel.setLoadButtonDisabled(!v);
+            }
+        }
+    }
+
 });

+ 21 - 9
frontend/saas-web/app/view/money/verification/FormPanel.js

@@ -590,18 +590,30 @@ Ext.define('saas.view.money.verification.FormPanel', {
         },
 
         defaultConditions: {
-            receipts_offset_receivable: ['ifnull(sl_custid,0)={vc_custid} and ifnull(sl_preamount,0)<>0 and ifnull(sl_namount,0)<>0',
+            receipts_offset_receivable: ['ifnull(sl_custid,0)={vc_custid} and ifnull(sl_preamount,0)<>0 and ifnull(sl_namount,0)<>0 ' +
+            ' and ((sl_kind=\'收款单\') or (sl_kind=\'期初余额\' and sl_ym=' +
+            '(select min(pd_detno) from periodsdetail  where pd_status=0 and periodsdetail.companyid=subledger.companyid)))',
                 'ifnull(sl_custid,0)={vc_custid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0 ' +
-                'and sl_kind in (\'期初余额\',\'出货单\',\'销售退货单\')'],
-            prepaid_offset_payable: ['ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)<>0 and ifnull(sl_namount,0)<>0',
+                ' and (sl_kind in (\'出货单\',\'销售退货单\') or (sl_kind in (\'期初余额\') and sl_ym=' +
+                '(select min(pd_detno) from periodsdetail where pd_status=0 and periodsdetail.companyid=subledger.companyid)))'],
+            prepaid_offset_payable: ['ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)<>0 and ifnull(sl_namount,0)<>0 ' +
+            ' and ((sl_kind=\'付款单\') or (sl_kind=\'期初余额\' and sl_ym=' +
+            '(select min(pd_detno) from periodsdetail  where pd_status=0 and periodsdetail.companyid=subledger.companyid)))',
                 'ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0' +
-                'and sl_kind in (\'期初余额\',\'采购验收单\',\'采购验退单\')'],
-            receivable_offset_payable: ['ifnull(sl_custid,0)={vc_custid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0',
-                'ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0'],
+                ' and (sl_kind in (\'采购验收单\',\'采购验退单\') or (sl_kind in (\'期初余额\') and sl_ym=' +
+                '(select min(pd_detno) from periodsdetail where pd_status=0 and periodsdetail.companyid=subledger.companyid)))'],
+            receivable_offset_payable: ['ifnull(sl_custid,0)={vc_custid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0 ' +
+            ' and ((sl_kind in (\'出货单\',\'销售退货单\')) or (sl_kind=\'期初余额\' and sl_ym=' +
+            '(select min(pd_detno) from periodsdetail  where pd_status=0 and periodsdetail.companyid=subledger.companyid)))',
+                'ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0' +
+                ' and (sl_kind in (\'采购验收单\',\'采购验退单\') or (sl_kind in (\'期初余额\') and sl_ym=' +
+                '(select min(pd_detno) from periodsdetail where pd_status=0 and periodsdetail.companyid=subledger.companyid)))'],
             receivable_to_receivable: ['ifnull(sl_custid,0)={vc_custid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0 ' +
-            'and sl_kind in (\'期初余额\',\'出货单\',\'销售退货单\')'],
-            payable_to_payable: ['ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0 ' +
-            'and sl_kind in (\'期初余额\',\'采购验收单\',\'采购验退单\')']
+            ' and ((sl_kind in (\'出货单\',\'销售退货单\')) or (sl_kind=\'期初余额\' and sl_ym=' +
+            '(select min(pd_detno) from periodsdetail  where pd_status=0 and periodsdetail.companyid=subledger.companyid)))'],
+            payable_to_payable: ['ifnull(sl_vendid,0)={vc_vendid} and ifnull(sl_preamount,0)=0 and ifnull(sl_namount,0)<>0' +
+            ' and (sl_kind in (\'采购验收单\',\'采购验退单\') or (sl_kind in (\'期初余额\') and sl_ym=' +
+            '(select min(pd_detno) from periodsdetail where pd_status=0 and periodsdetail.companyid=subledger.companyid)))']
         }
     },
 

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

@@ -14,8 +14,9 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
      _codeField: 'pu_code',
      _statusField: 'pu_status',
      _statusCodeField: 'pu_statuscode',
+     _auditmanField: 'pu_auditman',
+     _auditdateField:'pu_auditdate',
      _relationColumn: 'pd_puid',
-
      _readUrl:'/api/purchase/purchase/read',
      _saveUrl:'/api/purchase/purchase/save',
      _auditUrl:'/api/purchase/purchase/audit',
@@ -239,11 +240,11 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -263,11 +264,11 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_taxtotal", 
                 width : 110.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 12 - 11
frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js

@@ -14,7 +14,8 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
     _codeField: 'pi_inoutno',
     _statusField: 'pi_status',
     _statusCodeField: 'pi_statuscode',
-    
+    _auditmanField: 'pi_auditman',
+    _auditdateField:'pi_auditdate',
     _relationColumn: 'pd_piid',
     _readUrl:'/api/purchase/prodinout/read',
     _saveUrl:'/api/purchase/prodinout/save',
@@ -267,11 +268,11 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -291,11 +292,11 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_nettotal", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 9 - 0
frontend/saas-web/app/view/purchase/purchaseIn/FormPanelController.js

@@ -110,6 +110,15 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanelController', {
         // 单据状态为录入状态(未审核)
         main[form._statusCodeField] = auditTexts.unAuditCode;
         main[form._statusField] = auditTexts.unAuditText;
+        //录入人,录入日期,审核人,审核日期清空
+        main['creatorId'] = null;
+        main['creatorName'] = null;
+        main['createTime'] = null;
+        main['updaterId'] = null;
+        main['updaterName'] = null;
+        main['updateTime'] = null;
+        main[form._auditmanField] = null;
+        main[form._auditdateField] = null;
 
         for(var k in main) {
             // 主表日期改为当前日期

+ 12 - 11
frontend/saas-web/app/view/purchase/purchaseOut/FormPanel.js

@@ -14,7 +14,8 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanel', {
     _codeField: 'pi_inoutno',
     _statusField: 'pi_status',
     _statusCodeField: 'pi_statuscode',
-    
+    _auditmanField: 'pi_auditman',
+    _auditdateField:'pi_auditdate',
     _relationColumn: 'pd_piid',
     _readUrl:'/api/purchase/prodinout/read',
     _saveUrl:'/api/purchase/prodinout/save',
@@ -254,11 +255,11 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -278,11 +279,11 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_nettotal", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable : false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable : false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 9 - 0
frontend/saas-web/app/view/purchase/purchaseOut/FormPanelController.js

@@ -112,6 +112,15 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanelController', {
         // 单据状态为录入状态(未审核)
         main[form._statusCodeField] = auditTexts.unAuditCode;
         main[form._statusField] = auditTexts.unAuditText;
+        //录入人,录入日期,审核人,审核日期清空
+        main['creatorId'] = null;
+        main['creatorName'] = null;
+        main['createTime'] = null;
+        main['updaterId'] = null;
+        main['updaterName'] = null;
+        main['updateTime'] = null;
+        main[form._auditmanField] = null;
+        main[form._auditdateField] = null;
 
         for(var k in main) {
             // 主表日期改为当前日期

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

@@ -172,6 +172,10 @@ Ext.define('saas.view.sale.saleout.QueryPanel', {
             text: '物料编号',
             dataIndex: 'pd_prodcode',
             width: 150
+        }, {
+            text: '物料名称',
+            dataIndex: 'pr_detail',
+            width: 150
         }, {
             text: '出货数量',
             dataIndex: 'pd_outqty',

+ 3 - 1
frontend/saas-web/app/view/stock/make/FormPanel.js

@@ -14,6 +14,8 @@ Ext.define('saas.view.stock.make.FormPanel', {
      _codeField: 'ma_code',
      _statusField: 'ma_status',
      _statusCodeField: 'ma_statuscode',
+     _auditmanField: 'ma_auditman',
+     _auditdateField:'ma_auditdate',
      _relationColumn: 'mm_maid',
 
      _readUrl:'/api/storage/make/read',
@@ -293,7 +295,7 @@ Ext.define('saas.view.stock.make.FormPanel', {
                     minValue:0
                 },
                 listeners:{
-                    // edit:'price_change'
+                    edit:'price_change'
                 },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');

+ 96 - 45
frontend/saas-web/app/view/stock/make/FormPanelController.js

@@ -79,56 +79,107 @@ Ext.define('saas.view.stock.make.FormPanelController', {
 
         });
     },
+    initCopyData: function(formData) {
+        var me = this;
+        var form = this.getView();
+        var detailCount = form.detailCount;
+        var main = formData.main;
+        var auditTexts = form.auditTexts;
 
+        // 单号、id清空
+        main[form._idField] = 0;
+        main[form._codeField] = '';
+        // 单据状态为录入状态(未审核)
+        main[form._statusCodeField] = auditTexts.unAuditCode;
+        main[form._statusField] = auditTexts.unAuditText;
+        //录入人,录入日期,审核人,审核日期清空
+        main['creatorId'] = null;
+        main['creatorName'] = null;
+        main['createTime'] = null;
+        main['updaterId'] = null;
+        main['updaterName'] = null;
+        main['updateTime'] = null;
+        main[form._auditmanField] = null;
+        main[form._auditdateField] = null;
+        //数量,单价,金额(主表)
+        main['ma_qty'] = 0;
+        main['ma_price'] = 0;
+        main['ma_total'] = 0;
+        for(var k in main) {
+            // 主表日期改为当前日期
+            if(saas.util.BaseUtil.isDateString(main[k])) {
+                main[k] = Ext.Date.format(new Date, 'Y-m-d H:i:s');
+            }
+        }
 
-    // price_change:function() {
-    //     var me = this,
-    //     viewModel = me.getViewModel(),
-    //     store = viewModel.get('detail0').detailStore;
-    //     var sum_qty = store.sum('mm_price');
-    //     viewModel.set('ma_price',sum_qty);
-    // },
-
+        for(var j = 0; j < detailCount; j++) {
+            var detail = formData['detail' + j];
+            for(var x = 0; x < detail.length; x ++) {
+                var d = detail[x];
 
-     getBomData: function(v) {
+                for(var k in d) {
+                    // 从表id清空
+                    delete d['id'];
+                    delete d['mm_price'];
+                    delete d['mm_qty'];
+                    delete d['mm_amount'];
+                    // 从表日期清空
+                    if(saas.util.BaseUtil.isDateString(d[k])) {
+                        d[k] = '';
+                    }
+                }
+            }
+        }
+        return me.myInitCopyData(formData);;
+    },
+    price_change:function(v) {
         var me = this,
-        form = me.getView(),
         viewModel = me.getViewModel(),
         store = viewModel.get('detail0').detailStore,
-        type = viewModel.get('ma_type'),
-        loadData = new Array();
+        type = viewModel.get('ma_type');
+        if('拆件'==type && v==0){
+            saas.util.BaseUtil.showErrorToast('成本单价为0!');
+        }
+    },
+    getBomData: function(v) {
+    var me = this,
+    form = me.getView(),
+    viewModel = me.getViewModel(),
+    store = viewModel.get('detail0').detailStore,
+    type = viewModel.get('ma_type'),
+    loadData = new Array();
 
-        //请求bom资料
-        saas.util.BaseUtil.request({
-            url: form._getBomUrl+'/'+v,
-            method: 'GET',
-        })
-        .then(function(localJson) {
-            if(localJson.success){
-                var data = localJson.data.items;
-                Ext.Array.each(data, function(item, i) {
-                    loadData.push({
-                        mm_detno:item.bd_detno,
-                        mm_prodid:item.productDTO.id,
-                        mm_prodcode:item.productDTO.pr_code,
-                        mm_oneuseqty:item.bd_baseqty,
-                        pr_detail:item.productDTO.pr_detail,
-                        pr_spec:item.productDTO.pr_spec,
-                        pr_unit:item.productDTO.pr_unit,
-                        mm_repprodcode:item.bd_replace,
-                        mm_remark:item.bd_remark,                        
-                        mm_whid:item.productDTO.pr_whid,                        
-                        mm_whcode:item.productDTO.pr_whcode,
-                        mm_whname:item.productDTO.pr_whname,
-                        mm_price:type=='拆件'?item.productDTO.pr_purcprice:null
-                    })                
-                });
-                store.loadData(loadData);
-            }
-        })
-        .catch(function(res) {
-            console.error(res);
-            saas.util.BaseUtil.showErrorToast('获取BOM资料失败: ' + res.message);
-        });
-     }
+    //请求bom资料
+    saas.util.BaseUtil.request({
+        url: form._getBomUrl+'/'+v,
+        method: 'GET',
+    })
+    .then(function(localJson) {
+        if(localJson.success){
+            var data = localJson.data.items;
+            Ext.Array.each(data, function(item, i) {
+                loadData.push({
+                    mm_detno:item.bd_detno,
+                    mm_prodid:item.productDTO.id,
+                    mm_prodcode:item.productDTO.pr_code,
+                    mm_oneuseqty:item.bd_baseqty,
+                    pr_detail:item.productDTO.pr_detail,
+                    pr_spec:item.productDTO.pr_spec,
+                    pr_unit:item.productDTO.pr_unit,
+                    mm_repprodcode:item.bd_replace,
+                    mm_remark:item.bd_remark,                        
+                    mm_whid:item.productDTO.pr_whid,                        
+                    mm_whcode:item.productDTO.pr_whcode,
+                    mm_whname:item.productDTO.pr_whname,
+                    mm_price:type=='拆件'?item.productDTO.pr_purcprice:null
+                })                
+            });
+            store.loadData(loadData);
+        }
+    })
+    .catch(function(res) {
+        console.error(res);
+        saas.util.BaseUtil.showErrorToast('获取BOM资料失败: ' + res.message);
+    });
+    }
 });

+ 12 - 11
frontend/saas-web/app/view/stock/otherIn/FormPanel.js

@@ -15,7 +15,8 @@ Ext.define('saas.view.stock.otherIn.FormPanel', {
     _codeField: 'pi_inoutno',
     _statusField: 'pi_status',
     _statusCodeField: 'pi_statuscode',
-    
+    _auditmanField: 'pi_auditman',
+    _auditdateField:'pi_auditdate',
     _relationColumn: 'pd_piid',
     _readUrl:'/api/storage/prodinout/read',
     _saveUrl:'/api/storage/prodinout/save',
@@ -232,11 +233,11 @@ Ext.define('saas.view.stock.otherIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_total", 
                 width : 110.0,
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable:false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable:false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
@@ -270,11 +271,11 @@ Ext.define('saas.view.stock.otherIn.FormPanel', {
                 xtype: 'numbercolumn',
                 dataIndex : "pd_nettotal", 
                 width : 110.0, 
-                editor : {
-                    xtype : "numberfield",
-                    decimalPrecision: 2,
-                    editable:false
-                },
+                // editor : {
+                //     xtype : "numberfield",
+                //     decimalPrecision: 2,
+                //     editable:false
+                // },
                 renderer : function(v) {
                     var arr = (v + '.').split('.');
                     var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');

+ 1 - 41
frontend/saas-web/app/view/stock/otherIn/FormPanelController.js

@@ -82,45 +82,5 @@ Ext.define('saas.view.stock.otherIn.FormPanelController', {
                 },
             },
         });
-    },
-    initCopyData: function(formData) {
-        var me = this;
-        var form = this.getView();
-        var detailCount = form.detailCount;
-        var main = formData.main;
-        var auditTexts = form.auditTexts;
-
-        // 单号、id清空
-        main[form._idField] = 0;
-        main[form._codeField] = '';
-
-        // 单据状态为录入状态(未审核)
-        main[form._statusCodeField] = auditTexts.unAuditCode;
-        main[form._statusField] = auditTexts.unAuditText;
-        main['pi_auditman'] = '';
-        main['pi_auditdate'] = null;
-        for(var k in main) {
-            // 主表日期改为当前日期
-            if(saas.util.BaseUtil.isDateString(main[k])) {
-                main[k] = Ext.Date.format(new Date, 'Y-m-d H:i:s');
-            }
-        }
-
-        for(var j = 0; j < detailCount; j++) {
-            var detail = formData['detail' + j];
-            for(var x = 0; x < detail.length; x ++) {
-                var d = detail[x];
-
-                for(var k in d) {
-                    // 从表id清空
-                    delete d['id'];
-                    // 从表日期清空
-                    if(saas.util.BaseUtil.isDateString(d[k])) {
-                        d[k] = '';
-                    }
-                }
-            }
-        }
-        return me.myInitCopyData(formData);;
-    }    
+    }
 });

+ 2 - 1
frontend/saas-web/app/view/stock/otherOut/FormPanel.js

@@ -14,7 +14,8 @@ Ext.define('saas.view.stock.otherOut.FormPanel', {
     _codeField: 'pi_inoutno',
     _statusField: 'pi_status',
     _statusCodeField: 'pi_statuscode',
-
+    _auditmanField: 'pi_auditman',
+    _auditdateField:'pi_auditdate',
     _relationColumn: 'pd_piid',
     _readUrl: '/api/storage/prodinout/read',
     _saveUrl: '/api/storage/prodinout/save',

+ 1 - 41
frontend/saas-web/app/view/stock/otherOut/FormPanelController.js

@@ -103,45 +103,5 @@ Ext.define('saas.view.stock.otherOut.FormPanelController', {
             renderTo: this.ownerCmp.ownerCt.getEl()
         }).show();
 
-    },
-    initCopyData: function(formData) {
-        var me = this;
-        var form = this.getView();
-        var detailCount = form.detailCount;
-        var main = formData.main;
-        var auditTexts = form.auditTexts;
-
-        // 单号、id清空
-        main[form._idField] = 0;
-        main[form._codeField] = '';
-
-        // 单据状态为录入状态(未审核)
-        main[form._statusCodeField] = auditTexts.unAuditCode;
-        main[form._statusField] = auditTexts.unAuditText;
-        main['pi_auditman'] = '';
-        main['pi_auditdate'] = null;
-        for(var k in main) {
-            // 主表日期改为当前日期
-            if(saas.util.BaseUtil.isDateString(main[k])) {
-                main[k] = Ext.Date.format(new Date, 'Y-m-d H:i:s');
-            }
-        }
-
-        for(var j = 0; j < detailCount; j++) {
-            var detail = formData['detail' + j];
-            for(var x = 0; x < detail.length; x ++) {
-                var d = detail[x];
-
-                for(var k in d) {
-                    // 从表id清空
-                    delete d['id'];
-                    // 从表日期清空
-                    if(saas.util.BaseUtil.isDateString(d[k])) {
-                        d[k] = '';
-                    }
-                }
-            }
-        }
-        return me.myInitCopyData(formData);;
-    }     
+    }
 });

+ 10 - 5
frontend/saas-web/app/view/sys/feedback/FormPanel.js

@@ -1,5 +1,5 @@
 Ext.define('saas.view.sys.feedback.FormPanel', {
-    extend: 'Ext.panel.Panel',
+    extend: 'Ext.form.Panel',
     xtype: 'sys-feedback-formpanel',
 
     controller: 'sys-feedback-formpanel',
@@ -12,12 +12,12 @@ Ext.define('saas.view.sys.feedback.FormPanel', {
     autoScroll: true,
 
     fieldDefaults: {
-        margin: '0 0 10 0',
+        margin: '0 0 16 0',
         labelAlign: 'right',
         labelWidth: 70,
         columnWidth: 0.5,
     },
-    bodyPadding: 10,
+    bodyPadding: '0 30 0 30',
     border: false,
     initComponent: function () {
         var me = this;
@@ -47,16 +47,21 @@ Ext.define('saas.view.sys.feedback.FormPanel', {
             name : "fb_wechat", 
             fieldLabel : "微信"
         }, {
-            xtype : "textfield", 
+            xtype : "textareafield", 
             name : "fb_msg", 
             fieldLabel : "反馈内容",
-            columnWidth: 1
+            columnWidth: 1,
+            height: 63,
+            maxHeight: 63
         }];
+        me.buttonAlign = 'center';
         me.buttons = [{
             text: '提交',
+            margin: '0 20 0 20',
             handler:'onSubmit'
         },{
             text: '关闭',
+            margin: '0 20 0 20',
             handler:'onClose'
         }];
         me.callParent(arguments);

+ 47 - 0
frontend/saas-web/app/view/sys/feedback/FormPanel.scss

@@ -0,0 +1,47 @@
+#feedbackWin {
+    border: none;
+    border-radius: 4px;
+
+    .x-window-header {
+        padding: 30px 45px 20px 45px;
+        background: #fff;
+        border: none;
+
+        .x-window-header-title-default {
+            .x-title-text {
+                color: #34BAF6;
+                font-size: 16px;
+                font-weight: 500;
+                letter-spacing: 1.8px;
+                padding-left: 10px;
+
+                &:before {
+                    content: ' ';
+                    position: absolute;
+                    width: 5px;
+                    height: 16px;
+                    background: #34baf6;
+                    left: 0;
+                    top: 2px;
+                    border-radius: 4px;
+                }
+            }
+        }
+
+        .x-tool-default {
+            
+            .x-tool-close {
+                color:  #34BAF6;
+            }
+        }
+    }
+
+    .x-window-bodyWrap {
+        
+        .x-toolbar-footer {
+            padding: 0;
+            top: 210px !important;
+            background: #fff;
+        }
+    }
+}